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

【FreeRTOS】队列集

队列集

队列集内部机制:(句柄简单来说就是对象的指针:句柄详解,什么是句柄?句柄有什么用?-CSDN博客)

在开发板上的实际操作:

创建队列集

QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength )

把队列加入队列集

BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,

QueueSetHandle_t xQueueSet );

读取队列集

QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet,

TickType_t const xTicksToWait );

同一份数据分发给多个任务(重点)

解决方法:让驱动程序同时写多个队列,然后让不同任务各自读取各自的队列。

第一种方法:(不推荐)

第二种方法:

创建一个队列数组,所有需要分发数据的队列的句柄都被一个注册函数放入该队列数组中,然后由驱动层内部分发函数给数组内所有队列分发数据。

static QueueHandle_t g_xQueues[10];//需要被分发数据的队列的数组,数组内的值来自外部任务调用注册函数,//将自己的队列添加进该数组中,然后驱动层会将数据分发给该数组内所有队列
static int g_queue_cnt = 0;//队列数组成员计数,防止越界void IR_RegisterQueueHandle(QueueHandle_t queueHandle)//注册队列到队列数组
{if (g_queue_cnt < 10){g_xQueues[g_queue_cnt] = queueHandle;g_queue_cnt++;}
}#if 0
void LogoutQueueHandle(QueueHandle_t queueHandle)//将队列从队列数组中注销
{int i = 0;for (i = 0; i < g_queue_cnt; i++){if (g_xQueues[i] == queueHandle){g_xQueues[i] = g_xQueues[g_queue_cnt];g_queue_cnt--;}}
}
#endifstatic void DispatchKey(struct ir_data* pidata)//分发数据
{
#if 0//数据分发,同时写3个队列extern QueueHandle_t g_xQueueCar1; /* 任务队列 */extern QueueHandle_t g_xQueueCar2; /* 任务队列 */extern QueueHandle_t g_xQueueCar3; /* 任务队列 */xQueueSendFromISR(g_xQueueCar1, pidata, NULL);xQueueSendFromISR(g_xQueueCar2, pidata, NULL);xQueueSendFromISR(g_xQueueCar3, pidata, NULL);//可以这么写,但是这样写会让驱动层与应用层耦合性增强//每次增加任务都要在驱动层更改代码,代码太丑陋
#else//分发数据到队列数组int i = 0;for (i = 0; i < g_queue_cnt; i++){xQueueSendToBackFromISR(g_xQueues[i], pidata, NULL);}
#endif
}

当我们有一个任务需要用到数据时,就在该任务内创建一个队列,然后将该队列通过注册函数注册到队列数组中就好了。

http://www.xdnf.cn/news/1313641.html

相关文章:

  • 聊聊智慧这个东西之三:从食物的毒性、偏性聊起
  • 布隆过滤器的原理及使用
  • ubuntu网络共享
  • 银行间交易IMIX协议加密相关
  • JetPack系列教程(八):PDF库——让Android应用也能优雅“翻页”
  • androidstudio内存大小配置
  • 《从混乱到有序:AI 如何一步步梳理数据质量难题》文章提纲
  • LIN-TestWait函数解析
  • 【Html网页模板】赛博朋克数据分析大屏网页
  • 【开发技巧】VS2022+QT5+OpenCV4.10开发环境搭建QT Creator
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘opencv-python’问题
  • 从希格斯玻色子到 QPU:C++ 的跨维度征服
  • 电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
  • 从频繁告警到平稳发布:服务冷启动 CPU 风暴优化实践01
  • Centos7.9安装Dante
  • 深度解析Java synchronized关键字及其底层实现原理
  • python---包
  • 《WINDOWS 环境下32位汇编语言程序设计》第2章 准备编程环境
  • 深入剖析 TOTP 算法:基于时间的一次性密码生成机制
  • IOMMU多级页表查找的验证
  • 【计算机网络架构】混合型架构简介
  • 39.离散化与哈希
  • 模型训练监控:TensorBoard与Weights Biases (WB) 使用详解
  • 《A Practical Guide to Building Agents》文档学习
  • 写一个linux脚本,要求实现查找9010端口,如果端口存在则kill,否则不处理,返回对应的提示
  • 24. async await 原理是什么,会编译成什么
  • Linux系统top命令详细指南
  • 安卓11 12系统修改定制化_____如何去除安卓11 12的系统签名验证
  • 基于Transformer的机器翻译——模型篇
  • 《后室Backrooms》中文版,购物误入异空间,怪物追逐,第一人称冒险逃生