RTX的消息邮箱实际上就是消息队列,通过内核提供的服务,任务或中断服务子程序可以将一个消息(注意,RTX消息邮箱传递的是消息的地址而不是实际的数据)放入到消息队列。同样,一个或者多个任务可以通过内核服务从消息队列中得到消息。通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO)。
也许有不理解的初学者会问采用消息邮箱多麻烦,搞个全局数组不是更简单,其实不然。在裸机编程时,使用全局数组的确比较方便,但是在加上RTOS后就是另一种情况了。使用全局数组相比消息邮箱主要有如下四个问题:
u 使用消息邮箱可以让RTOS内核有效的管理任务,全局数组是无法做到的,任务的超时等机制需要用户自己去实现。
u 使用了全局数组就要防止多任务的访问冲突,使用消息邮箱已经处理好了这个问题。用户无需担心。
u 使用消息邮箱可以有效的解决中断服务程序跟任务之间消息传递的问题。
u FIFO机制更有利于数据的处理。
运行条件:
u 创建消息邮箱,可以存放10个消息。
u 创建2个任务Task1和Task2,任务Task1向消息邮箱放数据地址,任务Task2从消息邮箱取数据地址。
u RTX的消息读取和存放仅支持FIFO方式。
运行过程主要有以下两种情况:
u 任务Task1 向消息邮箱放数据地址,任务Task2从消息邮箱取数据地址,如果放数据地址的速度快于取数据的速度,那么会出现消息邮箱存放满的情况,RTX的消息存放函数os_mbx_send支持超时等待,可以设置超时等待,直到有位置可以存放消息放或者设置时间超时。
u 任务Task1 向消息邮箱放数据地址,任务Task2从消息邮箱取数据地址,如果放数据地址的速度慢于取数据的速度,那么会出现消息邮箱为空的情况,RTX的消息获取函数os_mbx_wait支持超时等待,可以设置超时等待,直到消息邮箱中有消息放或者设置时间超时。
运行条件:
u 创建消息邮箱,可以存放10个消息。
u 创建1个任务Task1和一个串口接收中断。
u RTX的消息读取和存放仅支持FIFO方式。
运行过程主要有以下两种情况:
u 中断服务程序向消息邮箱放数据地址,任务Task1从消息邮箱取数据地址,如果放数据地址的速度快于取数据的速度,那么会出现消息邮箱存放满的情况。由于中断服务程序里面的消息邮箱发送函数isr_mbx_send不支持超时设置,所有发送前要通过函数isr_mbx_check检测邮箱是否满。
u 中断服务程序向消息邮箱放数据地址,任务Task1从消息邮箱取数据地址,如果放数据地址的速度慢于取数据的速度,那么会出现消息邮箱存为空的情况。在RTX的任务中可以通过函数os_mbx_wait获取消息,因为此函数可以设置超时等待,直到消息邮箱中有消息存放或者设置时间超时。
上面就是一个简单RTX消息邮箱通信过程。实际应用中,中断方式的消息机制切记注意以下四个问题:
u 中断函数的执行时间越短越好,防止其它低于这个中断优先级的异常不能得到及时响应。
u 实际应用中,建议不要在中断中实现消息处理,用户可以在中断服务程序里面发送消息通知任务,在任务中实现消息处理,这样可以有效的保证中断服务程序的实时响应。同时此任务也需要设置为高优先级,以便退出中断函数后任务可以得到及时执行。
u 中断服务程序中一定要调用专用于中断的消息邮箱函数isr_mbx_send,isr_mbx_receive和isr_mbx_check。
u 在RTX操作系统中实现中断函数和裸机编程是一样的。
l 另外强烈推荐用户将Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407的NVIC优先级分组设置为4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断优先级的管理将非常方便。
l 用户要在RTX多任务开启前就设置好优先级分组,一旦设置好切记不可再修改。
使用如下8个函数可以实现RTX消息邮箱:
u os_mbx_check
u os_mbx_declare
u os_mbx_init
u os_mbx_send
u os_mbx_wait
u isr_mbx_check
u isr_mbx_receive
u isr_mbx_send
关于这8个函数的讲解及其使用方法可以看教程第3章3.3小节里面说的参考资料rlarm.chm文件
函数描述:
函数os_mbx_send用于向消息邮箱存放数据指针,或者说数据地址。如果消息邮箱已经满了,调用此函数的任务将被挂起,等待消息邮箱可用,直到消息邮箱有空间可用或者超时时间溢出才会返回。
u 第1个参数填写消息邮箱的ID标识,即函数os_mbx_declare第一个参数。
u 第2个参数填写消息指针,即数据的地址。
u 第3个参数表示设置的等待时间,范围0-0xFFFF,当参数设置为0-0xFFFE时,表示等待这么多个时钟节拍,参数设置为0xFFFF时表示无限等待直到消息邮箱有可用的空间。
u 返回值OS_R_OK,表示消息指针成功放到消息邮箱中。
返回值OS_R_TMO,表示消息邮箱已经满了,在设置的超时时间范围内也没有等到可用的空间。
函数描述:
函数os_mbx_wait用于从消息邮箱中获取消息。如果消息邮箱为空,调用此函数的任务将被挂起,直到消息邮箱有消息可用或是设置的超时时间溢出才会返回。
u 第1个参数填写消息邮箱的ID标识,即函数os_mbx_declare第一个参数。
u 第2个参数填写从消息邮箱中获取消息后,存放消息的指针变量。
u 第3个参数表示设置的等待时间,范围0-0xFFFF,当参数设置为0-0xFFFE时,表示等待这么多个时钟节拍,参数设置为0xFFFF时表示无限等待直到消息邮箱有消息。
u 返回值OS_R_OK,表示从消息邮箱中有消息,立即从消息邮箱中获得消息,无需等待。。
返回值OS_R_TMO,表示消息邮箱为空,在设置的超时时间范围内也没有等到消息。
返回值OS_R_MBX,表示在设置的超时时间范围内收到消息。