RTX 的消息邮箱实际上就是消息队列,通过内核提供的服务,任务或中断服务子程序可以将一个消息
(注意,RTX 消息邮箱传递的是消息的地址而不是实际的数据)放入到消息队列。同样,一个或者多个任
务可以通过内核服务从消息队列中得到消息。通常,先进入消息队列的消息先传给任务,也就是说,任务
先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO)。
也许有不理解的初学者会问采用消息邮箱多麻烦,搞个全局数组不是更简单,其实不然。在裸机编程
时,使用全局数组的确比较方便,但是在加上 RTOS 后就是另一种情况了。使用全局数组相比消息邮箱主
要有如下四个问题:
- 使用消息邮箱可以让 RTOS 内核有效的管理任务,全局数组是无法做到的,任务的超时等机制需要用
户自己去实现 - 使用了全局数组就要防止多任务的访问冲突,使用消息邮箱已经处理好了这个问题。用户无需担心。
- 使用消息邮箱可以有效的解决中断服务程序跟任务之间消息传递的问题。
- FIFO 机制更有利于数据的处理。
RTX 中断方式消息邮箱的实现
RTX 中断方式消息邮箱的实现是指中断函数和 RTX 任务之间使用消息邮箱。下面我们通过如下的框
图来说明一下 RTX 消息邮箱的实现,让大家有一个形象的认识。
运行条件 - 创建消息邮箱,可以存放 10 个消息。
- 创建 1 个任务 Task1 和一个串口接收中断。
- RTX 的消息读取和存放仅支持 FIFO 方式。
运行过程主要有以下两种情况
- 中断服务程序向消息邮箱放数据地址,任务 Task1 从消息邮箱取数据地址,如果放数据地址的速度快 于取数据的速度,那么会出现消息邮箱存放满的情况。由于中断服务程序里面的消息邮箱发送函数
isr_mbx_send 不支持超时设置,所有发送前要通过函数 isr_mbx_check 检测邮箱是否满。 - 中断服务程序向消息邮箱放数据地址,任务 Task1 从消息邮箱取数据地址,如果放数据地址的速度慢 于取数据的速度,那么会出现消息邮箱存为空的情况。在 RTX 的任务中可以通过函数 os_mbx_wait
获取消息,因为此函数可以设置超时等待,直到消息邮箱中有消息存放或者设置时间超时。
上面就是一个简单 RTX 消息邮箱通信过程。实际应用中,中断方式的消息机制切记注意以下四个问题:
-
中断函数的执行时间越短越好,防止其它低于这个中断优先级的异常不能得到及时响应。
-
实际应用中,建议不要在中断中实现消息处理,用户可以在中断服务程序里面发送消息通知任务,在
任务中实现消息处理,这样可以有效的保证中断服务程序的实时响应。同时此任务也需要设置为高优
先级,以便退出中断函数后任务可以得到及时执行。 -
中断服务程序中一定要调用专用于中断的消息邮箱函数 isr_mbx_send,isr_mbx_receive 和
isr_mbx_check -
在 RTX 操作系统中实现中断函数和裸机编程是一样的。
-
另外强烈推荐用户将 Cortex-M3 内核的 STM32F103 和 Cortex-M4 内核的 STM32F407 的
NVIC 优先级分组设置为 4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断
优先级的管理将非常方便。 -
用户要在 RTX 多任务开启前就设置好优先级分组,一旦设置好切记不可再修改
来源:CSDN
作者:赵维佳
链接:https://blog.csdn.net/xxzhaoming/article/details/104646916