本篇4K,立志最细,FreeRtos中Queue使用教程与个人理解!!!

                                前言:编写不易,请勿搬运,仅供学习参考!!!

目录

FreeRtos中Queue的使用

Queue创建

Queue实际调用

动态创建和静态区别

Queue接受数据

Queue实际调用

Queue发送数据

Queue实际调用

Queue队列集使用


FreeRtos中Queue的使用

        在FreeRtos操作系统中,Queue是一种用在Task之间传输数据的方法,这种方法传输数据的同时,可以满足互斥同步阻塞唤醒,是一种最为常用的传输数据手段,主要特性有FIFO,同时Queue会自动管理数据的插入删除,当读出来一个数据的时候,这个数据会自动从Queue里面删除,同时使用队列来传输数据,是最稳妥的手段。

Queue创建

QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
函数参数相关作用
uxQueueLength用来确定队列里面存放多少个数据元素
uxItemSize队列里面数据的大小,单位是字节
函数返回值句柄:代表创建成功 ,NULL:创建失败

        这里是动态创建Queue函数跟需要的参数,以及参数的意思,下面是静态创建Queue的函数原型,跟参数意思。

QueueHandle_t xQueueCreateStatic( UBaseType_t uxQueueLength,UBaseType_t uxItemSize,uint8_t *pucQueueStorageBuffer,Static Queue_t *pxQueueBuffer);
函数参数相关作用
uxQueueLength用来确定队列里面存放多少个数据元素
uxItemSize队列里面数据的大小,单位是字节
uint8_t *pucQueueStorageBuffer自定义的Queue存储空间
StaticQueue_t *pxQueueBuffer队列控制块,负责管理内部信息
函数返回值句柄:代表创建成功 ,NULL:创建失败

        注意,uint8_t *pucQueueStorageBuffer参数的大小应该是,uxQueueLength*uxItemSize的大小,不能比这个少,不然就放不下。这里静态创建跟动态相比多了两个参数,因为所有的静态创建都需要,主动确定分配空间的大小,动态创建就不用,同时pxQueueBuffer填写这个位置的参数,需要声明为StaticQueue_t类型才能填写。

Queue实际调用

struct rotary_data {int32_t cnt;int32_t speed;
};
struct input_data {uint32_t dev;uint32_t val;  
};static uint8_t g_ucQueueRotaryBuf[10*sizeof(struct rotary_data)];
static StaticQueue_t g_xQueueRotaryStaticStruct;g_xQueuePlatform = xQueueCreate(10, sizeof(struct input_data));
g_xQueueRotary   = xQueueCreateStatic(10, sizeof(struct rotary_data), g_ucQueueRotaryBuf, &g_xQueueRotaryStaticStruct);

        这里使用结构体来传输数据,所以计算结构体数据的大小,作为参数填写到,Queue创建声明的参数。

动态创建和静态区别

        这两种创建方式的主要区别在于,内存分配方式和时机,动态创建也需要内存,前者内存由FreeRtos中的内存管理器分配Heap的内存给他,静态创建内存管理器不会分配,需要自己定义使用空间大小,同时删除静态创建任务,任务使用的内存空间是不会返回的。

        总结下来最大的区别在于,动态分配不需要确定使用空间大小,删除释放使用空间,静态分配使用前要确定内存空间大小,删除创建不会释放使用的内存空间。

Queue接受数据

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

        上面是函数原型,两个函数区别在于后缀有FromISR的函数能在中断中用,上文有提交,使用xQueueReceive()函数读队列数据读出来之后,数据会自动被Queue给移除

函数参数参数解释
xQueue读那个队列填写它的句柄
pvBuffer从队列里面读取的数据,放到这个参数里面。
xTicksToWait

0:没有数据立即返回

portMAX_DELAY:没有数据阻塞到有数据

返回值

pdPASS:从队列读出数据入

errQUEUE_EMPTY:读取失败,因为队列空了。

       这个函数的返回值因为不是句柄,一般不需要取,需要注意的是,存放读取数据的变量跟 0或者portMAX_DELAY值的敲定。

Queue实际调用

struct rotary_data {int32_t cnt;int32_t speed;
};
struct input_data {uint32_t dev;uint32_t val;  
};static uint8_t g_ucQueueRotaryBuf[10*sizeof(struct rotary_data)];
static StaticQueue_t g_xQueueRotaryStaticStruct;g_xQueuePlatform = xQueueCreate(10, sizeof(struct input_data));
g_xQueueRotary   = xQueueCreateStatic(10, sizeof(struct rotary_data), g_ucQueueRotaryBuf, &g_xQueueRotaryStaticStruct);
struct input_data idata;
xQueueReceive( g_xQueuePlatform,&idata,portMAX_DELAY);

        这里读g_xQueuePlatform的数据,放入了idata里面,如果读不到数据,陷入阻塞状态,什么时候有了数据,就会唤醒,然后读取数据。

