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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

降低城市内涝风险,万宾科技内涝积水监测仪的作用

频繁的内涝会削弱和损坏城市的关键基础设施,包括道路、桥梁和公用设施。城市内涝风险降低可以减少交通中断事件,也可以保护居民安全并降低路面维修等成本,进一步确保城市基本服务继续发挥作用。对城市可持续发展来讲有效减少内涝的风险是重要…

如何正确使用 JavaScript 中的 slice() 方法

在 JavaScript 中,slice() 是一个常用的数组方法,用于从现有数组中提取一部分元素,然后返回一个新的数组。它是一个非常有用的工具,可以帮助你在不改变原始数组的情况下操作数组的子集。本文将介绍 slice() 的基本概念、使用方法、…

Unity中Shader的矩阵加减法

文章目录 前言一、什么是矩阵矩阵就是一组数的阵列 二、矩阵的加法三、矩阵的负值四、矩阵的减法五、矩阵的表示 前言 Unity中Shader用到的矩阵加减法,以及矩阵的一些基础常识 一、什么是矩阵 矩阵就是一组数的阵列 1 2 3 4 5 6 二、矩阵的加法 两个矩阵相加就是…

GoLong的学习之路(二十三)进阶,语法之并发(go最重要的特点)(锁,sync包,原子操作)

这章是我并发系列中最后的一章。这章主要讲的是锁。但是也会讲上一章channl遗留下的一些没有讲到的内容。select关键字的用法,以及错误的一些channl用法。废话不多说。。。 文章目录 select多路复用通道错误示例并发安全和锁问题描述互斥锁读写互斥锁 syncsync.Wait…

网站安全攻防战:守护数据的钢铁堡垒

在数字化时代,网站的安全性至关重要,因为它不仅关乎用户的隐私信息,还涉及到业务的正常运行。一旦网站受到攻击,可能导致数据泄露、服务中断等问题,因此网站安全应成为企业和个人关注的焦点。本文将探讨网站安全的重要…

前端AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(四)

你可以的&#xff0c;去飞吧&#xff01; 同步代码和异步代码 回调函数地狱和 Promise 链式调用 回调函数地狱 缔造“回调地狱”↓ 制造里层回调错误&#xff0c;却在最外层接收错误→无法捕获 axios源码抛出异常&#xff08;未捕获&#xff09; <!DOCTYPE html> <ht…

万宾科技内涝积水监测仪效果,预警城市积水

当城市之中出现强降雨或者大暴雨&#xff0c;可能会导致雨水不断堆积到城市排水管网之中&#xff0c;可能还会淹没城市的排水系统时&#xff0c;这种现象被称为城市之中的内涝&#xff0c;并且在许多城市之中内涝问题日益引起人们的关注。 内涝积水监测仪的出现成为了希望的灯塔…

leetcode:876. 链表的中间结点

一、题目 函数原型&#xff1a; struct ListNode* middleNode(struct ListNode* head) 二、思路 要找到链表的中间结点&#xff0c;有两种思路&#xff1a; 暴力解法&#xff1a;先遍历一遍链表&#xff0c;计算出链表的长度&#xff0c;再次遍历链表&#xff0c;找到中间结点。…

Window MongoDB安装

三种NOSQL的一种,Redis MongoDB ES 应用场景: 1.社交场景:使用Mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能 2.游戏场景:使用Mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,高效率存储和访问…

[工业自动化-20]:西门子S7-15xxx编程 - 软件编程 - 基本编程指令与梯形图基本元素:位逻辑指令、定时器指令、计数器指令、触发器指令

目录 一、PLC编程的基本指令 1.1 什么是PLC指令 1.2 PLC指令的分类 1.3 PLC指令与梯形图基本元素的关系 三、基本的位运算指令 四、边沿触发指令 4.1 什么是沿 4.2 沿的持续时间 4.3 使用场景 五、定时器指令 六、计数器指令 七、触发器指令 一、PLC编程的基本指令…

WPS数组

一、创建数组方法和数组的读取、修改、写入 数组是值的有序集合&#xff0c;其中的值叫作元素。每个元素有一个数值表示的位置&#xff0c;叫作索引&#xff0c;数组中的不同元素可以是不同数据类型。 function demo(){var arr1[99,"人","abc",[3,4,5]];…

CSS实现图片滑动对比

实现效果图如下&#xff1a; css代码&#xff1a; 知识点&#xff1a;resize: horizontal; 文档地址 <style>.image-slider {position: relative;display: inline-block;width: 500px;height: 300px;}.image-slider>div {position: absolute;top: 0;bottom: 0;left: …