背景:
参加2020嵌入式暨智能互联大赛,使用的是此前已经成型的作品:
外卖自提柜:
https://blog.csdn.net/weixin_44578655/article/details/105945891
比赛有使用RT-thread的选项,由于此前作品使用FreeRTOS,大体看了一下RT-thread的API文档,发现跟FreeRTOS比较像,决定移植一下。
感想:
RT-thread有原生中文文档,示例丰富,有官方的视频教程,对于初学者相当友好,相比FreeRTOS,我更推荐这个国产的实时操作系统作为入门的RTOS。
CubeMX生成 RT-thread nano工程(官方示例):
https://www.rt-thread.org/document/site/tutorial/nano/nano-port-cube/an0041-nano-port-cube/
RT-Thread时基的问题:
使用CubeMX生成工程时,RT-thread默认使用systick作为时基,而HAL库也需要一个时基,因此需要在CubeMX中更改一下HAL库的时基选项,选一个没有用到的定时器用于时基发生(这个操作在使用FreeRTOS也需要的,这不过FreeRTOS会弹出对话框提醒你,RT-thread没提醒,因此需要注意一下):
实际使用时,发现使用rt_thread_mdelay();进行ms级延时时,延时时间比正常大10倍,这一点我来回试验过好多次(stm32f1和stm32f4都是这样),不清除是否是我操作有误。
RT-thred在初始化systick时,调用了一个SystemCoreClockUpdate(),来获取系统时钟,但我debug时发现SystemCoreClock并不是正确的数值,因此导致rt-thread时基不准确。
因此我这里直接手动填入了系统时钟(stm32f405系统主频168M):
更改后使用 rt_thread_mdelay() 正常。
线程不能自己删除自己:
在RT-thread中,线程不能在运行时调用rt_thread_delete() 删除自己
(这一点跟在FreeRTOS不一样),如果要结束本线程的运行,直接return 即可,系统会自动回收线程的资源,这种操作仅限于使用rt_thread_create动态创建的线程。