本篇笔记将简单介绍RTX,包括基本架构,如何在Keil中配置。需要安装ARM-MDK和一块硬件板,笔记以STM32F4Discovery为例子。
尽管把所有程序放在一个大的循环里顺序执行,总是可能的(甚至很多时候是足够的胜任任务的),但是这样做有好几个明显的缺点:
RTOS主要是把要执行的运算包装在小的task里面,这样好的好处是:
一个不成文的小经验:如果源程序大于1MB,那就有必要用RTOS了!
当然,也有很多情况下我们不希望用RTOS的:
为什么选RTX不选别的RTOS,例如FreeRTOS?
其实主要还是看应用,RTX在行业里声誉还是很好的,稳定性强,开发成本低,而且基本功能齐全。
RTX其实是Keil Real-Time Library (RTL)的核心,这个RTL有很多部分的,都是在RTX kernel基础上库。 RTX Kernel本身的话,结构大概如下图:
主要的组件有:mutex互斥锁,memory pool内存池,mailbox邮箱,time(timer)定时器, event事件, semaphore旗语或信号灯,task management进程管理等等和最核心的Scheduler排程器(进程调度器)。
移植一个现有的ARM-MDK工程到RTX上非常简单:
1.在工程配置中选择RTX Kernel作为你的操作系统,如下图:
2.在你的main.c里添加头文件RTL.H:
#include <RTL.h>
4.将你原有的函数改造成task,就是在函数返回类型前添加标记 __task (双下划线) 例如:
__task void task(void){ for(;;){ //... } }
os_sys_init(task);
完成上述几步后,你会发现你的工程里主要多了这三个文件:
第一个是整个RTL的API函数签名。第二个是RTX的配置文件,你可以通过configuration wizard提供的GUI去配置你的OS。最后一个是内核的配置文件,有一些可以实时调用的配置函数。
这里多说说第二个文件,你可以使用text editor去修改代码,也可以使用configuration wizard,如下图:
这里先逐项简单介绍这里的选项:
一般主要调的就时钟频率和排程的设置。
uVision5提供的RTOS是CMSIS-RTOS,有点让人觉得摸不着头脑。其实CMSIS-RTOS是在RTX上的另一层封装。这样做的意义在于,建立在不同RTOS(例如RTX和FreeRTOS)的项目可以用同一套API。对于大部分ARM的核来说,其实其底层就是RTX。
所以其实本质上是一个东西,只是API名称不同。使用CMSIS-RTOS 的好处就是稍微强的移植性。但是考虑到ARM的市场占有和他们RTX本身的兼容性,不用CMSIS-RTOS好像更好。而且两层封装,很容易把人弄晕。
当然,如果有需要,可以参考官方文档:移植RTX到CMSIS-RTOS。