资料介绍
描述
背景
作为大多数 Arduino 玩家,我是从 Arduino Uno 开始的。很快我收集了很多盾牌。为了驱动这些屏蔽,我使用了各种库,它们占用了所有的内存空间。
所以我搬到了 Arduino Mega 并获得了很多乐趣,直到我开始从事一些更复杂的项目,比如玩显示器和声音。
最近,我再次将我的武器升级到 Arduino Due,它与我以前的板 (AVR) 具有完全不同的架构 (ARM Cortex-M)。毫无疑问,具有“巨大”内存空间和更高时钟速度的 32 位内核是一种强大的武器。但是,要充分利用电源,使用简单的“循环”功能可能还不够。这就是Arduino RT-Thread 库项目想要解决的问题。
RT-线程
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()
:打印内存池信息
您可以通过两步添加自己的命令。
-
首先,定义原因的功能。返回值可以是“
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 的潜力。
谢谢阅读!
- RT-Thread Primer(即将推出)
更新
- 2019 年 3 月 15 日:该库已在“库管理器”中可用。
- 2019 年 4 月 17 日:FAT 文件系统和 SD 卡驱动程序可用于 v0.4.4。
- 2019 年 5 月 6 日:从 v0.5.1 开始,请使用ADD_FINSH_CMD而不是ADD_SHELL_CMD 。
- PicoSem:Arduino框架下的Raspberry多任务
- STM32 简单多任务调度的方法与程序例程
- 基于层次注意力机制的多任务疾病进展模型 7次下载
- 融合文本分类和摘要的多任务学习摘要模型 11次下载
- 一种基于多任务联合训练的阅读理解模型 10次下载
- EDA多任务流调度算法实验设计 5次下载
- 如何使用51单片机进行多任务机制及应用
- 基于E-CARGO的多任务分配管理 11次下载
- 基于DSP的实时多任务调度内核设计 7次下载
- 基于TMS320LF2407的多任务实时处理系统设计 5次下载
- 基于消息驱动的多任务操作机制 0次下载
- 嵌入式实时多任务软件的软总线结构设计
- DSP/BIOS多任务环境下的实时数据采集与处理
- 一种基于比特表的实时多任务新调度算法
- 基于任务链的实时多任务软件可靠性建模
- MCU长耗时任务的优化策略 525次阅读
- 基于多任务预训练模块化提示 582次阅读
- 鸿蒙内核源码分析多任务环境下的事件控制块 1246次阅读
- 基于M16C62单片机实现实时多任务系统的设计方案 982次阅读
- 基于时间触发多任务调度器的嵌入式系统设计与应用 1958次阅读
- 基于多任务信息流的CAN总线驱动设计 1064次阅读
- 单片机多任务处理方案 9315次阅读
- 以嵌入式处理器S3C2440为核心的多任务机器人控制系统设计详解 1723次阅读
- 迁移学习、多任务学习领域的进展 3860次阅读
- ABB机器人怎样多任务?ABB机器人多任务使用方法步骤详解 3.1w次阅读
- NLP多任务学习案例分享:一种层次增长的神经网络结构 4325次阅读
- 基于ARM9和μC/OSII高速实时多任务数据采集的智能化设计 719次阅读
- uC/OS-II应用的介绍和多任务实现机制分析 2303次阅读
- 基于高档数控系统的实时多任务实现 1294次阅读
- 用AndesCore N1033A-S处理器实现μC/OS-II的移植 3970次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成威廉希尔官方网站 应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口威廉希尔官方网站 图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字威廉希尔官方网站 基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动威廉希尔官方网站 设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6威廉希尔官方网站 仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多