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

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.xdnf.cn/news/888337.html

相关文章:

  • 【threejs】每天一个小案例讲解
  • Dubbo Logback 远程调用携带traceid
  • 【Algorithm】Segment Tree 简单介绍
  • C#异步编程:从线程到Task的进化之路
  • Linux 内核队列调度相关内核选项详解
  • Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
  • 【.net core】.KMZ文件解压为.KML文件并解析为GEOJSON坐标数据集。附KML处理多线(LineString)闭环问题
  • 【LLIE专题】NTIRE 2025 低照度图像增强第二名方案
  • EtherCAT Module and Slot
  • Python训练第四十五天
  • 中国森林地上和地下植被碳储量数据集(2002~2021)
  • 【EN 18031】访问控制机制(ACM - 3):儿童玩具的防护盾
  • 我认为STM32输入只分为模拟输入 与 数字输入
  • 实现基于Yolo的异常聚集算法
  • 会话技术:Cookie 与 Session 详解
  • Ubuntu崩溃修复方案
  • 基于Java(Jsp+servelet+Javabean)+MySQL实现图书管理系统
  • Vue中实现表格吸底滚动条效果,列太多时左右滚动条始终显示在页面中
  • android知识总结
  • 【从0-1的CSS】第1篇:CSS简介,选择器已经常用样式
  • NoSQl之Redis部署
  • 【PhysUnits】15.16 补充to_i32方法的类型级整数表示(basic.rs)
  • wxpython快捷键示例
  • Python cryptography【密码库】库功能与使用指南
  • 模块化架构下的前端调试体系建设:WebDebugX 与多工具协同的工程实践
  • Sublime Text4 4192 安装
  • NGINX `ngx_stream_core_module` 模块概览
  • 数据分析后台设计指南:实战案例解析与5大设计要点总结
  • 实用对比图软件推荐:快速呈现信息差异
  • 【请关注】MySQL 碎片整理提升性能