十四、队列函数
1、概述
(1)使用队列的流程:创建队列、写队列、读队列、删除队列。
2、创建
队列的创建有两种方法:动态分配内存、静态分配内存。
2.1、动态分配内存
(1)函数:xQueueCreate,队列的内存再函数内部动态分配。
(2)函数原型如下:
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
(3)参数说明
| 参数 | 说明 |
| uxQueueLength | 队列长度,最多能存放多少个数据(item) |
| uxItemSize | 每个数据(item)的大小:以字节为单位 |
| 返回值 | 非0:成功,返回句柄,以后使用句柄来操作队列 NULL:失败,因为内存不足 |
2.2、静态分配内存
(1)函数:xQueueCreateStatic,队列的内存要事先分配好。
(2)函数原型如下:
QueueHandle_t xQueueCreateStatic(UBaseType_t uxQueueLength,UBaseType_t uxItemSize,uint8_t *pucQueueStorageBuffer,StaticQueue_t *pxQueueBuffer
);
(3)参数说明
| 参数 | 说明 |
| uxQueueLength | 队列长度,最多能存放多少个数据(item) |
| uxItemSize | 每个数据(item)的大小:以字节为单位 |
| pucQueueStorageBuffer | 如果uxItemSize非0,pucQueueStorageBuffer必须指向一个 uint8_t数组,此数组大小至少为"uxQueueLength * uxItemSize" |
| pxQueueBuffer | 必须执行一个StaticQueue_t结构体,用来保存队列的数据结构 |
| 返回值 | 非0:成功,返回句柄,以后使用句柄来操作队列 NULL:失败,因为pxQueueBuffer为NULL |
(4)示例代码
// 示例代码
#define QUEUE_LENGTH 10
#define ITEM_SIZE sizeof( uint32_t )// xQueueBuffer用来保存队列结构体
StaticQueue_t xQueueBuffer;// ucQueueStorage 用来保存队列的数据
// 大小为:队列长度 * 数据大小
uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];void vATask( void *pvParameters )
{QueueHandle_t xQueue1;// 创建队列: 可以容纳QUEUE_LENGTH个数据,每个数据大小是ITEM_SIZExQueue1 = xQueueCreateStatic( QUEUE_LENGTH,ITEM_SIZE,ucQueueStorage,&xQueueBuffer );
}
3、复位
(1)队列刚被创建时,里面没有数据;使用过程中可以调用 xQueueReset() 把队列恢复为初始状态。
(2)函数原型:
/* pxQueue: 复位哪个队列;* 返回值: pdPASS(必定成功)*/
BaseType_t xQueueReset( QueueHandle_t pxQueue);
4、删除
(1)删除队列的函数为 vQueueDelete() ,只能删除使用动态方法创建的队列,它会释放内存。
(2)函数原型:
void vQueueDelete( QueueHandle_t xQueue );
5、写队列
(1)可以把数据写到队列头部,也可以写到尾部,这些函数有两个版本:在任务中使用、在ISR中使用。
(2)函数原型:
/* 等同于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);/** 往队列头部写入数据,如果没有空间,阻塞时间为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);
(3)参数说明
| 参数 | 说明 |
| xQueue | 队列句柄,要写哪个队列 |
| pvItemToQueue | 数据指针,这个数据的值会被复制进队列, 复制多大的数据?在创建队列时已经指定了数据大小 |
| xTicksToWait | 如果队列满则无法写入新数据,可以让任务进入阻塞状态, xTicksToWait表示阻塞的最大时间(Tick Count)。 如果被设为0,无法写入数据时函数会立刻返回; 如果被设为portMAX_DELAY,则会一直阻塞直到有空间可写。 |
| 返回值 | pdPASS:数据成功写入了队列 errQUEUE_FULL:写入失败,因为队列满了。 |
6、读队列
(1)使用 xQueueReceive() 函数读队列,读到一个数据后,队列中该数据会被移除。这个函数有两个版本:在任务中使用、在ISR中使用。
(2)函数原型:
BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait );BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue,void *pvBuffer,BaseType_t *pxTaskWoken );
(3)参数说明
| 参数 | 说明 |
| xQueue | 队列句柄,要读哪个队列 |
| pvBuffer | bufer指针,队列的数据会被复制到这个buffer 复制多大的数据?在创建队列时已经指定了数据大小 |
| xTicksToWait | 如果队列空则无法读出数据,可以让任务进入阻塞状态, xTicksToWait表示阻塞的最大时间(Tick Count)。 如果被设为0,无法读出数据时函数会立刻返回; 如果被设为portMAX_DELAY,则会一直阻塞直到有数据可写 |
| 返回值 | pdPASS:从队列读出数据入 errQUEUE_EMPTY:读取失败,因为队列空了。 |
7、查询
(1)可以查询队列中有多少个数据、有多少空余空间。
(2)函数原型:
/** 返回队列中可用数据的个数*/
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );/** 返回队列中可用空间的个数*/
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
8、覆盖/偷看
8.1、覆盖
(1)当队列长度为1时,可以使用 xQueueOverwrite() 或 xQueueOverwriteFormISR() 来覆盖数据。注意,队列长度必须为1。当队列满时,这些函数会覆盖里面的数据,这也意味着这些函数不会被阻塞。
(2)函数原型:
/* 覆盖队列* xQueue: 写哪个队列* pvItemToQueue: 数据地址* 返回值: pdTRUE表示成功, pdFALSE表示失败*/
BaseType_t xQueueOverwrite(QueueHandle_t xQueue,const void * pvItemToQueue);BaseType_t xQueueOverwriteFromISR(QueueHandle_t xQueue,const void * pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);
8.2、偷看
(1)如果想让队列中的数据供多方读取,也就是说读取时不要移除数据,要留给后来人。那么可以使用"窥视",也就是 xQueuePeek() 或 xQueuePeekFromISR() 。这些函数会从队列中复制出数据,但是不移除数据。这也意味着,如果队列中没有数据,那么"偷看"时会导致阻塞;一旦队列中有数据,以后每次"偷看"都会成功。
(2)函数原型:
/* 偷看队列* xQueue: 偷看哪个队列* pvItemToQueue: 数据地址, 用来保存复制出来的数据* xTicksToWait: 没有数据的话阻塞一会* 返回值: pdTRUE表示成功, pdFALSE表示失败*/
BaseType_t xQueuePeek(QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait);BaseType_t xQueuePeekFromISR(QueueHandle_t xQueue,void *pvBuffer,);相关文章:
十四、队列函数
1、概述 (1)使用队列的流程:创建队列、写队列、读队列、删除队列。 2、创建 队列的创建有两种方法:动态分配内存、静态分配内存。 2.1、动态分配内存 (1)函数:xQueueCreate,队列的内存再函数内部动态分配。 (2)函数原型如下&…...
使用高防服务器有什么好处?103.216.155.x
为什么建议租用高防服务器 第一,高防服务器由于业务的特殊性,本身机器的配置要求高,服务器的价格相比普通的贵,而且,机器还有维护费、托管费等,这会让运营的成本上升。 第二,租用高防服务器&a…...
Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架
在去年2022年曾发布一篇关于脚手架的文章:“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本,导致一些细节的实现存在不同。在本文中,将从头开始介绍整个脚手架的搭建过程。 一、新建项目模块 在…...
Git合并某个分支上的某个提交
1. 首先,确保你当前所在的分支是你要合并分支的父分支。你可以使用以下命令切换到父分支: git checkout <父分支名称> 2. 确保你要合并的分支是可用的。你可以使用以下命令查看所有可用的分支: git branch -a 这将显示所有本地和远程…...
在pytorch中对于张量维度的理解
原文参考链接: https://blog.csdn.net/qq_36930921/article/details/121670945. https://zhuanlan.zhihu.com/p/356951418 张量的计算:https://zhuanlan.zhihu.com/p/140260245 学习过程中对知识的补充学习,谨防原文失效,请大家支…...
JAVA高级教程Java HashMap表达式(7)
目录 7、HashMap的使用students类 7、HashMap的使用 students类 package Map01;import java.util.Objects ;public class Students implements Comparable<Students>{private String name;private int stuNO;public Students() {}public Students(String age, int stuN…...
【iOS】JSON解析
JSON在Web开发和网络通信和传输中广泛应用,常用于存储和传输数据,这些数据一般也都是JSON格式,可以说绝大多数网络请求传输的数据都是JSON格式 在之前有关网络请求文章中,实现了网络数据加载流程,并对加载下来的JSON数…...
华为OD 最大差(100分)【java】A卷+B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...
打印新闻标题,使用封装get、set方法,打印前15个字符串
package day21; import java.util.ArrayList; import java.util.Collections;/*** author monian* Wo yi wu ta,wei shou shu er!*/ public class Homework01 {SuppressWarnings({"all"})public static void main(String[] args) {News news1 new News("新冠确…...
FL Studio21中文版本好用吗?值不值得下载
今天,我从一个FL Studio忠实且还算资深的用户角度,来为大家深度介绍并评测一下FL Studio的性能以及我四年的使用感受。 FL Studio是一款集剪辑、编曲、录音、混音一体的全能DAW(数字音频工作站)。其所有界面都是支持100%矢量化的…...
微信小程序进阶——Flex弹性布局轮播图会议OA项目(首页)
目录 一、Flex弹性布局 1.1 什么是Flex弹性布局 1.1.1 详解 1.1.2 图解 1.1.3 代码演示效果 1.2 Flex弹性布局的核心概念 1.3 Flex 弹性布局的常见属性 1.4 Flex弹性布局部分属性详解 1.4.1 flex-direction属性 1.4.2 flex-wrap属性 1.4.3 flex-flow属性 1.4.4 ju…...
工程监测仪器振弦传感器信号转换器在桥梁安全监测中的重要性
工程监测仪器振弦传感器信号转换器在桥梁安全监测中的重要性 桥梁是人类社会建设过程中最重要的交通基础设施之一,对于保障人民出行、促进经济发展具有极其重要的作用。由于桥梁结构在长期使用过程中受到环境因素和负荷的影响,会逐渐发生变形和损伤&…...
ArduPilot开源飞控之AP_OpticalFlow
ArduPilot开源飞控之AP_OpticalFlow 1. 源由2. 框架设计2.1 启动代码2.2 任务代码 update2.3 任务代码 handle_msg2.4 任务代码 handle_msp2.5 任务代码 do_aux_function 3. 重要例程3.1 AP_OpticalFlow3.2 init3.3 update3.4 handle_msg3.5 handle_msp3.6 start_calibration3.…...
RHCE8 资料整理(二)
RHCE8 资料整理 第二篇 用户及权限管理第8章 用户管理8.1 基本概念8.2 管理用户8.2.1 创建用户8.2.2 修改用户属性 8.3 用户的密码策略8.4 用户授权8.5 重置root密码 第9章 权限管理9.1 所有者和所属组9.2 查看及修改权限9.3 数字权限9.4 默认权限9.5 特殊权限9.6 隐藏权限 第1…...
pytest合集(11)— conftest.py文件
1、conftest.py文件 conftest.py文件是pytest框架中的一个特殊文件,用于定义共享的设置、夹具(fixture)和钩子函数(hook)。 在pytest中,conftest.py文件可以用于在整个测试项目中共享夹具、配置和钩子函数。通过在conftest.py文…...
completablefuture的使用
CompletableFuture使用详解 【Java异常】Variable used in lambda expression should be final or effectively final CompletableFuture原理与实践-外卖商家端API的异步化 项目描述 项目接口需要从下游多个接口获取数据,并且下游的网络不稳定还会涉及到循环调用…...
51单片机的时钟系统
1.简介 51内置的时钟系统可以用来计时,与主程序分割开来,在计时过程中不会终端主程序,还可以通过开启时钟中断来执行相应的操作。 2.单片机工作方式 单片机内部有两个十六位的定时器T0和T1。每个定时器有两种工作方式选择,分别…...
神经网络的问题总结
神经网络目前可以分为以下几类问题,每类问题都有其特点和不断取得的进展: 分类问题: 特点:在给定一组数据点的情况下,将它们分为不同的类别。进展:神经网络在图像分类、文本分类、音频分类等方面取得了显著…...
树莓派图像处理基础知识
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、基本函数1. cvtColor(src,tmp,COLOR_BGR2RGB);2.在OpenCV和Qt中,转换cv::Mat到QImage3.Canny(tmp,dst,30,255);4.dst matframe.clone();5.video…...
Kotlin中的Lambda表达式基本定义和使用
在Kotlin中,Lambda表达式是一种简洁的方式来定义匿名函数。Lambda表达式可以作为函数的实际参数或者返回值,使得函数成为高阶函数。本篇博客将介绍Lambda表达式的基本概念以及使用方法,并提供相关的示例代码。 Lambda表达式的基本概念 Lamb…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
