文章目录
一、前言
在RTOS里,消息队列与线程一样都是非常重要的功能。在实际项目上,线程与消息队列都肯定要使用。最常用的案例是串口中断回调函数将收到的字符放入消息队列,待串口中断回调函数结束后,线程立即从该消息队列里获取字符,接着按照通讯协议解释字符。
中断回调函数必须遵循快进快出的原则。所谓快进快出就是中断回调函数里的代码量需尽可能少,所以最好不要在中断回调函数里运行解释通讯协议的代码。此时,消息队列很好地解决了快进快出的问题。因为中断回调函数里只需运行将消息放入消息队列的代码,解析通讯协议的代码放在读取消息队列的线程里。
STM32工程:
链接:https://pan.baidu.com/s/1PbkeYj0yNU09-DcbMbC7bQ
提取码:ftgi
二、实验目的
长按KEY1按键,将变量put_Uart放入消息队列。长按KEY2按键,从消息队列取出消息。
三、API
3.1、osMessageQueuePut
/* 将put_Uart变量的值放入消息队列msgQueue_ID_CAN1 */
osMessageQueuePut(msgQueue_ID_CAN1, /* 消息队列的名字 */
&put_Uart, /* 放入消息队列的变量(消息) */
NULL, /* 放入消息的优先级 */
NULL /* 超时时间为0,如果osMessageQueuePut被中断回调函数调用时,此参数必须是NULL */
);
3.2、osMessageQueueGet
/* 从消息队列msgQueue_ID_CAN1里取出消息 */
osMessageQueueGet(msgQueue_ID_CAN1, /* 消息队列的名字 */
&get_Uart, /* 存放消息的内存 */
NULL, /* 取出消息的优先级 */
NULL /* 超时时间为0,在中断函数里调用osMessageQueueGet时,此参数必须是NULL */
);
四、代码
4.1、main.h
4.2、main.c
五、DEBUG
5.1、长按按键KEY1,将变量放入消息队列
5.2、长按按键KEY2,从消息队列取出消息