FreeRTOS学习笔记-基于stm32(8)消息队列

一、什么是消息队列

        队列是不同任务、中断中数据传递的一种机制,又称消息队列。就类似于全局变量,将数据传输到不同的任务中。但全局变量没有写保护,容易造成数据受损。而消息队列中加入了进入临界区的写保护

        队列类似于数组,可以存储数量有限,大小固定的数据。队列中的每个数据叫做队列项目,能存储最大队列项目的数量交队列的长度。

二、队列的特点

        1、入队出对的方式通常为先进先出,也可配置为后进先出;

        2、数据的传递可以采用值传递,也可以是传递指针;

        3、入队出队阻塞:当队列满了无法入队或队列空了无法出队时,称为入队和出队阻塞。可在任务向队列发送消息的时候设置阻塞时间。

        如果阻塞时间为0,直接继续执行下面代码,不等待;

        如果阻塞时间为0~FFFFFFFF,等待设定的时间,如果在这段时间内还无法入队/出队,则不等待;

        如果阻塞时间为FFFFFFFF,一直等到可以入队/出队为止。

        4、在等待(即阻塞)过程中,该任务的状态列表项被挂在到阻塞列表中(pxDelayedTaskLits),事件列表项被挂在在等待接收(xTasksWaitingToReceive)/发送列表(xTasksWaitingToSend)中;

        5、多个任务写入满队列时,优先级高的优先写入,如果优先级相同,等待久的优先写入。

三、队列的相关API函数

1、队列结构体

