当前位置: 首页 > news >正文

FreeRTOS源码阅读笔记3--queue.c

        消息队列可以应用于发送不定长消息的场合,包括任务与任务间的消息交换,队列是
FreeRTOS 主要的任务间通讯方式,可以在任务与任务间、中断和任务间传送信息,发送到
队列的消息是通过拷贝方式实现的,这意味着队列存储的数据是原数据,而不是原数据的
引用。

  • 消息队列控制块

typedef struct QueueDefinition 		
{int8_t *pcHead;					//pcHead 指向队列消息存储区起始位置,即第一个消息空间int8_t *pcWriteTo;				//pcWriteTo 指向队列消息存储区下一个可用消息空间union{QueuePointers_t xQueue;		/*结构体,包含pcTail指向队列消息存储区结束位置地址; pcReadFrom指向出队消息空间的最后一个*/SemaphoreData_t xSemaphore; /*作为信号量时,用的结构体*/} u;List_t xTasksWaitingToSend;	//是一个发送消息阻塞列表,如果队列满了想发送消息的任务会阻塞List_t xTasksWaitingToReceive;//是一个接收消息阻塞列表如果队列为空想接收消息的任务会阻塞volatile UBaseType_t uxMessagesWaiting;//用于记录当前消息队列的消息个数UBaseType_t uxLength;	               //表示队列的长度,Item的数量		UBaseType_t uxItemSize;			       //表示单元消息的大小,Item的大小volatile int8_t cRxLock;	  //队列上锁后,储存从队列收到的列表项数目,也就是出队的数量	volatile int8_t cTxLock;	  //队列上锁后,储存发送到队列的列表项数目,也就是入队的数量#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )uint8_t ucStaticallyAllocated;//如果队列使用的内存是静态分配的,以确保不尝试释放内存, 则设置为pdTRUE#endif#if ( configUSE_QUEUE_SETS == 1 )struct QueueDefinition *pxQueueSetContainer;//队列控制块指针#endif#if ( configUSE_TRACE_FACILITY == 1 )UBaseType_t uxQueueNumber;            //消息队列数量uint8_t ucQueueType;                  //消息队列类型#endif} xQUEUE;

3.1动态创建队列xQueueCreate()

3.1.1函数原型
3.1.2函数框架

xQueueCreate()就是调用xQueueGenericCreate()实现的。

3.2动态创建队列xQueueGenericCreate()

3.2.1函数原型

  • uxQueueLength:队列长度,Item的数量;
  • uxItemSize:消息单元的大小。
  • ucQueueType:消息队列类型:

  • 返回值:队列句柄。
3.2.2函数框架

3.3静态创建队列xQueueCreateStatic()

3.3.1函数原型

3.3.2函数框架

xQueueCreateStatic()由xQueueGenericCreateStatic()函数实现。

3.4静态创建队列xQueueGenericCreateStatic()

3.4.1函数原型

  • uxQueueLength:队列能够存储的最大单元数目,即队列深度;
  • uxItemSize:消息单元的大小;
  • pucQueueStorage:指向自己分配的队列消息存储空间起始地址;
  • pxStaticQueue:指向自己分配的队列起始地址;
  • ucQueueType:消息队列类型;
  • 返回值:队列句柄。
3.4.2函数框架

静态创建队列与动态创建队列的区别就是,静态创建时的队列控制块和队列消息存储空间需要自己预先分配好,再传递起始地址给静态创建函数,类似于任务的动态创建与静态创建的区别。

3.5删除队列vQueueDelete()

3.5.1函数原型

void vQueueDelete( QueueHandle_t xQueue )

  • xQueue :队列句柄。
3.5.2函数框架

3.6队列发送消息xQueueSend()

3.6.1函数原型

  • xQueue:队列句柄;
  • pvItemToQueue:指针,指向要发送到队列尾部的队列消息;
  • xTicksToWait:阻塞时间,如果队列满了,任务就会阻塞 xTicksToWait时间。
  • 返回值:消息发送成功成功返回 pdTRUE,否则返回 errQUEUE_FULL
3.6.2函数框架

 xQueueSend()是一个宏,宏展开是调用函数 xQueueGenericSend()。

xQueueSend()用于向队列尾部发送一个队列消息。消息以拷贝的形式入队,而不是以引用的形式。该函数绝对不能在中断服务程序里面被调用,中断中必须使用带有中断保护功能的 xQueueSendFromISR()来代替。 

3.7队列发送消息xQueueGenericSend()

3.7.1函数原型

  • xQueue:队列句柄;
  • pvItemToQueue:指针,指向要发送到队列尾部的队列消息;
  • xTicksToWait:阻塞时间,如果队列满了,任务就会阻塞 xTicksToWait时间。
  • xCopyPosition:发送数据到消息队列的位置:

  • 返回值:消息发送成功成功返回 pdTRUE,否则返回 errQUEUE_FULL
3.7.2函数框架

3.8队列发送消息xQueueSendFromISR()

3.8.1函数原型

3.8.2函数框架

xQueueSendFromISR也是一个宏,宏展开是调用函数 xQueueGenericSendFromISR()。该宏是 xQueueSend()的中断保护版本,用于在中断服务程序中向队列尾部发送一个队列消息。

3.9队列发送消息xQueueGenericSendFromISR()

3.9.1函数原型

  • xQueue:队列句柄;
  • pvItemToQueue:指针,指向要发送到队列尾部的队列消息;
  • pxHigherPriorityTaskWoken:如果入队导致一个任务解锁,并且解锁的任务优先级高于当前被中断的任务,则将*pxHigherPriorityTaskWoken设置成 pdTRUE,然后在中断退出前需要进行一次上下文切换, 去 执行被唤醒的优先级更高的任务 。
  • 返回值:消息发送成功成功返回 pdTRUE,否则返回 errQUEUE_FULL
3.9.2函数框架

3.10队列发送消息xQueueReceive()

3.10.1函数原型

  • xQueue:队列句柄;
  • pvBuffer:指针,指向要保存接收消息的空间;
  • xTicksToWait:等待时间。
  • 返回值:队列项接收成功返回 pdTRUE ,否则返回 pdFALSE
3.10.2函数框架

3.11队列发送消息xQueueReceiveFromISR()

3.11.1函数原型

  • xQueue:队列句柄;
  • pvBuffer:指针,指向要保存接收消息的空间;
  • pxHigherPriorityTaskWoken:如果有任务因队列满了阻塞发送,现在调用接收函数导致任务恢复,且恢复的任务优先级高于当前被中断的任务,则将*pxHigherPriorityTaskWoken设置成 pdTRUE,这个过程是在 xQueueReceiveFromISR函数里完成的,然后在中断退出前需要进行一次上下文切换, 去执行被唤醒的优先级更高的任务。如果设置成NULL的话,函数就不会*pxHigherPriorityTaskWoken = pdTRUE;
  • 队列项接收成功返回 pdTRUE ,否则返回 pdFALSE
3.11.2函数框架

相关文章:

FreeRTOS源码阅读笔记3--queue.c

消息队列可以应用于发送不定长消息的场合,包括任务与任务间的消息交换,队列是 FreeRTOS 主要的任务间通讯方式,可以在任务与任务间、中断和任务间传送信息,发送到 队列的消息是通过拷贝方式实现的,这意味着队列存储…...

云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统

云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统 通过容器互联搭建一个wordpress博客系统。wordpress系统是需要连接到数据库上的,所以wordpress和mysql的镜像都是需要的。wordpress在创建过程中需要指定一些参数。创建mysql容器时需要把mysql的数据保存在宿主机本…...

java读取OPC DA数据---Utgard

java读取OPC DA数据—Utgard Utgard库已经过时,原作者早已删除库,建议使用OPC UA,兼容OPC DA。 下面讲解Utgard使用 C#和C都不用配置DCOM,直接调用函数 既然是非要用Java,那就别想太方便,需要配置DCOM(后…...

在 Android 上简单安全地登录——使用凭证管理器和密钥

我踏马很高兴地听说, Credential Manager的公开版本将于 11 月 1 日开始提供。Credential Manager 为 Android 带来了身份验证的未来,简化了用户登录应用程序和网站的方式,同时使其更加安全。 登录可能具有挑战性 - 密码经常使用&#xff0c…...

【Python】上市公司数据进行经典OLS回归实操

一、题目二、数据合并、清洗、描述性统计1、数据获取2、数据合并3、选择董监高薪酬作为解释变量的理论逻辑分析 三、多元回归模型的参数估计、结果展示与分析1、描述性统计分析2、剔除金融类上市公司3、对所有变量进行1%缩尾处理4、0-1标准化,所有解释变量5、绘制热…...

科研学习|科研软件——有序多分类Logistic回归的SPSS教程!

一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度:Strongly Disagree——非常不同意,用“0”表示;Disagree——不同意,用“1”表示;Agree--同意,用“2”表示;Strongly Agree--非常…...

微服务简单理解与快速搭建

分布式和微服务 含义 微服务架构 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服…...

QColorDialog开发实例

文章目录 一、QColorDialog基本用法:二、QColorDialog详解三、QColorDialog接口说明静态函数成员函数 四、QColorDialog代码开发实例 QColorDialog 是 Qt 框架中用于选择颜色的对话框类。它提供了一个用户友好的界面,允许用户选择颜色。以下是 QColorDi…...

linux实现全局快捷键

文章目录 第一步:加载KF5GlobalAccel库第二步:代码实现2.1 定义一个QAction2.2 KGlobalAccel::self()注册快捷键3 源码地址有一个需求,就是在应用在后台运行时,用户可以通过快捷键将应用唤起。或者应用响应。 其实就是全局快捷键的功能。 这个功能利用了linux操作系统中的d…...

共享台球室小程序系统:智能化预约与管理

在当今数字化的时代,共享经济模式已经渗透到各个领域。其中,共享台球室作为一个结合了传统与现代元素的项目,越来越受到年轻人的喜爱。为了满足市场需求,我们设计了一款基于微信小程序的共享台球室预约与管理系统,通过…...

百度文心一言

1分钟了解一言是谁? 一句话介绍【文心一言】 我是百度研发的人工智能模型,任何人都可以通过输入【指令】和我进行互动,对我提出问题或要求,我能高效地帮助你们获取信息、知识和灵感哦 什么是指令?我该怎么和你互动&am…...

225.用队列实现栈(LeetCode)

思路 思路:用两个队列实现栈后进先出的特性 ,两个队列为空时,先将数据都导向其中一个队列。 当要模拟出栈时,将前面的元素都导入另一个空队列,再将最后一个元素移出队列 实现 实现: 因为C语言没有库可以…...

汽车FMCW毫米波雷达信号处理流程(推荐---基础详细---清楚的讲解了雷达的过程---强烈推荐)

毫米波雷达在进行多目标检测时,TX发射一个Chirp,在不同距离下RX会接收到多个反射Chirp信号(仅以单个chirp为例)。 雷达通过接收不同物体的发射信号,并转为IF信号,利用傅里叶变换将产生一个具有不同的分离峰值的频谱,每个峰值表示在特定距离处存在物体。 请问,这种多目标…...

8.指令格式,指令的寻址方式

目录 一. 指令格式 二. 扩展操作码 三. 指令寻址 (1)指令寻址 (2)数据寻址 1.直接寻址 2.间接寻址 3.寄存器寻址 4.寄存器间接寻址 5.隐含寻址 6.立即寻址 7.基址寻址 8.变址寻址 9.相对寻址 10.堆栈寻址 一. 指令…...

k8s自定义Endpoint实现内部pod访问外部应用

自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云, 一部分云原生的,一部分是实体的 业务上云期间逐步实现上云,保证各个模块之间的解耦性 比如使…...

[100天算法】-分割等和子集(day 78)

题目描述 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入:…...

共享台球室小程序系统的数据统计与分析功能

随着共享经济的繁荣发展,共享台球室作为一种新型的娱乐方式,越来越受到年轻人的喜爱。为了更好地满足用户需求和提高管理效率,我们设计了一款基于微信小程序的共享台球室预订与管理系统。该系统不仅具备基本的预订和管理功能,还集…...

Istio学习笔记- 服务网格

Istio 服务网格 参考:Istio / Istio 服务网格 Istio 使用功能强大的 Envoy 服务代理扩展了 Kubernetes,以建立一个可编程的、可感知的应用程序网络。Istio 与 Kubernetes 和传统工作负载一起使用,为复杂的部署带来了标准的通用流量管理、遥…...

离散卡尔曼滤波器算法详解及重要参数(Q、R、P)的讨论

公开数据集中文版详细描述参考前文:https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析参考前文:https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析参考…...

伊朗黑客对以色列科技行业发起恶意软件攻击

最近,安全研究人员发现了一场由“Imperial Kitten”发起的新攻击活动,目标是运输、物流和科技公司。 “Imperial Kitten”又被称为“Tortoiseshell”、“TA456”、“Crimson Sandstorm”和“Yellow Liderc”,多年来一直使用“Marcella Flore…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

企业如何增强终端安全?

在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

C++使用 new 来创建动态数组

问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...