Queue写数据

BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait);
BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken );

        上面是写数据的函数同样的ISR这个函数,能用在中断里面,因为Queue的FIFO的原因,后写进去的数据,会在首先进去的后面,下面是函数参数说明。

函数参数参数解释
xQueue

填写谁的句柄数据就会写到哪一个队列

pvItemToQueue需要写进去队列的数据,这个数据需要取地址
xTicksToWait

0:无法写进去数据会立即返回

portMAX_DELAY:没有写进去数据会进入阻塞状态

返回值

errQUEUE_FULL:写入失败,因为队列满了。

pdPASS:数据成功写入了队列

               这里写Queue需要注意的是,写入Queue的数据需要取地址

Queue实际调用

	if( xTimerQueue != NULL ){/* Send a command to the timer service task to start the xTimer timer. */xMessage.xMessageID = xCommandID;xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer;if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ){if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ){xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait );}else{xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY );}}else{xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );}traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn );}

        这里的话xTicksToWait并没有取值0或者portMAX_DELAY,这个值你可以指定一个具体的等待时间,表示任务最多等待多少个调度滴答(tick)单位。

        如果填写具体的等待时间,不是0或者portMAX_DELAY也是可以的。

                           我是大狗,欢迎指正,欢迎三连,希望对你,有所帮助!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551440.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

golang 获取证书的生效及过期时间

测试样例 func TestGetCertVaildTime(t *testing.T) {certPEM, err : ioutil.ReadFile("aa.bbb.com.crt")if err ! nil {fmt.Println("读取证书文件出错:", err)return}// 解码PEM格式的证书block, _ : pem.Decode(certPEM)if block nil {fmt.Println(&q…

智源研究院推出全球首个中文大模型辩论平台FlagEval Debate

近日&#xff0c;智源研究院推出全球首个中文大模型辩论平台FlagEval Debate&#xff0c;旨在通过引入模型辩论这一竞争机制对大语言模型能力评估提供新的度量标尺。该平台是智源模型对战评测服务FlagEval大模型角斗场的延展&#xff0c;将有助于甄别大语言模型的能力差异。 F…

vector中push_back和emplace_back的区别

push_back 在引入右值引用&#xff0c;转移构造函数&#xff0c;转移复制运算符之前&#xff0c;通常使用push_back()向容器中加入一个右值元素&#xff08;临时对象&#xff09;的时候&#xff0c;首先会调用构造函数构造这个临时对象&#xff0c;然后需要调用拷贝构造函数将…

Redis入门第一步:认识Redis与快速安装配置

认识Redis与快速安装配置&#x1f343; Redis是什么&#x1f432; 1.Redis的背景&#x1f38d; Redis&#xff08;Remote Dictionary Server&#xff09;译为"远程字典服务"&#xff0c;它是一款基于内存实现的键值型 NoSQL 数据库&#xff0c; 通常也被称为数据结…

pytorch线性/非线性回归拟合

一、线性回归 1. 导入依赖库 import numpy as np import matplotlib.pyplot as plt import torch from torch import nn, optim from torch.autograd import Variable numpy&#xff1a;用来构建数据matplotlib.pyplot&#xff1a; 将构建好的数据可视化torch.nn&#xff1a…

2024还在拼多多赚钱的,无不满足这几个条件

拼多多只是我棋盘上的一小步&#xff0c;整个棋局几人看懂了&#xff1f; 如果我说我做拼多多&#xff0c;其实是另有目的&#xff0c;拼多多只是我棋局里的一小步&#xff0c;你们信吗&#xff1f;认真看文章&#xff0c;后面会为大家揭秘&#xff01; 先来客观公正的回答下…

Queued Synchronous Peripheral Interface (QSPI)

文章目录 1. 介绍2. Feature List3. 概述3.1 QSPI框图3.2 操作模式3.3 三线模式3.4 时钟极性和时钟相位 4. Master模式4.1 状态机4.2 采样点4.3 波特率4.4 通信模式4.4.1 短数据模式4.4.2 长数据模式4.4.3 短连续模式4.4.4 长连续模式4.4.5 单配置多帧模式4.4.6 XXL模式4.4.7 M…

选择国企eHR人事管理系统的时候,应该注意什么?

近年来&#xff0c;中国正步入高速发展的黄金时期&#xff0c;国有企业&#xff08;国企&#xff09;在追求效率和管理水平提升方面迈出了重要步伐。为了进一步实现数字化、流程化和科学化管理&#xff0c;越来越多的国企选择引进eHR&#xff08;电子人力资源管理&#xff09;系…

【Diffusion分割】MedSegDiff-v2:Diffusion模型进行医学图像分割

MedSegDiff-V2: Diffusion-Based Medical Image Segmentation with Transformer 摘要&#xff1a; 最近的研究揭示了 DPM 在医学图像分析领域的实用性&#xff0c;医学图像分割模型在各种任务中表现出的出色性能就证明了这一点。尽管这些模型最初是以 UNet 架构为基础的&…

opencv实战项目(三十):使用傅里叶变换进行图像边缘检测

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一&#xff0c;什么是傅立叶变换&#xff1f;二&#xff0c;图像处理中的傅立叶变换&#xff1a;三&#xff0c;傅里叶变换进行边缘检测&#xff1a; 一&#xff0c…

13个大V出文需要准确把握的重要因素

推文作为全球最大的社交平台之一&#xff0c;吸引了很多大V&#xff08;即具有巨大粉丝团的影响力和的账户&#xff09;的关注。那些大V常常运用推文发布相关各种各样热点的营销推广信息&#xff0c;以吸引更多人的关注参与。推文的发布时间段是V在宣传推广过程中需要准确把握的…

【真实访问】那些选择土木专业的学生,后来怎么样了?

“你会让孩子报土木专业吗&#xff1f;” 7月15日&#xff0c;澎湃新闻在微博上发起线上调研&#xff0c;截至16日12时&#xff0c;8000多人参与了投票&#xff0c;结果显示近7000人选择“不会&#xff0c;天坑专业”。短短几年时间&#xff0c;土木工程专业的报考从“香饽饽”…

CAN总线的错误类型

前言 CAN总线的错误类型主要包括&#xff1a;位错误、填充错误、格式错误、ACK错误和CRC错误。这里一定要做好CAN总线的错误类型、错误帧类型、节点状态之间的区别。 错误类型是帧传输出错的原因类型&#xff1b;错误帧类型&#xff08;主动错误帧、被动错误帧&#xff09;是帧…

基于IntraWeb的数据表格的多选实现

基于IntraWeb的数据表格的多选实现 既可以单条操作&#xff0c;也可以多选操作。 delphi源代码。 BS开发Web网站开发&#xff0c;不需要安装服务器&#xff0c;Apache和IIS都不需要&#xff0c;自带企业级服务器。 运行exe服务器就架好了&#xff0c;直接打开手机浏览器或者…

Zombie Slaughter 写实30个僵尸丧尸带动画角色模型

包含30个操纵的僵尸(15个男性和15个女性角色)+动画 所有僵尸都有分离的身体部位,以获得更好的射击/砍杀体验:) PBR材质包含4种纹理(基色、法线、粗糙度、AO),分辨率为4096x4096。 动画包括: -闲置 -步行 - 走回去 - 向右转 - 向左转 -担心 -尖叫 - 走路惹 -快跑 -阿格罗…