typedef struct QueueDefinition
{int8_t *pcHead;						/*< 指向队列存储区的开头。 */int8_t *pcTail;						/*< 指向队列存储区的末尾字节。比实际需要的队列项多分配一个字节,用作标记。 */int8_t *pcWriteTo;					/*< 指向存储区的下一个可用位置。 */union								/* 使用联合体是为了确保两个互斥的结构成员不会同时出现(浪费 RAM)。 */{int8_t *pcReadFrom;				/*< 当结构用作队列时,指向最后读取的队列项的位置。 */UBaseType_t uxRecursiveCallCount;/*< 当结构用作递归互斥锁时,维护互斥锁递归“获取”的次数。 */} u;List_t xTasksWaitingToSend;			/*< 阻塞在此队列上等待发送的任务列表。按优先级排序。 */List_t xTasksWaitingToReceive;		/*< 阻塞在此队列上等待读取的任务列表。按优先级排序。 */volatile UBaseType_t uxMessagesWaiting;	/*< 当前队列中的项数。 */UBaseType_t uxLength;				/*< 队列的长度,定义为它可以容纳的项数,而不是字节数。 */UBaseType_t uxItemSize;				/*< 队列将容纳的每个项的大小。 */volatile int8_t cRxLock;			/*< 存储在队列被锁定时从队列接收的项数(从队列中移除)。当队列未被锁定时,设置为 queueUNLOCKED。 */volatile int8_t cTxLock;			/*< 存储在队列被锁定时传输到队列的项数(添加到队列中)。当队列未被锁定时,设置为 queueUNLOCKED。 */#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;

2、创建队列

函数描述
xQueueCreate()动态方式创建队列
xQueueCreateStatic()静态方式创建队列
#define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) )

        创建的函数使用宏定义,返回值是成功返队列句柄,失败返回NULL。

        创建的函数一共有三个参数。第一个是队列的长度,第二个是队列项目的大小,第三个是队列的类型,队列有如下类型:

#define queueQUEUE_TYPE_BASE				( ( uint8_t ) 0U )    /*< 基本队列类型。 */
#define queueQUEUE_TYPE_SET					( ( uint8_t ) 0U )    /*< 队列集合类型。 */
#define queueQUEUE_TYPE_MUTEX 				( ( uint8_t ) 1U )    /*< 互斥锁队列类型。 */
#define queueQUEUE_TYPE_COUNTING_SEMAPHORE	( ( uint8_t ) 2U )    /*< 计数信号量队列类型。 */
#define queueQUEUE_TYPE_BINARY_SEMAPHORE	( ( uint8_t ) 3U )    /*< 二值信号量队列类型。 */
#define queueQUEUE_TYPE_RECURSIVE_MUTEX		( ( uint8_t ) 4U )    /*< 递归互斥锁队列类型。 */

3、写入消息

        前四个为任务级,后四个为中断级。

函数描述
xQueueSend()往队列的尾部写入消息
xQueueSendToBack()同xQueueSend()
xQueueSendToFront()往队列的头部写入消息
xQueueOverwrite()覆盖队列消息(只用于队列长度为1的情况)

xQueueSendFromISR()

在中断中往队列的尾部写入消息
xQueueSendToBackFromISR()同xQueueSendFromISR()
xQueueSendToFrontFromISR()在中断中往队列的头部写入消息
xQueueOverwriteFromISR()在中断中覆盖队列消息(只用于队列长度为1的情况)
#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )

        队列写入消息都调用的是此函数,只是第四个参数不同。

        函数写入成功返回pdTRUE,写入失败返回errQUEUE_FULL。

        第一个参数表示要写入的队列,第二个参数表示要写入的消息,第三个参数表示阻塞时间,第四个参数是写入方式,有下面三种:

#define queueSEND_TO_BACK		( ( BaseType_t ) 0 )   /*< 将项目发送到队列的后面。 */
#define queueSEND_TO_FRONT		( ( BaseType_t ) 1 )   /*< 将项目发送到队列的前面。 */
#define queueOVERWRITE			( ( BaseType_t ) 2 )   /*< 覆盖队列中已有的项目。 */

4、读取消息

        前两个为任务级,后两个为中断级。

函数描述
xQueueReceive()从队列头部读取消息,删除消息
xQueuePeek()从队列头部读取消息
xQueueReceiveFromISR()在中断中从队列头部读取消息,删除消息
xQueuePeekFromISR()在中断中从队列头部读取消息
#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE )

        该函数有三个参数,分别是待读取的队列,信息读取缓冲区,阻塞时间。

        读取成功返回pdTRUE,失败返回pdFALSE

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

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

相关文章

关于WIN环境下pip DeepSpeed安装报错问题

问题描述 安装resemble-enhance项目时遇到的问题: >>> ERROR 1error: subprocess-exited-with-errorpython setup.py egg_info did not run successfully.exit code: 1[15 lines of output]test.cLINK : fatal error LNK1181: cannot open input file aio.libTraceb…

一维时间序列信号的基于小波集的时频超分辨率分析方法(Python)

由于小波变换只能反映信号的零维奇异性&#xff0c;即只能表达奇异点的位置和特性。事实上具有线奇异的函数在高维空间中非常普遍&#xff0c;例如&#xff0c;自然物体光滑边界使得自然图像的不连续性往往体现为光滑曲线上的奇异性&#xff0c;而并不仅仅是点奇异。对于一个二…

如何科学识别solidworks价格是否合理

Solidworks作为一款在很多领域中都非常重要的设计管理软件而备受人们的关注&#xff0c;该类软件在国内相关渠道中持续得到很多技术单位及行业内人士的喜爱和信任&#xff0c;在人们购买该软件的时候关于各类线上及线下渠道的solidworks都有很大的兴趣。接下来主要分析下如何科…

人工智能专业现代学徒制人才培养质量评价体系构建

一、 引 言 随着信息时代的发展&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞跃进步对各行各业产生了深远影响&#xff0c;对专业人才的培养提出了更高要求。现代学徒制作为一种创新人才培养模式&#xff0c;通过校企合作&#xff0c;强调理论与实践的深度结合&…

性能测试学习-基本使用-元件组件介绍(二)

jmeter优点是&#xff1a;开源免费&#xff0c;小巧&#xff0c;丰富的学习资料和扩展组件 缺点是&#xff1a;1.不支持IP欺骗&#xff0c;分析和报表能力相对于LR欠缺精确度&#xff08;以分钟为单位&#xff09; 工具用户量分析报表IP欺骗费用体积扩展性Loadrunner多(万)精…

Lumière:开创性的视频生成模型及其应用

视频内容创造领域迎来了突破性进展&#xff0c;但视频生成模型由于运动引入的复杂性而面临更多挑战。这些挑战主要源自运动的引入所带来的复杂性。时间连贯性是视频生成中的关键要素&#xff0c;模型必须确保视频中的运动在时间上是连贯和平滑的&#xff0c;避免出现不自然的跳…

LVS精益价值管理系统 LVS.Web.ashx SQL注入漏洞复现

0x01 产品简介 LVS精益价值管理系统是杭州吉拉科技有限公司研发的一款专注于企业精益化管理和价值流优化的解决方案。该系统通过集成先进的数据分析工具、可视化的价值流映射技术和灵活的流程改善机制,帮助企业实现高效、低耗、高质量的生产和服务。 0x02 漏洞概述 LVS精益…

记录岁月云明细账excel导出的性能优化

财务软件报表还是非常麻烦&#xff0c;因为使用excel最好的就是财务&#xff0c;但是通过java导出excel&#xff0c;使用easyexcel不用报表工具&#xff0c;不是这么容易。采用jprofile对一个导出操作进行监控&#xff0c;其中一家零售企业导出当月全部明细账&#xff0c;检测到…

PostgreSQL的视图pg_namespace

PostgreSQL的视图pg_namespace 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777在 PostgreSQL 中&#xff0c;…

鬼刀画风扁平化粒子炫动引导页美化版

源码介绍 分享一款引导页,响应式布局&#xff0c;支持移动PC 添加背景图片&#xff0c;美化高斯模糊 &#xff0c;删除蒙版人物部分&#xff0c;更图片人物画风更美好 删除雪花特效 替换字体颜色 添加底备案号 预留友情连接 效果预览 源码下载 https://www.qqmu.com/3381.h…

‘yarn’不是内部或外部命令,也不是可运行的程序或批处理文件。

目录 问题点 解决方式 # 安装 # 版本 # 本地发生变化&#xff08;了解&#xff09; # 安装项目依赖 新问题 解决方式 问题点 在vscode中&#xff0c;点击dev运行&#xff0c;项目报错【Q1】 * 正在执行任务: yarn run dev yarn : 无法将“yarn”项识别为 cmdlet、函数…

AI生成PPT:一键式演示文稿制作的秘诀

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

OrangePi Kunpeng Pro套装测评:开箱与基本功能测试

前言 大家好&#xff0c;我是起个网名真难。非常荣幸受到香橙派的邀请&#xff0c;同时也是第一次做这个事情&#xff0c;很荣幸对香橙派与华为鲲鹏在2024年5月12日联合发布的新品——香橙派Kunpeng Pro开发板进行深入的评测。这款开发板是香橙派与华为鲲鹏合作推出的高性能平…

中信建投证券信息技术部PMO高级经理张子洋受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 中信建投证券股份有限公司信息技术部PMO高级经理张子洋先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“浅谈项目管理标准化的建设及实践分享”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题…

解析建筑行业人防工程乙级资质最新标准

企业基本条件&#xff1a; 独立法人资格&#xff1a;申请企业需具备独立的法人资格&#xff0c;能够独立承担民事责任。注册资本&#xff1a;企业的注册资本不应少于100万元人民币&#xff0c;以证明其有足够的资金实力进行业务运营。业务经验&#xff1a;企业应从事建筑工程设…

C# 校验Json格式

错误json&#xff1a;错误值 -2146.379 [{"Key": "surface_heights_average","Value": "-2122.739nm","Description": "surface_heights_average"}, {"Key": "surface_heights_max","V…

第九篇 有限状态机

实验九 有限状态机 9.1 实验目的 学习有限状态机的组成与类型&#xff1b; 掌握有限状态机的设计方式&#xff1b; 学习有限状态机的编码方式&#xff1b; 掌握使用有限状态机进行设计的方法。 9.2 原理介绍 9.2.1 有限状态机的基本概念 有限状态机&#xff08;Finite …

openresty 的lua在返回响应后再日志里添加自定义的状态

理解了&#xff0c;你希望在 OpenResty 中将自定义状态输出到 log_format 中的日志格式里。你可以使用 Nginx 的变量机制将自定义状态记录到日志中。 步骤如下&#xff1a; 使用 set_by_lua 指令在请求处理过程中设置自定义变量。在 log_format 中引用该自定义变量。 以下是…

linux(centos7)开机自启jar文件

问题 之前参考网上说的直接在/etc/rc.local文件中增加sh文件启动语句&#xff0c;但是没有效果&#xff1a; /root/dashboard/dashboard_backend/start_dashboard.sh 权限也增加了&#xff0c;还是不行&#xff1a; chmod x /etc/rc.local 排查 排查了一下&#xff1a; 查…

5分钟带你了解海外仓备货系统:它能做的,可不止备货这么简单

现在跨境电商的发展速度确实还是非常快的&#xff0c;线上购物也越来越变成更多人的主流购物模式。这种情况下&#xff0c;对外贸行业来说是好事&#xff0c;不过对跨境电商的服务环节——海外仓&#xff0c;带来的压力可不小。 首先来说&#xff0c;现在各个电商平台对商家发…