文章目录
一、前言
在RTOS里,消息队列与线程一样都是非常重要的功能。在实际项目上,线程与消息队列肯定会使用。最常用的案例是串口中断回调函数将收到的字符放入消息队列,待串口中断回调函数结束后,线程立即从该消息队列里获取字符,接着按照通讯协议解释字符。
中断回调函数必须遵循快进快出的原则。所谓快进快出就是中断回调函数里的代码量需尽可能少,所以最好不要在中断回调函数里运行解释通讯协议的代码。此时,消息队列很好地解决了快进快出的问题。因为中断回调函数里只需运行将消息放入消息队列的代码,解析通讯协议的代码放在读取消息队列的线程里。
STM32工程:
链接:https://pan.baidu.com/s/1F7AXUObbZzQ7Dq0pJjM9oA
提取码:5dzr
二、实验的目的
创建一个消息队列。
三、API
3.1、osMessageQueueId_t
osMessageQueueId_t msgQueue_ID_CAN1; //用于CAN1的消息队列ID
3.2、osMessageQueueAttr_t
/* 动态堆栈方式 */
/* CAN1消息队列属性 */
const osMessageQueueAttr_t msgQueue_CAN1_Attr =
{
.name = "Message_Queue_CAN1", /* 消息队列名字 */
/* 其他都用默认 */
};
3.3、osMessageQueueNew
msgQueue_ID_CAN1 = osMessageQueueNew(MQ_SIZE, /* 消息队列里存放消息的总数 */
sizeof(put_Uart), /* 消息的大小(单位: Byte)*/
&msgQueue_CAN1_Attr /* 消息队列的属性 */
);
四、代码
4.1、main.h
4.2、main.c
使用动态堆栈的方式创建消息队列,只需从属性里配置消息队列的名字,其他均为默认值即可。
五、RTX RTOS调试程序
Keil提供的RTX RTOS功能,非常方便地调试RTX5程序。从下图看到,成功创建第一个消息队列。