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函数框架

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

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

相关文章

【原创】java+swing+mysql爱心捐赠管理系统设计与实现

摘要: 爱心捐赠管理系统旨在管理和优化捐赠过程,提高效率,增强透明度,并鼓励更多的个人和企业参与公益捐赠,用户可以捐款或者捐物。本系统采用javaswing界面可视化技术,数据库使用mysql。 功能分析&#…

Python高级语法----深入理解Python迭代器与生成器

文章目录 1. 迭代器协议代码示例:2. 生成器基础代码示例:3. 使用yield的高级技巧代码示例:4. 生成器表达式代码示例:迭代器和生成器是Python中实现迭代的两种主要方式,它们都允许用户创建可以遍历数据集的对象。在Python中,迭代器协议是指对象需要遵守__iter__()和__next…

【大数据】NiFi 中的处理器(一):GenerateTableFetch

NiFi 中的处理器(一):GenerateTableFetch 1.简介2.应用场景3.示例3.1 案例一:无输入流文件,来源表含增量字段3.2 案例二:无输入流文件,不含增量字段3.3 案例三:无输入流文件&#xf…

通用文件在线预览软件kkFileView

什么是 kkFileView ? kkFileView 为文件文档在线预览解决方案,基本支持主流办公文档的在线预览,如 doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip&…

如何配置《动手学强化学习》的环境

如何配置《动手学强化学习》的环境 网站:https://hrl.boyuai.com/chapter/intro github仓库:https://github.com/boyu-ai/Hands-on-RL/tree/main 可以看到该教程要求使用gym0.18.3版本的gym库,本教程可以用于解决绝大多数需要使用Pendulum-…

科力雷达Lidar使用指南

科力2D Lidar使用指南 作者: Herman Ye Galbot Auromix 版本: V1.0 测试环境: Ubuntu20.04(x86) PC 以及 Ubuntu20.04(Arm) Nvidia Orin 更新日期: 2023/11/11 注1: 本文内容中的硬件由 Galbot 提供支持。 注2&#x…

力扣100题——子串

560.和为k的子数组 这道题目不是滑动窗口的类型,因为长度并不是固定的。(好的,我在说废话) 注意题目要求是子数组,且是连贯的。那这里的话,解法有很多,最简单的就是暴力解法,但在这…

无缝集成GORM与Go Web框架

探索GORM与流行的Go Web框架之间的和谐集成,以实现高效的数据管理 高效的数据管理是每个成功的Web应用程序的基础。GORM,多才多艺的Go对象关系映射库,与流行的Go Web框架非常搭配,提供了无缝集成,简化了数据交互。本指…

Git可视化界面的操作,SSH协议的以及IDEA集成Git

目录 一. Git可视化界面的操作 二. gitee的ssh key 2.1 SSH协议 2.2 ssh key 三. IDEA集成Git 3.1 分享项目 3.2 下载项目 一. Git可视化界面的操作 上一篇博客只用到了git的命令窗口,现在就来看看可视化窗口要怎么操作。 点击Git GUI Here GUI界面 在g…

【Git】git常用命令大全

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Git》。🎯🎯 &#x1f449…

afsim 下载链接

afsim是一个通用的建模框架,能够构建典型的虚拟威胁环境和相关模型。能够以可视化形式分析软件仿真结果,显示平台、路由、传感器区域等内容,能够基于事件生成图表,进行结果统计,能够按类型进行统计分析。 苦于网上没有…

【Git】Git分支与应用分支

一,Git分支 1.1 理解Git分支 在 Git 中,分支是指一个独立的代码线,并且可以在这个分支上添加、修改和删除文件,同时作为另一个独立的代码线存在。一个仓库可以有多个分支,不同的分支可以独立开发不同的功能&#xff0…

maven教程

1. Maven概述 1.1 Maven的功能 1、Maven 作为依赖管理工具 随着我们使用越来越多的框架,或者框架封装程度越来越高,项目中使用的jar包也越来越多。项目中,一个模块里面用到上百个jar包是非常正常的。jar包所属技术的官网通常是英文界面&am…

极智芯 | 存算一体 弯道超车的希望

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 存算一体 弯道超车的希望。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:…

【C++笔记】优先级队列priority_queue的模拟实现

【C笔记】优先级队列priority_queue的模拟实现 一、优先级队列的介绍与使用方式1.1、优先级队列介绍1.2、优先级队列的常见使用 二、优先级队列的模拟实现1.0、仿函数的介绍1.1、构造函数1.2、优先级队列的插入push1.3、优先级队列的删除(删除堆顶元素)1.4、获取堆顶元素1.5、判…

MATLAB仿真通信系统的眼图

eyediagram eyediagram(complex(used_i,used_q),1100)

【Java 进阶篇】Java 中 JQuery 对象和 JS 对象:区别与转换

在前端开发中,经常会涉及到 JavaScript(JS)和 jQuery 的使用。这两者都是前端开发中非常重要的工具,但它们之间存在一些区别。本文将详细介绍 Java 中的 JQuery 对象和 JS 对象的区别,并讨论它们之间的转换方法。 1. …

Amazon Aurora MySQL 与 Amazon Redshift 的 Zero ETL 集成已全面可用,一起轻松上手!

“数据是应用、流程和商业决策的核心。” 亚马逊云科技数据库、 数据分析和机器学习全球副总裁 Swami Sivasubramanian 如今,客户常用的数据传输模式是建立从 Amazon Aurora 到 Amazon Redshift 的数据管道。这些解决方案能够帮助客户获得新的见解,进而…

【C/C++笔试练习】内联函数、函数重载、调用构造函数的次数、赋值运算符重载、静态成员函数、析构函数、模板定义、最近公共祖先、求最大连续bit数

文章目录 C/C笔试练习选择部分(1)内联函数(2)函数重载(3)调用构造函数的次数(4)赋值运算符重载(5)静态成员函数(6)调用构造函数的次数…

微信小程序和H5之间互相跳转、互相传值

微信小程序和内嵌 H5 之间来回跳转,来回交互。 1 微信小程序跳转 H5 1.2. web-view 微信小程序官方提供了 web-view 组件来实现微信小程序跳转到 H5 页面,实现的方式也很简单,具体实现方式如下: 1、新建一个页面用来单独存放 we…