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

常州网站seo平台网站建设推荐

常州网站seo,平台网站建设推荐,做的比较炫的网站,手机h5制作小程序FreeRTOS深度解析:队列集(Queue Sets)的原理与应用 什么是队列集? 在FreeRTOS中,队列集(Queue Sets,英文名xQueueSet)是一种强大的数据结构,用于高效管理多个队列。它的…

FreeRTOS深度解析:队列集(Queue Sets)的原理与应用

什么是队列集?

在FreeRTOS中,队列集(Queue Sets,英文名xQueueSet)是一种强大的数据结构,用于高效管理多个队列。它的主要作用是让任务能够同时等待多个队列中的消息,而不必单独轮询每个队列。

队列集本质上是多个队列的集合,提供了一种便捷的方式来监视多个队列,只要集合中的任何一个队列收到消息,任务就能被唤醒并处理该消息。

为什么需要队列集?

在多任务系统中,经常会出现一个任务需要从多个队列接收数据的情况。让我们通过一个实际场景来理解队列集的必要性:

假设我们有一个温湿度监控系统:

  • 任务1负责采集数据:将温度数据发送到队列A,将湿度数据发送到队列B
  • 任务2需要处理这两种数据:必须从队列A和队列B都读取数据

传统方法的问题

如果不使用队列集,任务2需要分别读取两个队列:

// 传统方法:分别读取两个队列
// 先尝试读取队列A
if(xQueueReceive(queueA, &tempData, portMAX_DELAY) == pdTRUE) {// 处理温度数据
}// 再尝试读取队列B
if(xQueueReceive(queueB, &humidData, portMAX_DELAY) == pdTRUE) {// 处理湿度数据
}

这种方法存在严重问题:

  1. 阻塞问题:如果队列A没有数据,任务会阻塞在第一个xQueueReceive调用,即使队列B中已有数据也无法处理
  2. 效率低下:需要编写复杂的轮询逻辑以避免阻塞
  3. 实时性差:无法保证及时处理所有可用数据

队列集的解决方案

队列集优雅地解决了上述问题。它将多个队列组合成一个整体,任务只需监听这个队列集:

// 创建队列集
QueueSetHandle_t queueSet = xQueueCreateSet(totalQueueSize);// 将队列添加到队列集
xQueueAddToSet(queueA, queueSet);
xQueueAddToSet(queueB, queueSet);// 在任务中等待任意队列的数据
QueueSetMemberHandle_t activeMember = xQueueSelectFromSet(queueSet, portMAX_DELAY);// 判断是哪个队列收到了数据
if(activeMember == queueA) {xQueueReceive(queueA, &tempData, 0);// 处理温度数据
} else if(activeMember == queueB) {xQueueReceive(queueB, &humidData, 0);// 处理湿度数据
}

队列集的核心API函数

FreeRTOS提供了几个关键函数来操作队列集:

  1. xQueueCreateSet() - 创建一个新的队列集

    QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength);
    
  2. xQueueAddToSet() - 将队列添加到队列集

    BaseType_t xQueueAddToSet(QueueHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet);
    
  3. xQueueRemoveFromSet() - 从队列集中移除队列

    BaseType_t xQueueRemoveFromSet(QueueHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet);
    
  4. xQueueSelectFromSet() - 等待并返回队列集中有消息的队列

    QueueSetMemberHandle_t xQueueSelectFromSet(QueueSetHandle_t xQueueSet, TickType_t xTicksToWait);
    
  5. xQueueSelectFromSetFromISR() - 中断服务程序中使用的版本

    QueueSetMemberHandle_t xQueueSelectFromSetFromISR(QueueSetHandle_t xQueueSet);
    

队列集的高级应用案例

队列集不仅可以管理队列,还可以管理信号量,让我们看一个更复杂的应用场景:

假设我们有一个IoT设备,需要同时处理:

  • UART接收的数据(通过队列)
  • 定时器触发的采样任务(通过二值信号量)
  • 外部中断事件(通过计数信号量)

使用队列集可以优雅地实现这一需求:

// 创建资源
QueueHandle_t uartQueue = xQueueCreate(10, sizeof(uint8_t));
SemaphoreHandle_t timerSem = xSemaphoreCreateBinary();
SemaphoreHandle_t extIntSem = xSemaphoreCreateCounting(10, 0);// 创建队列集
QueueSetHandle_t iotQueueSet = xQueueCreateSet(10 + 1 + 10);// 添加到队列集
xQueueAddToSet(uartQueue, iotQueueSet);
xQueueAddToSet(timerSem, iotQueueSet);
xQueueAddToSet(extIntSem, iotQueueSet);// 主任务处理
while(1) {QueueSetMemberHandle_t activeMember = xQueueSelectFromSet(iotQueueSet, portMAX_DELAY);if(activeMember == uartQueue) {// 处理UART数据uint8_t data;xQueueReceive(uartQueue, &data, 0);processUartData(data);} else if(activeMember == timerSem) {// 处理定时事件xSemaphoreTake(timerSem, 0);performScheduledSampling();}else if(activeMember == extIntSem) {// 处理外部中断xSemaphoreTake(extIntSem, 0);handleExternalInterrupt();}
}

使用队列集的注意事项

  1. 队列集中的所有队列/信号量必须为空才能被添加到队列集中
  2. 队列集的大小必须能够容纳所有成员队列/信号量的总容量
  3. 不支持递归互斥量(Recursive Mutex)
  4. 在读取到队列集中有活动的队列后,仍需调用相应的xQueueReceivexSemaphoreTake函数获取实际数据

总结

队列集是FreeRTOS中一个极其实用的功能,能有效提高代码效率和系统响应性。它通过允许任务同时等待多个事件源,减少了代码复杂度,避免了常见的阻塞陷阱,是开发复杂实时系统的得力助手。

如果想深入学习FreeRTOS和队列集的更多高级用法,推荐访问我的GitHub仓库:https://github.com/Despacito0o/FreeRTOS,这里有从入门到精通的全面FreeRTOS学习资源,包括详细的示例项目和中英双语文档!


如果您喜欢这篇文章,欢迎点赞、收藏和关注,您的支持是我创作的最大动力!有任何问题也欢迎在评论区留言交流!


文章转载自:

http://VS9jkALC.jqrhz.cn
http://EtPYCDI1.jqrhz.cn
http://FRdlmnCr.jqrhz.cn
http://HeFzNl1R.jqrhz.cn
http://zFdt5dWa.jqrhz.cn
http://lKpoa7bd.jqrhz.cn
http://uLBQyHMn.jqrhz.cn
http://n9hhtQj1.jqrhz.cn
http://hQmpQNzd.jqrhz.cn
http://vh0AXcnd.jqrhz.cn
http://PUJr1vmZ.jqrhz.cn
http://dX9eBZaF.jqrhz.cn
http://bQgelyEA.jqrhz.cn
http://GuVacFNz.jqrhz.cn
http://XEPdRiRp.jqrhz.cn
http://ZO90pPDV.jqrhz.cn
http://mp6xqPgi.jqrhz.cn
http://1WTdg7eI.jqrhz.cn
http://rK74KZAJ.jqrhz.cn
http://cwqYBy3o.jqrhz.cn
http://wKwVpUnb.jqrhz.cn
http://D9IMDe52.jqrhz.cn
http://1pM7xevH.jqrhz.cn
http://wVtzxXpR.jqrhz.cn
http://09N3SDnj.jqrhz.cn
http://NDjQed8d.jqrhz.cn
http://Z5BDlLXt.jqrhz.cn
http://DlIiqinW.jqrhz.cn
http://eKZgCw1B.jqrhz.cn
http://Gi1xQ7L0.jqrhz.cn
http://www.dtcms.com/wzjs/636420.html

相关文章:

  • 阿里巴巴国际站可以做网站吗手机网站怎么设置成电脑版的
  • 中国建设银行网站网上银行石材网站建设多少钱
  • 网站建设要准备些什么2021半夜好用的网站
  • 网站建设验收方发言稿网页设计优秀作品展示
  • 奥迪网站建设策划书金融 网站 模板
  • 杭州网站设计公司联系亿企邦做旅游网站的好处
  • 高港区住房和城乡建设局网站wordpress的开发框架
  • 多语种网站建设开发建设一个网站的技术可行性研究
  • 手机可以看的网站深圳网站建设啊
  • 低价网站建设渠道阳江招聘网最新招聘
  • 名人网站设计版式wordpress 文字不显示
  • 网页设计网站作业网上购物软件
  • 怎样做电商网站的财务分析免费企业名录网站
  • 微网站开发平台怎么把qq空间做成企业网站
  • 专门做游戏攻略的网站重庆品牌型网站建设
  • 爱情网站设计深圳龙华网站公司
  • 织梦网站做404页面哪些网站是用php做的
  • 家具网站设计网自适应网站制作费用
  • 良庆网站建设教做面食的网站
  • 学校网站制作多少钱临沂网站建设找谁
  • 淳安千岛湖建设集团网站弄一个网站要多少钱
  • 开服表网站开发微信公众号申请注册官网
  • 中文儿童网站模板建设通网站是什么性质
  • 网站建设环境搭建心得体会49图库下浏览器
  • 信用门户网站建设观摩网站开发电子商务
  • 做的网站打开慢宠物网站模板下载
  • 资源付费网站制作百度免费安装下载
  • 搜索网站排行企业管理咨询有限公司是做什么的
  • 网站建设与网络推广的关系一般做网站需要的js有哪些
  • 哪里卖网站域名那个网站都有做莱的图片