作为大多数 Arduino 玩家,我是从 Arduino Uno 开始的。很快我收集了很多盾牌。为了驱动这些屏蔽,我使用了各种库,它们占用了所有的内存空间。
所以我搬到了 Arduino Mega 并获得了很多乐趣,直到我开始从事一些更复杂的项目,比如玩显示器和声音。
最近,我再次将我的武器升级到 Arduino Due,它与我以前的板 (AVR) 具有完全不同的架构 (ARM Cortex-M)。毫无疑问,具有“巨大”内存空间和更高时钟速度的 32 位内核是一种强大的武器。但是,要充分利用电源,使用简单的“循环”功能可能还不够。这就是Arduino RT-Thread 库项目想要解决的问题。
RT-Thread是一个免费的开源(Apache 许可证 2.0)RTOS。一些独特的功能,如微型外壳(名为 FinSH)、动态加载模块和大量设备驱动程序,使其非常有趣。尽管最重要的特点是它有一个非常活跃的社区。
该库托管在Github上,可以通过“Library Manager”安装。
目前,有两个可用的示例也列在“代码”部分。(稍后将提供更多示例。)
第一个示例“ Blink ”显示了如何创建和启动名为“Blink”的线程。“闪烁”线程的任务是以 1 秒的间隔闪烁内置 LED。
第二个示例“ FinSH ”显示了如何将用户定义的变量和命令添加到小 shell。有两个用户变量led_id
,led_state
并实现了一个用户命令led()
。
FinSH,小外壳接受 C 风格的输入(例如hello()
),支持自动完成(例如 type lis[Tab]
)和历史记录(在发出几个命令后 try type↑
和↓
)。
它提供了以下预定义命令。
hello()
:打印“Hello RT-Thread!”version()
:打印版本信息list()
: 打印可用命令列表list_mem()
:打印内存信息list_thread()
:打印线程信息list_sem()
:打印信号量信息list_mutex()
:打印互斥量信息list_event()
:打印事件信息list_mb()
:打印邮箱信息list_mq()
:打印消息队列信息list_memp()
:打印内存池信息list_timer()
: 打印定时器信息您可以通过两步添加自己的命令。
void
”或任何类型。建议返回一个带有“ char
”、“ byte
”、“ short
”、“ unsigned short
”、“ int
”或“ unsigned int
”类型的值,因为这些类型可以被 FinSH 很好地解释。参数没有限制。(但是,FinSH 命令长度确实有限制,默认为 80 个字符。)所以任何数字和任何类型都可以。ADD_SHELL_CMD(
command_name, command description, function_name, return_type, parameter list
)
shell_cmd.h
以下是添加用户命令的示例。
led()
。
unsigned int led(unsigned int id, byte state) {
// use "rt_kprintf()" to print a message
rt_kprintf("led%d=%d\n", id, state);
if (id != 0) {
return 1;
}
if (state) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
return 0;
}
shell_cmd.h
。
ADD_SHELL_CMD(led, Turn on/off builtin LED, led, unsigned int, unsigned int id, rt_int32_t val)
在上面的示例中,命令名称和函数名称是相同的。但是,它们可以不同。然后命令名成为函数名的别名。向 FinSH 发出命令时,应使用命令名称。
您也可以通过类似的步骤添加自己的变量。
char
”、“ byte
”、“ char*
”、“ short
”、“ unsigned short
”、“ short*
”、“ int
”、“ unsigned int
”、“ int*
”和“ void*
”。ADD_SHELL_VAR(variable_alias, variable description, variable_name, variable_type)
宏的行shell_var.h
。这里对应的变量类型是“ finsh_type_char
”、“ finsh_type_uchar
”、“ finsh_type_charp
”、“ finsh_type_short
”、“ finsh_type_ushort
”、“ finsh_type_shortp
”、“ finsh_type_int
”、“ finsh_type_uint
”、“ finsh_type_intp
”和“ finsh_type_voidp
”。以下是添加用户变量的示例。
unsigned int led_id = 0;
byte led_state = 1;
shell_var.h
。
ADD_SHELL_VAR(id, LED ID, led_id, finsh_type_uint)
ADD_SHELL_VAR(state, LED state, led_state, finsh_type_uchar)
上传示例草图“FinSH”后,打开“串行监视器”,您将看到小外壳。
\ | /
- RT - Thread Operating System
/ | \ 4.0.1 build Mar 8 2019
2006 - 2019 Copyright by rt-thread team
finsh >
尝试一些预定义的命令。
finsh >hello()
Hello RT-Thread!
0, 0x00000000
finsh >list()
--Function List:
hello -- say hello world
version -- show RT-Thread version information
list -- list available commands
list_mem -- list memory usage information
list_thread -- list thread
list_sem -- list semaphore in system
list_mutex -- list mutex in system
list_event -- list event in system
list_mb -- list mail box in system
list_mq -- list message queue in system
list_memp -- list memory pool in system
list_timer -- list timer in system
led -- Turn on/off builtin LED
--Variable List:
dummy -- dummy variable for finsh
id -- LED ID
state -- LED state
0, 0x00000000
您可能会注意到,在执行每个命令后,小 shell 会打印一行包含两个值“ 0, 0x00000000
”。这两个值实际上是底层函数的返回值,有十进制和十六进制两种格式。“ hello()
”和“ list()
”返回“ void
”。试图发出“ led(1, 0)
”,你会得到一个不同的值(这是一个错误代码)。
现在尝试用户定义的命令和变量。正玩得开心!
finsh >id
0, 0x00000000
finsh >state
1, 0x00000001
finsh >led(id, state)
led0=1
0, 0x00000000
finsh >state=0
536870912, 0x20000000
finsh >led(id, state)
led0=0
0, 0x00000000
finsh >led(1, 1)
led1=1
1, 0x00000001
finsh >led(0, 1)
led0=1
0, 0x00000000
我还没有展示如何使用信号量、互斥体、邮箱、内存池等内核实用程序的示例,尽管所有这些功能目前已在库中准备就绪。我稍后会更新库和这篇文章。同时,您可以查看原始 RT-Thread 项目中的示例。
我还计划带回一些可选组件(我在移植时将其删除)并开发一些复杂的示例来展示 RT-Thread 的潜力。
谢谢阅读!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !