0%

RT-Thread使用笔记

起因

今天在移植陀螺仪项目时,之前的代码全局变量过多,函数功能不够独立,现在使用国产雅特力MCU,M4主频120MHz,64K ROM,16K RAM,想使用RTOS重新写代码,实践一次嵌入式RTOS编程。

参考资料

  1. 参考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 移植

移植时遇到的几个问题

  1. #error "TODO 1: OS Tick Configuration."一直报错,这个只是编译时提醒我们要配置OS Tick,配置后需手动注释掉这条。
  2. SysTick_Handler()有时进有时不进,检查方法查看SysTick结构体,发现CTRL中使能位0,原因:后面的代码使用了delay函数关闭SysTick的使能位。

线程

初始化静态线程

1
2
3
4
5
rt_err_t rt_thread_init(struct rt_thread* thread,
const char* name,
void (*entry)(void* parameter), void* parameter,
void* stack_start, rt_uint32_t stack_size,
rt_uint8_t priority, rt_uint32_t tick);

启动线程

rt_err_t rt_thread_startup(rt_thread_t thread);

遇到的问题

  1. 遇到rt_thread_init()函数卡死,百度竟然啥都查不到(rt-thread用的人这么少的吗),后尝试将栈大小增加至256后成功初始化线程。虽然任务里没什么局部变量,但是一个简单的按键任务竟然占了500多字节内存,可能是因为栈中还保存了寄存器、TCB等信息,那我这单片机16K字节内存可能不够。

  2. 需要在main函数while(1)中加入rt_thread_mdelay(10); 否则main线程优先级更高,其他线程无法运行。