FREERTOS 消息队列的阻塞等待

本文介绍了如何在C语言中使用FreeRTOS的消息队列功能,包括创建QueueHandle_t类型的队列,设置队列容量和消息大小,以及进行发送和接收消息的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、创建消息队列

	
    QueueHandle_t queue_handle;
    //创建消息队列                  消息队列容量为2   消息的大小为一个字节
	queue_handle = xQueueCreate(2,sizeof(uint8_t));

二、发送消息

           //句柄             内容            超时时间
xQueueSend(queue_handle,(unsigned char*)&msg,100);

三、接收消息

            //句柄         读取buf   阻塞等待
xQueueReceive(queue_handle,&msg,portMAX_DELAY);

### FreeRTOS 消息队列阻塞机制 在 FreeRTOS 中,当任务尝试访问消息队列时,如果当前条件不允许立即完成操作(例如队列为空或已满),则该任务可以选择进入阻塞状态直到满足特定条件。对于接收方而言,在调用 `xQueueReceive` 函数读取消息时,若指定时间内未接收到任何可用的信息,则会触发超时返回;而对于发送者来说,使用 `xQueueSend` 发送数据至已满的队列也会遇到类似的状况。 #### 接收端的阻塞行为 当一个任务试图从队列中获取一条消息而此时队列里没有任何待取走的内容时,可以通过设置参数让此任务暂时挂起并等待新消息的到来: ```c BaseType_t xStatus; const TickType_t xTicksToWait = pdMS_TO_TICKS(10); // 设置最大等待时间为 10 ms // 尝试从名为 queueHandle 的队列中取出一项数据,并最多等待 10ms xStatus = xQueueReceive(queueHandle, &receivedItem, xTicksToWait); if (xStatus == pdPASS){ // 成功收到了项目... } else { // 超过设定时间仍未有消息到达... } ``` 上述代码片段展示了如何配置带有超时期限的任务来安全地处理未能及时获得所需资源的情况[^1]。 #### 发送端的阻塞行为 同样地,当向已经满了的消息队列添加新的条目时,也可以使发送任务处于休眠模式直至有足够的空间容纳即将加入的新成员: ```c BaseType_t xStatus; void *itemToSend; // 向名为 queueHandle 的队列发送 itemToSend ,并在必要时最长等待 20 ticks xStatus = xQueueSend(queueHandle, &itemToSend, pdMS_TO_TICKS(20)); if(xStatus != errQUEUE_FULL){ // 数据成功入队... }else{ // 队列依旧保持全满的状态... } ``` 值得注意的是,在某些情况下可能希望避免因长时间无响应而导致系统性能下降的问题,因此合理调整这些延时参数至关重要[^2]。 为了防止潜在的风险,比如死锁或是内存泄漏等问题的发生,在设计应用程序逻辑时应特别注意不要在一个持有对某个对象所有权期间去销毁它——这包括但不限于消息队列本身。具体来讲就是说如果有其他任务正依赖于这个队列来进行通信的话就不应该随意将其移除掉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值