人工智能与伦理:如何确保AI应用中的隐私保护

引言 随着人工智能技术的飞速发展&#xff0c;AI已经渗透到我们生活的各个领域&#xff0c;从智能助手到个性化推荐系统&#xff0c;再到医疗诊断和金融服务&#xff0c;人工智能正在为我们带来前所未有的便利。然而&#xff0c;伴随着AI的广泛应用&#xff0c;隐私保护问题日益…

优选驾考系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;驾校管理&#xff0c;驾考文章管理&#xff0c;驾照类型管理&#xff0c;报名入口管理&#xff0c;学员报名管理&#xff0c;练车预约管理&#xff0c;考试场地管理 微信端账号功能包括&#xff1a;系统…

加油卡APP系统:省时、优惠、安心!

在汽车加油的刚需下&#xff0c;如何更加优惠的“加油”成为了大众关心的重点&#xff0c;而以优惠为主的加油卡系统也成为了大众的主要选择。 加油卡系统是汽车加油线上的服务系统&#xff0c;拥有全国各地的加油站权限&#xff0c;能够让车主在手机上进行充值&#xff0c;同…

VMware虚拟机连接公网,和WindTerm

一、项目名称 vmware虚拟机连接公网和windterm 二、项目背景 需求1&#xff1a;windows物理机&#xff0c;安装了vmware虚拟机&#xff0c;需要访问公网资源&#xff0c;比如云服务商的yum仓库&#xff0c;国内镜像加速站的容器镜像&#xff0c;http/https资源。 需求2&#xf…

【git】git分支之谜-十分钟给你讲透彻

这里写自定义目录标题 引子分支的直观模型在 git 中&#xff0c;分支是完整的提交记录分支用commit ID存储人们的直觉通常并没有那么错rebase 使用“直观”的分支概念merge也使用“直观”的分支概念github pull request 也使用直观的想法直觉很好&#xff0c;但它也有一些局限性…