RTX5 | 消息队列02 - 放入与取出消息

一、前言

在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,从消息队列取出消息

在这里插入图片描述
在这里插入图片描述

这段代码是一个线程函数 `do_wstep_thread`,其主要作用是处理一系列事件(`evthead`)并将结果发送到消息队列中。 首先,函数开始时会获取全局变量 `mdata` 和 `evthead`,以及其他所需的变量。然后使用 `osEventFlagsClear` 清除事件标志位。 接下来进入一个无限循环,首先判断是否有可用的事件标志位。如果没有可用的事件标志位,则使用 `osDelay` 函数进行延迟一段时间后继续循环。 如果有可用的事件标志位,则使用 `osEventFlagsWait` 函数等待事件标志位被触发。如果触发的标志位超出了 `EVTFLAGS_MASK` 的范围,则使用 `osDelay` 函数进行延迟一段时间后继续循环。 接下来进入一个 `do-while` 循环,通过调用 `fifo_get` 函数从 `fifo` 队列中获取一个消息。如果获取成功,则将获取到的消息的指针赋值给 `evthead`。接着判断 `evthead` 是否为空,如果为空则跳过当前循环。 接下来使用 `list_for_each_safe` 宏遍历 `evthead->head` 链表中的每个节点。对于每个节点,首先判断节点是否为空,如果为空则跳出当前循环。然后将节点转换为 `wstep_desc` 结构体指针,并调用 `doing_nonblocking` 函数对其进行非阻塞处理。 在处理完所有节点后,将 `evthead` 的指针赋值给 `msg.ptr`,然后使用 `osMessageQueuePut` 函数将消息放入消息队列中。如果放入消息队列失败,则进行错误处理。 最后,更新一些计数器和标志位,并继续下一轮循环。 如果循环结束,则执行 `exit` 标签处的代码,调用 `osThreadExit` 函数退出线程。 总体来说,这段代码的作用是循环等待事件标志位被触发,然后从队列中获取消息并处理,最后将处理结果发送到消息队列中。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wallace Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值