起因
今天在移植陀螺仪项目时,之前的代码全局变量过多,函数功能不够独立,现在使用国产雅特力MCU,M4主频120MHz,64K ROM,16K RAM,想使用RTOS重新写代码,实践一次嵌入式RTOS编程。
参考资料
- 参考RT-Thread官网教程:https://www.rt-thread.org/document/site/#/
开始干
选型
选用RT-Thread Nano版本,资源占用小:对 RAM 与 ROM 的开销非常小,在支持 semaphore 和 mailbox 特性,并运行两个线程 (main 线程 + idle 线程) 情况下,ROM 和 RAM 依然保持着极小的尺寸,RAM 占用约 1K 左右,ROM 占用 4K 左右。
移植
移植参考官网教程:使用 MDK 移植
移植时遇到的几个问题
#error "TODO 1: OS Tick Configuration."
一直报错,这个只是编译时提醒我们要配置OS Tick,配置后需手动注释掉这条。SysTick_Handler()
有时进有时不进,检查方法查看SysTick结构体,发现CTRL中使能位0,原因:后面的代码使用了delay函数关闭SysTick的使能位。
线程
初始化静态线程
1 | rt_err_t rt_thread_init(struct rt_thread* thread, |
启动线程
rt_err_t rt_thread_startup(rt_thread_t thread);
遇到的问题
遇到rt_thread_init()函数卡死,百度竟然啥都查不到(rt-thread用的人这么少的吗),后尝试将栈大小增加至256后成功初始化线程。虽然任务里没什么局部变量,但是一个简单的按键任务竟然占了500多字节内存,可能是因为栈中还保存了寄存器、TCB等信息,那我这单片机16K字节内存可能不够。
需要在main函数while(1)中加入rt_thread_mdelay(10); 否则main线程优先级更高,其他线程无法运行。