十七、队列

news/2024/4/20 15:52:24/文章来源:https://blog.csdn.net/m0_63702526/article/details/129674554

文章目录

  • 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.luyixian.cn/news_show_273977.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebService简单入门

1. JAX-WS发布WebService 创建web工程 创建simple包,和server、client两个子包。正常情况下server和client应该是两个项目,这里我们只是演示效果,所以简化写到一个项目中: 1.1 创建服务类Server package simple.server;import ja…

JavaScript正则表达式知识拓展总结

JavaScript的正则表达式是前端中比较重要的部分,正则表达式主要用于字符串处理,表单验证等场合,实用高效。JavaScript中的正则表达式比起C#中的正则表达式要弱很多,但基本够用了。在js中定义正则表达式很简单,有两种方…

搭建SFTP服务安全共享文件,实现在外远程访问「内网穿透」

文章目录1.前言2.本地SFTP服务器搭建2.1.SFTP软件的下载和安装2.2.配置SFTP站点2.3.Cpolar下载和安装3.SFTP服务器的发布3.1.Cpolar云端设置3.2.Cpolar本地设置4.公网访问测试5.结语1.前言 现在的网络发达,个人电脑容量快速上升,想要保存的数据资料也越…

DRBG_InstantiateSeeded调试-1

public 参数解析: standardEKPolicy: 837197674484b3f81a90cc8d46a5d724fd52d76e06520b64f2a1da1b331469aa(32bytes) rawCmdBuf 命令数据: 800200000063000001314000000100000009400000090000010000000400000000003a0001000b000300720020837197674484b3f81a90cc8d46a5d724fd5…

Baumer工业相机堡盟相机如何使用PixelTransformation像素转换功能(像素转换功能的使用和优点以及行业应用)(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具…

银河麒麟v10系统硬盘挂载并配置yum软件源

一、查看磁盘 近期由于centos系统停止更新用户服务器要更换银河麒麟v10,拿到服务器后使用lsblk -f或fdisk -l命令查看磁盘名称 可以看到sdb200G就是要挂载的硬盘,还没有uuid需要初始化才可以挂载。 二、分区 分区命令: fdisk /dev/【你的…

QML- QML视觉元素类型

QML视觉元素类型一、概述一、图像类型三、共享视觉属性1. 不透明度和可见性2. 转换(转置)一、概述 对于最基本的视觉效果,Qt Quick提供了一个 Rectangle 类型来绘制矩形。这些矩形可以用颜色或垂直渐变来着色。 Rectangle 还可以在矩形上绘制…

QuestDb 基础使用

一、安装 Download QuestDB | QuestDB 可去官网直接下载对应版本,我这里是Windows版本 二、运行 找到Bin目录运行 管理员Cmd,输入 questDb.exe,即可运行,默认webConsole端口 9000,可在bin下 server.config去修改。 效果如下 …

Mac安装Nacos

参考链接: https://nacos.io/zh-cn/docs/quick-start.html 文章目录Nacos安装下载和解压启动和关闭Nacos什么是nacos?Nacos架构基本架构及概念逻辑架构及其组件介绍领域模型数据模型服务领域模型配置领域模型类视图Nacos安装 下载和解压 从链接中下载最新的版本 …

Vue基础25之路由第四节

Vue基础25路由编程式路由导航Home.vue(去掉两个router-line的replace)HomeMessage.vueBanner.vue总结缓存路由组件Home.vueHomeNews.vueHomeMessage.vue总结两个新的生命周期钩子HomeNews.vueHomeMessage.vueHome.vue总结全局路由守卫路由前置守卫src/router/index.js路由后置守…

Qt QShortCut快捷键原理、实现和应用

应用 QShortCut方式的快捷键有好几种使用方式: 1.通过绑定QAction或QMenu的方式。QAction和QMenu都提供了setShortcut()接口; 2.实例化一个对象:然后绑定信号槽activated()信号: auto shortcut new QShortcut(QKeySequence(tr(…

Postgresql源码(102)子事务控制语句分析

1 子事务控制语句分析 1.1 执行savepoint 执行函数: 【立即执行】→DefineSavepoint→PushTransaction(从utility框架进入)【延迟执行】→StartSubTransaction(从顶层事务框架CommitTransactionCommand进入) 准入条…

差分毫伏输出传感器信号隔离转换模块放大器0-10mV/0-20mV/0-±10mV/0-±20mV

概述:DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源,向输入…

代码随想录-57-106. 从中序与后序遍历序列构造二叉树

目录前言题目1.递归(区间,左闭右开)变量2. 本题思路分析:3. 算法实现4. 算法复杂度5. 算法坑点前言 在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想…

Java注解怎么用

什么是注解 Java的注解(Annotation)是一种元数据,它可以提供程序的额外信息,帮助程序员更好地管理程序。注解通常被用作代码的标记或者指定某些行为的方式。在Java中,注解以符号开头,放在代码的各个位置&a…

【数据结构】千字深入浅出讲解队列(附原码 | 超详解)

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:C语言实现数据结构 💬总结:希望你看完…

linux驱动学习加强版-2(文件驱动的书写)

文章目录一、驱动的外设二、驱动操作文件原理三、编写一个驱动程序3.1 编写驱动程序的步骤3.1.2 确定主设备号以及注册驱动3.1.3 实现对应的函数四、一些错误现象一、驱动的外设 我们的设备硬件都需要驱动才能工作,没有驱动的硬件可以称之为废铁,没有硬…

spacesniffer文件大小查看工具安装和使用

软件描述 spacesniffer是一块可以快速查看电脑中所有文件大小的工具,当电脑空间不够时,可以迅速找出不需要的大提及文件。 一、软件下载 1、从网盘下载 spacesniffer文件大小查看工具 2、从官网下载 http://www.uderzo.it/main_products/space_sni…

供水管网微观水力模型

国外在管网建模方面起步于20世纪60年代。20世纪80年代,随着计算机及相应技术的发展,遥测远传设备的应用进入了实用化阶段,国内已有很多供水企业实现了供水管网建模。给水管网系统建模,就是为仿真模拟管网系统动态实时运行情况建立…

【论文阅读总结】用于目标检测的特征金字塔网络(FPN)

Feature Pyramid Networks for Object Detection1.摘要2.引言2.1 低级特征对于检测小物体很重要2.2 算法目标3. 文献综述3.1 Hand-engineered features and early neural networks3.2 Deep ConvNet object detectors3.3 Methods using multiple layers4.Feature Pyramid Networ…