十四、队列函数
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…...
用Excel或Python快速验证你的变压器设计:AP法公式的实战应用与参数敏感性分析
用Excel或Python快速验证你的变压器设计:AP法公式的实战应用与参数敏感性分析 在电力电子设计中,变压器作为能量转换的核心部件,其设计合理性直接影响整体系统的效率和可靠性。传统的手工计算不仅耗时费力,更难以快速评估不同参数…...
STM32F407ZET6主控工控板:全面集成PLC与IO卡控制,8路高速脉冲输出与多路光耦隔...
主控STM32F407ZET6控制板PLC工控板FX3U,FX5U,控制IO卡 STM32F407ZET6工控板,包括pcb,原理图 ,/PLC STMF32F407ZET6/FX-3U/PCB生产方案,喜欢可直接联系。 不提供。 板载资源介绍 1. 8路高速脉冲加方向输出,带光耦隔离 2. 16路低速输出,加光耦和…...
暗黑2自动化脚本Botty:解放双手,提升游戏效率的智能助手
暗黑2自动化脚本Botty:解放双手,提升游戏效率的智能助手 【免费下载链接】botty D2R Pixel Bot 项目地址: https://gitcode.com/gh_mirrors/bo/botty 还在为重复刷怪感到枯燥乏味吗?Botty作为专业的暗黑2自动化工具,能够彻…...
Arduino多任务进阶:手把手教你用TaskScheduler实现智能小车避障与巡线‘双模切换’
Arduino多任务实战:智能小车双模切换系统设计与实现 当你的Arduino智能小车需要同时处理避障和巡线功能时,单线程的loop()结构很快就会遇到性能瓶颈。超声波传感器的实时测距与红外传感器的线路检测相互竞争处理器时间,导致响应延迟或功能失效…...
别再当老实人了!用博弈论拆解程序员薪资谈判,教你多拿20%的Offer
程序员薪资谈判实战:用博弈论思维多拿20% Offer 在技术行业,薪资谈判往往是决定职业发展速度的关键环节。许多开发者花费数月刷题准备技术面试,却在最后谈薪阶段草草收场,殊不知这个环节的博弈可能直接影响未来三年的总收入增长曲…...
爬虫登录状态保持实战:用Session和Cookies搞定需要登录的网站(以B站为例)
爬虫登录状态保持实战:用Session和Cookies搞定需要登录的网站(以B站为例) 当你想要爬取B站个人收藏夹、微博私信或者任何需要登录才能访问的数据时,如何保持登录状态就成了一个必须解决的问题。这就像你要进入一个会员制俱乐部&am…...
别再手动种树了!用Forest Pack Pro预设库5分钟搞定3DMAX森林场景
别再手动种树了!用Forest Pack Pro预设库5分钟搞定3DMAX森林场景 当你在3DMAX中手动摆放第100棵树时,是否开始怀疑人生?那些看似简单的森林场景,往往消耗设计师80%的时间在重复劳动上。Forest Pack Pro的预设库功能,彻…...
C源代码生成器调试技巧:解决开发中的常见问题
C#源代码生成器调试技巧:解决开发中的常见问题 【免费下载链接】csharp-source-generators A list of C# Source Generators (not necessarily awesome) and associated resources: articles, talks, demos. 项目地址: https://gitcode.com/gh_mirrors/cs/csharp-…...
Intv_AI_MK11应对Java面试题:自动生成答案解析与知识延伸
Intv_AI_MK11应对Java面试题:自动生成答案解析与知识延伸 1. 效果展示开场 最近在技术社区看到一个有趣的讨论:Java面试准备过程中,最耗时的部分是什么?超过70%的开发者选择了"整理答案解析和知识延伸"。传统方式下&a…...
终极指南:Golang系统编程中系统调用与VDSO的完整实现解析
终极指南:Golang系统编程中系统调用与VDSO的完整实现解析 【免费下载链接】golang-notes Go source code analysis(zh-cn) 项目地址: https://gitcode.com/gh_mirrors/go/golang-notes Golang系统编程是开发高性能应用的关键技能,其中系统调用&am…...
