【freeRTOS】操作系统之二-队列

news2025/7/23 12:00:56

在任何RTOS中,都具有一个重要的通信机制----消息队列。

​ 队列是任务间通信的主要形式。**它们可用于在任务之间、中断和任务之间发送消息。**在大多数情况下,它们被用作线程安全的FIFO(先进先出)缓冲区,新数据被发送到队列的后面,不过数据也可以发送到前面。

img

​ 消息队列就是通过RTOS内核提供的服务,任务或中断服务子程序可以将一个消息(注意,FreeRTOS消息队列传递的是实际数据,并不是数据地址,RTX,uCOS-II和uCOS-III是传递的地址)放入到队列。同样,一个或者多个任务可以通过RTOS内核服务从队列中得到消息。通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO),FreeRTOS的消息队列支持FIFO和LIFO两种数据存取方式。

img

Queue 内存的分配情况如上图所示, 在该数据结构中, 其中有两个链表变量 `xTasksWaitingToReceive` 和 `xTasksWaitingToSend`, 当某个任务调用队列 API 接收函数准备接收消息时, 队列刚好没有内容, 如果设置了阻塞时间, 则该任务会被插入到 `xTasksWaitingToReceive` 链表中, 等待新消息; 对应的, 发送消息的任务发送消息时碰上队列满了, 也会被插入到 `xTasksWaitingToSend` 链表中, 等待其他任务读取消息后空出空间。
typedef struct QueueDefinition
{
    int8_t *pcHead;             /* 指向队列存储区起始位置,即第一个队列项 */
    int8_t *pcTail;             /* 指向队列存储区结束后的下一个字节 */
    int8_t *pcWriteTo;          /* 指向下队列存储区的下一个空闲位置 */

    union                       /* 使用联合体用来确保两个互斥的结构体成员不会同时出现 */
    {
        int8_t *pcReadFrom;     /* 当结构体用于队列时,这个字段指向出队项目中的最后一个. */
        UBaseType_t uxRecursiveCallCount;/* 当结构体用于互斥量时,用作计数器,保存递归互斥量被"获取"的次数. */
    } u;

    List_t xTasksWaitingToSend;      /* 因为等待入队而阻塞的任务列表,按照优先级顺序存储 */
    List_t xTasksWaitingToReceive;   /* 因为等待队列项而阻塞的任务列表,按照优先级顺序存储 */

    volatile UBaseType_t uxMessagesWaiting;/*< 当前队列的队列项数目 */
    UBaseType_t uxLength;            /* 队列项的数目 */
    UBaseType_t uxItemSize;          /* 每个队列项的大小 */

    volatile BaseType_t xRxLock;   /* 队列上锁后,存储从队列收到的列表项数目,如果队列没有上锁,设置为queueUNLOCKED */
    volatile BaseType_t xTxLock;   /* 队列上锁后,存储发送到队列的列表项数目,如果队列没有上锁,设置为queueUNLOCKED */

    #if ( configUSE_QUEUE_SETS == 1 )
        struct QueueDefinition *pxQueueSetContainer;
    #endif
    #if ( configUSE_TRACE_FACILITY == 1 )
        UBaseType_t uxQueueNumber;
        uint8_t ucQueueType;
    #endif
    #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
        uint8_t ucStaticAllocationFlags;
    #endif
} xQUEUE;
typedef xQUEUE Queue_t;

List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */

List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */
传送门:
【freeRTOS】操作系统之一-任务调度
【freeRTOS】操作系统之二-队列
【freeRTOS】操作系统之三-信号量
【freeRTOS】操作系统之四-事件标志组
【freeRTOS】操作系统之五.-内存管理
【freeRTOS】操作系统之六-低功耗模式
【freeRTOS】操作系统之七-freeRtos移植

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

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

相关文章

OpenCV图像处理——傅里叶变换

总目录 图像处理总目录←点击这里 十三、傅里叶变换 13.1、原理 我们生活在时间的世界中&#xff0c;早上7:00起来吃早饭&#xff0c;8:00去挤地铁&#xff0c;9:00开始上班。。。 以时间为参照就是时域分析。在频域中一切都是静止的 对傅里叶变换写的很好的一篇文章→ h…

【C++】队列来喽,真的很简单的

我们经历了那么多练习和顺序表&#xff0c;链表&#xff0c;栈的大风大浪&#xff0c;小小一个队列可以说简单至极了 练习&#xff0c;以及顺序表之类的文章都在我的主页哦&#xff0c;请认真学习之后再看本文 目录 1.队列的结构 2.实现 3.栈和队列的相互实现 1.队列的结构 …

Postgresql源码(88)column definition list语义解析流程分析

0 总结 如果调用函数时同时满足以下几种情况 在from后面。返回值为RECORD&#xff08;或者是anyelement表示的RECORD&#xff09;&#xff08;anyelement的实际类型由入参决定&#xff0c;入参是RECORD&#xff0c;返回就是RECORD&#xff09;。返回值被判定为TYPEFUNC_RECOR…

11.18 - 每日一题 - 408

每日一句&#xff1a;不如就利用孤单一人的时间&#xff0c;使自己变得更优秀&#xff0c;给来的人一个惊喜&#xff0c;也给自己一个好的交代 数据结构 1 当一棵有n个结点的二叉树按层次从上到下&#xff0c;同层次从左到右将结点中的数据存放在一维数组A[1…n&#xff3d;中…

