当前位置: 首页 > article >正文

freeRTOS 消息队列之一个事件添加到消息队列超时怎么处理

一 消息队列的结构框图

xTasksWaitingToSend‌:这个列表存储了所有因为队列已满而等待发送消息的任务。当任务尝试向一个已满的队列发送消息时,该任务会被挂起并加入到xTasksWaitingToSend列表中,直到队列中有空间可用‌,

xTasksWaitingToReceive‌:这个列表存储了所有因为队列为空而等待接收消息的任务。当任务尝试从一个空队列读取消息时,该任务会被挂起并加入到xTasksWaitingToReceive列表中,直到队列中有数据可用‌

消息队列中的消息队列数量通常由数量上限的限制,但是xTasksWaitingToSend‌以及xTasksWaitingToReceive‌这两个链表中可以加入的任务数量没有明确的上限限制。

二 freertos一个事件添加到消息队列超时怎么处理

在使用FreeRTOS时,如果你需要将一个事件添加到消息队列中,并且希望在特定时间内完成,可以通过几种方式来处理超时情况。下面是一些常用的方法:

1. 使用xQueueSend和超时参数

xQueueSend函数允许你指定一个阻塞时间(以tick为单位),如果在指定的时间内队列没有被空间,则会返回一个错误码。

#include "FreeRTOS.h"

#include "queue.h"

QueueHandle_t xQueue;

void *pvItemToQueue = NULL; // 指向你想要发送的数据的指针

TickType_t xTicksToWait = 10; // 等待时间,例如10 ticks

BaseType_t xHigherPriorityTaskWoken = pdFALSE;

if( xQueueSend( xQueue, &pvItemToQueue, xTicksToWait ) != pdPASS )

{

// 发送失败,可能是因为超时或队列已满

}

2. 使用xQueueSendToBackxQueueSendToFront和超时参数

这两个函数与xQueueSend类似,但是它们提供了更多的灵活性,例如你可以选择将数据添加到队列的前面或后面。

if( xQueueSendToBack( xQueue, &pvItemToQueue, xTicksToWait ) != pdPASS )

{

// 发送失败,可能是因为超时或队列已满

}

3. 使用xQueueSendToFrontFromISR和超时参数(中断服务例程中使用)

如果你在中断服务例程(ISR)中需要发送消息,可以使用xQueueSendToFrontFromISR,同样可以指定超时。

BaseType_t xHigherPriorityTaskWoken = pdFALSE;

if( xQueueSendToFrontFromISR( xQueue, &pvItemToQueue, &xHigherPriorityTaskWoken ) != pdTRUE )

{

// 发送失败,可能是因为队列已满

}

if( xHigherPriorityTaskWoken != pdFALSE )

{

// 可能需要从ISR唤醒更高优先级任务

portYIELD_FROM_ISR(); // 或者相应的端口特定的唤醒调用

}

4. 处理超时后的逻辑

无论哪种方式,处理超时后的逻辑都是非常重要的。例如,你可能需要重新尝试发送消息,或者执行一些错误处理操作。例如:

 

if( xQueueSend( xQueue, &pvItemToQueue, xTicksToWait ) != pdPASS )

{

// 超时处理逻辑,例如重新尝试或者记录错误等

// 可以选择在一定次数后停止尝试,避免无限重试导致的资源耗尽问题。

}

5. 使用xQueueOverwrite(如果适用)

如果你只是想覆盖队列中的现有数据而不是添加新数据(这在某些特定情况下很有用),可以使用xQueueOverwrite,它不涉及超时问题。

if( xQueueOverwrite( xQueue, &pvItemToQueue ) != pdPASS )

{

// 覆盖失败,可能是因为队列中没有数据可以被覆盖。

}

结论

通过上述方法,你可以有效地处理在使用FreeRTOS时向消息队列发送消息的超时情况。选择合适的方法取决于你的具体需求和场景。

http://www.lryc.cn/news/2401479.html

相关文章:

  • 十八、【用户认证篇】安全第一步:基于 JWT 的前后端分离认证方案
  • RabbitMQ 开机启动配置教程
  • Authpf(OpenBSD)认证防火墙到ssh连接到SSH端口转发技术栈 与渗透网络安全的关联 (RED Team Technique )
  • 组合与排列
  • 神经网络-Day45
  • 【西门子杯工业嵌入式-1-基本环境与空白模板】
  • Apache Druid
  • 使用深蓝词库软件导入自定义的词库到微软拼音输入法
  • Docker快速部署AnythingLLM全攻略
  • 使用Node.js分片上传大文件到阿里云OSS
  • 高性能分布式消息队列系统(四)
  • C#异步编程:从线程到Task的进化之路
  • [论文阅读] 人工智能+软件工程 | 用大模型优化软件性能
  • 复变函数中的对数函数及其MATLAB演示
  • 【Linux】Linux程序地址基础
  • React 项目初始化与搭建指南
  • 将图形可视化工具的 Python 脚本打包为 Windows 应用程序
  • AWS DocumentDB vs MongoDB:数据库的技术抉择
  • 无人机军用与民用技术对比分析
  • 刷leetcode hot100--矩阵6/1
  • Qt 中实现文本截断(ellipsis)的功能。Qt 提供了此方法来处理过长的文本显示问题,例如在界面中限制文本长度并添加省略号(...)
  • Cisco IOS XE WLC 任意文件上传漏洞复现(CVE-2025-20188)
  • 基于ResNet残差网络优化梯度下降算法实现图像分类
  • 群晖NAS套件历史版本资源
  • Docker轻松搭建Neo4j+APOC环境
  • 定制开发开源AI智能名片S2B2C商城小程序在无界零售中的应用与行业智能升级示范研究
  • CppCon 2015 学习:CLANG/C2 for Windows
  • Spring中@Primary注解的作用与使用
  • Spring Boot + Elasticsearch + HBase 构建海量数据搜索系统
  • [zynq] Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解(代码示例)