十七、队列

news/2025/2/23 3:10:50

文章目录

  • 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);

http://www.niftyadmin.cn/n/169811.html

相关文章

低代码平台灵魂组件:JVS·逻辑引擎【2.1.7版本更新说明】

低代码开发目前有两大方向,一个是基于库表结构生成CRUD,然后编写业务代码 ;另外一个思路是基于用户前端配置结果,动态生成数据模型,叠加能力引擎渲染成对应工具。 这两种方式 ,前者侧重于技术人员&#xff…

MongoDB增加计算列并修改数据实践笔记

1. 增加、删除列 通过聚合,使用操作符$set增加列;修改结果,需要使用save()。 db.getCollection(trade2019).aggregate([{$set:{sn: {$substr:[$cardasn,0,6]}}}]).forEach(function(x){db.trade2019.save(x) })直接通过操作符$unset删除…

leetcode每日一题28

283. 移动零 第一反应是冒泡 class Solution { public:void moveZeroes(vector<int>& nums) {int sizenums.size();if(size1)return ;for(int i0;i<size;i){for(int j0;j<size-i-1;j){if(nums[j]0&&nums[j1]!0){int temp nums[j1];nums[j1]nums[j];…

Android Studio 中使用 Gradle 配置多渠道打包 配置不同的渠道名称 配置不同的App名称 配置不同的Logo

废话三种操作都是可以混合一起用的&#xff0c;本来也不是很难的事情&#xff0c;为了方便分别理解&#xff0c;这里我就分开处理了。如果需要将打包出来的apk的名称自动命名成指定格式&#xff0c;也可以进行配置&#xff0c;我这里没这个需求&#xff0c;所以这里就不讨论了。…

如何把自有数据接入GPT大模型?

ChatGPT引发了AI革命&#xff0c;大家都想探究如何让它发挥更大价值。 以它为代表的大模型并未完全掌握所有专业知识&#xff0c;这也正是我们创业的契机。 我们应该思考如何让AI在专业领域中释放更大的价值潜能。 就像开发者挖掘出某个鲜为人知的资源一样&#xff0c;我们可以…

Unity学习笔记——unity基础教学视频(DN-qtx)_Day12

2019-8-26视频1&#xff1a;巴拉巴拉巴拉视频2&#xff1a;unity的介绍 应用VR(虚拟显示):把现实拉入虚拟环境中AR(增强显示)&#xff1a;把虚拟信息带入现实中视频3&#xff1a;unity前景 历史游戏引擎概念&#xff1a;.视频4&#xff1a;课程划分&#xff1a;Unity引擎基础Un…

vue3 script setup 语法糖用了才知道有多爽 (三)

文章目录4. context 之 slots 和 attrssetup() 中的 context参数已经弃用的 useContext()5. defineExpose()小结这里是完整的目录图片,由于整篇文章篇幅太长,拆分成了几篇来展示 4. context 之 slots 和 attrs setup() 中的 context参数 我们都知道在 Vue3 语法当中 setup(…

uniapp:仿微信列表长按弹窗菜单

1.创建子组件wxpup.vue <template><view class"wxpup"><view class"shade" v-show"showPup" click"hidePop"><view class"pop" :style"popStyle" :class"{show:showClass}">&l…