Android App事件交互Event之模仿京东App实现下拉刷新功能(附源码 可直接使用)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、正常下拉与下拉刷新的冲突处理 电商App的首页通常都支持下拉刷新&#xff0c;比如京东首页的头部轮播图一直顶到系统的状态栏&#xff0c;并且页面下拉到顶后&#xff0c;继续下拉会拉出带有下拉刷新字样的布局&#x…

leaflet教程039: 只显示一屏地图,设定范围不让循环延展

第039个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet只显示一屏地图,并且根据maxBounds和bounds的设定,来改变不同的地图呈现状态。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共68行)心得总结相…

[附源码]java毕业设计期刊在线投稿平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

小程序基础原理

前言 本文会围绕小程序的基础原理进行介绍。主要包括小程序的基础结构、编译、加载、通讯等几个方面。旨在阅读完毕后可以对小程序有一个基本的印象。 一、基础 对于用户来讲&#xff0c;小程序无需下载、用完即走、体验良好。 对于开发者来讲&#xff0c;小程序主要是区别…

同花顺_代码解析_技术指标_M

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 MACD MACDFS MARSI MASS MAVOL MCL MCO MFI MI MICD MIKE MTM MTMFS MACD 指数平滑异同平均线 MACD指标说明 MACD指数平滑异同移动平均线为两条长、短的平滑平均线。 其…

拉取多CPU架构容器镜像推送到其他仓库

一、背景 一个docker镜像可能会有多种CPU架构的变体&#xff0c;有时需要把这些多架构的镜像全部从公共镜像库&#xff08;如&#xff1a; hub.docker.com &#xff09;同步到自建的库上。 二、解决方法 使用 docker buildx 多架构打包机制&#xff0c;进行重制推送&#xf…

Bean 作用域和生命周期

一 : Bean的默认作用域 Bean 默认情况下是单例状态(singleton),所有人使用的都是同一个对象.举例理解Bean的单例状态 : 假设现在有一个公共的 Bean&#xff0c;提供给 A 用户和 B 用户使用&#xff0c;然而在使用的途中 A 用户却“悄悄”地修 改了公共 Bean 的数据&#xff0…

[附源码]SSM计算机毕业设计中医药系统论文2022JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

快速清除PPT缓存文件或C盘隐藏大文件

是否遇到过电脑的磁盘空间越来越满&#xff0c; 请注意这些临时文件可谓是C盘的存储杀手&#xff0c;无形中吞噬掉很多磁盘空间&#xff0c;这里以PPT为例&#xff1a; C:\Users\Admin\AppData\Roaming\Microsoft\PowerPoint\ 1.首先在PPT2019软件中&#xff0c;打开一个PPT文…

实现BIO多客户端通讯模式

实现BIO多客户端通讯模式背景思想实现服务端线程类服务端客户端结果背景 如果服务端需要处理很多个客户端的消息通信请求应该如何处理呢&#xff0c;此时我们就需要在服务端引入线程了&#xff0c;也就是说客户端每发起一个请求&#xff0c;服务端就创建一个新的线程来处理这个…

PyTorch搭建基于图神经网络(GCN)的天气推荐系统(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言~~~ 一、背景 极端天气情况一直困扰着人们的工作和生活。部分企业或者工种对极端天气的要求不同&#xff0c;但是目前主流的天气推荐系统是直接将天气信息推送给全部用户。这意味着重要的天气信息在用户手上得不到筛选&#xff0c;…

(C语言)背答案

[#4练习赛]背答案 题目描述 传智专修学院“Java程序设计”的期末考试来源于一个选择库&#xff0c;共有 nnn 道题目&#xff0c;每道题目由问题和答案组成&#xff0c;都是一个字符串&#xff0c;保证所有题目题面互不相同。这个题库已经发给同学进行备考准备。 正式考试中&…

Labview+STM32无线温湿度采集

一.介绍 该项目采用正点原子的STM32ZET6精英板DHT11温湿度模块泽耀科技的无线串口作为下位机&#xff0c;Labview无线串口作为上位机读取下位机发来的数据并处理。 泽耀科技的产品是我在开发过程中经常用到的&#xff0c;他们不仅产品做的非常不错&#xff0c;而且资料齐全售后…

远离cmd,拥抱powershell

简介&#xff1a;cmd命令提示符是在操作系统中&#xff0c;提示进行命令输入的一种工作提示符。在不同的操作系统环境下&#xff0c;命令提示符各不相同。 在windows环境下&#xff0c;命令行程序为cmd.exe&#xff0c;是一个32位的命令行程序&#xff0c;微软Windows系统基于W…

动态规划--区间dp

区间dp题目列表&#xff1a;(1)石子合并(2)环形石子合并(3)能量项链(4)加分二叉树(5)凸多边形的划分(6)棋盘分割题目列表&#xff1a; (1)石子合并 在复习石子合并之前&#xff0c;为了直接进入专题“区间dp“&#xff0c;做一个区间dp的基础题&#xff0c;这个题目具有代表性…

1.2 Android 5.0 的特点

和其他版本相比&#xff0c; Android 5.0 的突出特性如下所示。 &#xff08;1&#xff09;全新的 Material 界面设计 Android 5.0 Lollipop 界面设计的灵感来源于自然、 物理学 以及基于打印效果的粗体、图标化的设计&#xff0c;换句话说&#xff0c;它的设 计是一种基于高品…