十七、队列
创始人
2025-05-31 15:22:38
0

文章目录

  • 1、基本概念(队列实际上就是一个结构体,可以理解为就是一个数组)
  • 2、使用场景:任务间或任务与中断间传递数据
  • 3、使用队列的好处
    • (1)休眠唤醒
    • (2)提高CPU利用率
  • 4、队列的核心
  • 5、动态创建队列——xQueueCreate()
  • 6、队列删除函数—— vQueueDelete()
  • 7、读队列
    • (1)读队列流程示意图
    • (2)API函数——xQueueReceive()与xQueueReceiveFromISR()
  • 8、写队列
    • (1)写队列流程
    • (2)API函数
      • 1)向队尾写入数据
      • 2)向队头写入数据
  • 9、查询队列
  • 10、复位队列

1、基本概念(队列实际上就是一个结构体,可以理解为就是一个数组)

在这里插入图片描述

队列:即消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息。
即在任务或中断服务程序都可以对队列进行操作。

通过消息队列服务,任务或者中断服务例程可以将一条或多条消息放入队列中;同样一个或多个任务可以从消息队列中获得消息。

支持先进先出原则,也支持后进先出原则。

2、使用场景:任务间或任务与中断间传递数据

3、使用队列的好处

(1)休眠唤醒

任务进行休眠时会执行两步:改变状态和队列链表记录这个任务,具体如下所示:
在这里插入图片描述

(2)提高CPU利用率

即在使用队列后,拥有了休眠唤醒功能,不须像裸机程序一样不断地去查询是否有数据存在等,从而使CPU能够利用这段时间去做一些更加必要的事情。

4、队列的核心

关中断(来实现互斥)
环形缓存区(即一个数组,存放满了之后再从头开始存放,来保存数据)
链表(记录谁在等待队列,来实现休眠和唤醒)

队列的链表可分为两个,一个是等待读的链表,另一个是等待写的链表(如下所示)

List_t xTasksWaitingToSend;
List_t xTasksWaitingToReceive;

5、动态创建队列——xQueueCreate()

在这里插入图片描述
例如:

xQueue = xQueueCreate( 5 , sizeof(int32_t) )

表示创建了一个长度为5、数据大小为4字节的队列。
以前面举例来说,其队列的空间大小是buff的大小加上头部(队列控制块)的大小,而buff的大小为5*4=20个字节。
在这里插入图片描述
当消息队列被创建时,系统会为队列控制块分配对应的内存空间,用于保存消息队列的一些信息如消息的存储位置,头指针 pcHead、尾指针 pcTail、消息大小 uxItemSize 以及队列长度 uxLength,以及当前队列消息个数uxMessagesWaiting 等。

6、队列删除函数—— vQueueDelete()

传输进去的实参是要删除队列的句柄。

7、读队列

(1)读队列流程示意图

在这里插入图片描述

(2)API函数——xQueueReceive()与xQueueReceiveFromISR()

BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait );
BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue,void *pvBuffer,BaseType_t *pxTaskWoken);

在这里插入图片描述

8、写队列

(1)写队列流程

在这里插入图片描述

(2)API函数

在这里插入图片描述

1)向队尾写入数据

/* 等同于 xQueueSendToBack
* 往队列尾部写入数据,如果没有空间,阻塞时间为 xTicksToWait
*/
BaseType_t xQueueSend(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait );
/* 
* 往队列尾部写入数据,如果没有空间,阻塞时间为 xTicksToWait
*/
BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait);
/* 
* 往队列尾部写入数据,此函数可以在中断函数中使用,不可阻塞
*/
BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken );

2)向队头写入数据

/* 
* 往队列头部写入数据,如果没有空间,阻塞时间为 xTicksToWait
*/
BaseType_t xQueueSendToFront( QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait );
/* 
* 往队列头部写入数据,此函数可以在中断函数中使用,不可阻塞
*/
BaseType_t xQueueSendToFrontFromISR( QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);

9、查询队列

 返回队列中可用数据的个数
*/
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
/*
* 返回队列中可用空间的个数
*/
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );

10、复位队列

/* pxQueue : 复位哪个队列;
* 返回值: pdPASS(必定成功)
*/
BaseType_t xQueueReset( QueueHandle_t pxQueue);

相关内容

热门资讯

布局低空,布局引领全球的万亿赛... 当前新质生产力相关的产业已成为最引人注目成长赛道,在众多新质生产力产业中,低空经济是少有的由我国引领...
特斯拉超级充电站餐厅开业,马斯... IT之家 7 月 22 日消息,特斯拉超级充电站餐厅(Supercharger Diner)今日在洛...
算力需求持续火热,人工智能ET... 截至2025年7月22日收盘,中证人工智能产业指数(931071)下跌0.82%。成分股方面涨跌互现...
一图解码:港股IPO一周回顾 ... 过去一周(2025.7.14-7.20),港股IPO市场共有3家公司递交了上市申请,分别为麦济生物、...
最强赛道,呈两极分化!有的猛增... 创新药赛道行情爆火的同时,医药基金的“留人能力”却呈现两极分化。 券商中国记者注意到,根据最新披露的...
菲律宾要失望了,知情人士:美国... 本月初,美国总统特朗普公布多国关税税率,其中,对菲律宾产品征收的“对等关税”从今年4月公布的17%升...
2025年广东省乡村旅游消费趋... 2024年,广东省乡村旅游接待游客5.1亿人次,占全省总旅游接待人次的58.6%;乡村旅游收入达37...
高晓峰:趋势线守卫战告捷 黄金... 来源:市场资讯 7月22日,国际黄金本周初受美元走软及贸易局势影响强势走高。美国通胀数据低于预期,黄...
原创 美... 在我们的日常生活中,电力早已融入了方方面面。我们习惯了出门时确保手机电量充足,家里需要WiFi的连接...
复牌“摘帽”!基金公司第一时间... 【导读】复牌当天再遭基金公司“补刀”,招商基金下调诺泰生物估值 中国基金报记者 若晖 因涉及财务造假...
24年老将、前公募总经理“奔私... 【导读】携手老同事创业,原公募总经理宋小龙备案上海理泉私募基金 中国基金报记者 吴君 又见公募基金总...
科创板开市6周年:已拥有589... 7月22日,科创板迎来开市6周年。这个中国资本市场最年轻的板块已经拥有589家上市公司、超7万亿元总...
科创板六周年!上市公司“掌门人... 【导读】 2025年7月22日,中国资本市场这片热土上,一块名为“科创板”的“试验田”已悄然耕耘六载...
聚焦"稳"... 北京2025年7月22日-- 当前,中国经济正经历深刻转型升级,企业面临市场波动、竞争加剧等多重挑战...
华泰柏瑞港股通时代机遇混合A:... AI基金华泰柏瑞港股通时代机遇混合A(011355)披露2025年二季报,第二季度基金利润292.6...
致179人遇难!韩国12·29... 据韩国《韩民族日报》7月21日报道,韩国国土交通部下属的“航空铁路事故调查委员会”7月19日就去年1...
卧龙电驱:7月21日融券卖出6... 证券之星消息,7月21日,卧龙电驱(600580)融资买入4.49亿元,融资偿还5.59亿元,融资净...
破解堵点卡点,做强国内大循环 国务院常务会议7月16日召开,研究做强国内大循环重点政策举措落实工作,并作出一系列针对性部署。会议指...