FreeRTOS 队列
队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存 储数量有限、大小固定的多个数据,队列中的每一个数据叫做队列项目,队列能够存储队列项 目的最大数量称为队列的长度,在创建队列的时候,就需要指定所创建队列的长度及队列项目 的大小。
因为队列是用来在任务与任务或任务于中断之间传递消息的一种机制,因此队列也叫 做消息队列。 基于队列,FreeRTOS 实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二 值信号量、递归互斥信号量,因此很有必要深入了解 FreeRTOS 的队列。
数据存储
队列的原则是先进先出(FIFO),当有新的数据写入队列时,都是写入到队列的尾部,当读出数据时,先从队列的头部进行读取。FreeRTOS也支持将数据写到队列的头部,也可以覆盖之前写入的数据。
多任务访问
队列不属于某个特定的任务,可以在任何的任务或中断中往队列中写入消息,或者从队列 中读取消息。
队列的写入阻塞
当想某一个队列写入数据时,如果此时的队列已经满了,就是没有空位置了,这时任务实际上是阻塞住了,因为想要写入但是无法写入,我们可以设定一个等待阻塞时间,等待的时间在设定范围内,任务就会被添加到阻塞列表中进行等待,等待队列中有空位置。如果在阻塞超时时间到达之前,队列有空闲的位置,那么队列写入阻塞任务将会解除阻塞, 并往队列中写入消息,如果达到指定的阻塞超时时间,队列依旧没有空闲的位置写入消息,那 么队列写入阻塞任务将会自动转移到就绪态任务列表中,但不会往队列中写入消息。这个阻塞时间可以是0,可以是在系统规定的最大阻塞时间范围之内。
注意:如果多个任务写入同一个队列时,那么多个任务会一起等待,会按照阻塞的先后和任务的优先级,决定应该解除哪一个队列写入阻塞任务,也就是同一个优先级先来的先解除,高优先级比低优先级先解除。
队列的读取阻塞
同写入相同,当想某一个队列读取数据时,如果此时的队列是空的,因为没有数据让任务读取,这时任务实际上是阻塞住了,因为想要读取却没有数据,我们可以设定一个等待阻塞时间,等待的时间在设定范围内,任务就会被添加到阻塞列表中进行等待,等待队列中有空位置。在任务从队列读取消息时,可以指定一个阻塞超时时间。如果任务在读取队列时,队列为 空,这时任务将被根据指定的阻塞超时时间添加到阻塞态任务列表中进行阻塞,以等待队列中 有可用的消息。当有其他任务或中断将消息写入队列中,因等待队列而阻塞任务将会被添加到 就绪态任务列表中,并读取队列中可用的消息。如果任务因等待队列而阻塞的时间超过指定的 阻塞超时时间,那么任务也将自动被转移到就绪态任务列表中,但不再读取队列中的数据。 因为同一个队列可以被多个任务读取,因此可能会有多个任务因等待同一个队列,而被阻 塞,在这种情况下,如果队列中有可用的消息,那么也只有一个任务会被解除阻塞并读取到消 息,并且会按照阻塞的先后和任务的优先级,决定应该解除哪一个队列读取阻塞任务。
队列的结构体
typedef struct QueueDefinition
{int8_t * pcHead; /* 存储区域的起始地址 */int8_t * pcWriteTo; /* 下一个写入的位置 *//* 信号量是由队列实现的,* 此结构体能用于队列和信号量,* 当用于队列时,使用联合体中的 xQueue,* 当用于信号量时,使用联合体中的 xSemaphore*/union{QueuePointers_t xQueue;SemaphoreData_t xSemaphore;} u;List_t xTasksWaitingToSend; /* 写入阻塞任务列表 */List_t xTasksWaitingToReceive; /* 读取阻塞任务列表 */volatile UBaseType_t uxMessagesWaiting; /* 非空闲项目的数量 */UBaseType_t uxLength; /* 队列的长度 */UBaseType_t uxItemSize; /* 队列项目的大小 */volatile int8_t cRxLock; /* 读取上锁计数器 */volatile int8_t cTxLock;
}
结构体示意图

前面说过 FreeRTOS 基于队列实现了互斥信号量和递归互斥信号量功能,在队列的结构体 中,就包含了一个联合体 u,当队列结构体用作队列时,使用联合体 u 中的 xQueue
typedef struct QueuePointers
{int8_t * pcTail; /* 存储区域的结束地址 */int8_t * pcReadFrom; /* 最后一次读取队列的位置 */
} QueuePointers_t;
pcHead是存储区的起始地址,pcWriteTo是下一个写入的地址
pcTail是存储区的结束地址,pcReadFrom是最后一次读取队列的位置
xTasksWaitingToSend,当写入发生阻塞时,任务会被添加到此列表中。
xTasksWaitingToReceive,当读取发生阻塞时,任务会被添加到此列表中。
uxMessagesWaiting时队列中已经有数据的项目数量
uxLength就是队列的长度
uxItemSize就是队列项目的大小
队列的锁
在FreeRTOS中,队列是一种用于在任务之间传递数据的通信机制。它可以实现生产者任务将数据发送到队列中,然后消费者任务从队列中接收数据。队列的上锁和解锁操作是用来保护队列数据的完整性和一致性的。
当一个任务要向队列发送数据时,首先需要对队列进行上锁操作。这是为了防止其他任务同时访问队列,从而导致数据的错误读写。在上锁期间,其他任务无法访问队列,直到上锁任务完成发送操作并解锁队列。类似地,当一个任务要从队列接收数据时,也需要对队列进行上锁操作。这是为了保证在接收数据的过程中,队列中的数据不会被其他任务修改。在上锁期间,其他任务无法修改队列中的数据,直到上锁任务完成接收操作并解锁队列。
通过对队列进行上锁和解锁操作,可以确保在多任务环境下,队列的数据操作是安全和可靠的。
相关文章:
FreeRTOS 队列
队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存 储数量有限、大小固定的多个数据,队列中的每一个数据叫做队列项目,队列能够存储队列项 目的最大数量称为队列的长度,在创建队列的时候,就需要指…...
如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字
如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字 将图片中的文字提取为文本是一项非常有用的技能,特别是当你需要处理大量扫描文档、截图或其他图片时。以下是五款能够帮助你快速提取图片文字的软件: 迅捷文字识别 这是一款非…...
Flink SQL kafka连接器
版本说明 Flink和kafka的版本号有一定的匹配关系,操作成功的版本: Flink1.17.1kafka_2.12-3.3.1 添加kafka连接器依赖 将flink-sql-connector-kafka-1.17.1.jar上传到flink的lib目录下 下载flink-sql-connector-kafka连接器jar包 https://mvnreposi…...
glm-4 联网搜索 api 测试
今天测试了一下 glm-4 的联网搜索 web_search tool 调用,发现了 web_search 的网页检索返回结果中几个比较诡异的事情,特此记录: 有些检索结果没有 icon、link、media 字段,但从内容上看确实是联网搜索出来的结果,不知…...
Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序
Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序 SSM 图书管理系统小程序 功能介绍 用户 登录 注册 首页 图片轮播 图书信息推荐 图书详情 赞 踩 评论 收藏 系统公告 公告详情 用户信息修改 我的待还 图书归还 催还提醒 我的收藏管理 意见反馈 管理员 登录 个人中心…...
bert训练的一些技巧(rand() < self.skipgram_prb)
rand() < self.skip_gram_prb) 是一个条件表达式,用来判断是否进行skip-gram掩码操作。这种掩码操作通常用于自然语言处理中的数据增强,通过概率决定是否应用skip-gram掩码。下面是对这个表达式的详细解释: 解释 rand(): rand() 是一个随…...
pandas修改时间索引报错处理
import pandas as pd import numpy as np import osdfpd.DataFrame(index[a,b,c],data{序列:[1,2,3]}) df.rename(index{a:a1},inplaceTrue) print(df) print(df.index.dtype)df1pd.DataFrame(index[2024-01-01,2024-01-02,2024-01-03],data{序列:[1,2,3]}) df1.rename(index{2…...
Nginx Bla~Bla~
root 和 alias指令都用于指定服务器上的文件系统路径,但它们在用法和行为上有一些不同 root指令通常用于在Nginx配置中定义一个目录,该目录将作为请求的根目录。 server { location /static/ {root /var/www; 请求 /static/index.html 将映射到 /v…...
java awt和swing介绍
Java AWT(Abstract Window Toolkit)和 Swing 是用于创建图形用户界面(GUI)的 Java API。 AWT AWT 是 Java 最初的平台依赖的窗口图形界面工具包,它提供了一组基本的 GUI 组件、窗口管理、事件处理等。AWT 组件是重量…...
奇怪的错误记录
https://github.com/meta-llama/llama3/issues/80 读模型没问题,推理时出现: RuntimeError: “triu_tril_cuda_template” not implemented for ‘BFloat16’ ———————————————— 事发原因 我尝试了解transformers的AutoProcessor时&a…...
来啦,经典传说大变身牛郎织女后代逗趣日常
《落凡尘:星宿大冒险》来啦! 经典传说大变身,牛郎织女后代金风, 上演一出“星际小侦探”的逗趣日常! 想象一下,二十八星宿那些傲娇的星星们, 居然能“离家出走”,还差点把天给掀了…...
【uniapp-ios】App端与webview端相互通信的方法以及注意事项
前言 在开发中,使用uniapp开发的项目开发效率是极高的,使用一套代码就能够同时在多端上线,像笔者之前写过的使用Flutter端和webview端之间的相互通信方法和问题,这种方式本质上实际上是h5和h5之间的通信,网上有非常多…...
Qt常用基础控件总结—表格控件(QTableWidget类)
表格控件QTableWidget 表格控件最上面一排是只读的水平表头,最左边一列是只读的垂直表头。表头又可以细分为多个分段(section),水平表头的分段就是表格各个列的列首,垂直表头 分段就是表格各个行的行首。表格控件的实体区域是按行、列排布的单元格,单元格内容一般用 QTa…...
笔记:Entity Framework Core 数据库迁移add-migration
一、目的: 数据库迁移是一种管理数据库架构变化的技术,它允许开发者在应用程序的生命周期中安全地更新数据库架构,而不会丢失数据或破坏现有的数据库结构。在Entity Framework Core(EF Core)中,数据库迁移特…...
准备工作+1、请求和响应+2、模型和管理站点
Django快速入门——创建一个基本的投票应用程序 准备工作1、创建虚拟环境2、安装django 1、请求和响应(1)创建项目(2)用于开发的简易服务器(3)创建投票应用(4)编写第一个视图1、编写…...
js 格式化时间
方法一:使用toLocaleString或toLocaleDateString/toLocaleTimeString Date对象提供了toLocaleString()、toLocaleDateString()和toLocaleTimeString()方法,这些方法允许你根据本地时间格式来显示日期和时间。虽然它们不直接提供高度自定义的格式选项&am…...
python 缩放照片
pip install Pillow from PIL import Image 打开一个图片文件 img Image.open(r"C:\Users\Administrator\Desktop\我的证件\证件照.jpg") 设定新的尺寸 new_size (480, 640) 缩放图片 resized_img img.resize(new_size) 显示缩放后的图片 resized_img.sh…...
【C语言】指针(1):入门理解(课堂随笔)
目录 一、内存和地址 二、指针变量和地址 三、指针变量类型的意义 一、内存和地址 只要讲指针就离不开内存 因为指针就是访问内存的 计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数 据也会放…...
LLMs可以进行任务规划吗?如果不行,LLMs+GNN可以吗?
深度图学习与大模型LLM(小编): 大家好,今天向大家介绍一篇最新发布的研究论文(20240530)。这篇论文探讨了如何通过引入GNN来提高大模型在任务规划(task planning)中的性能。*论文分析了LLMs在任务规划上的局限性,并提出了一种简单而有效的解决方案。* 1.…...
性价比高充电宝有哪些?充电宝十大最佳品牌大盘点!
在如今这个高度数字化的时代,我们的生活离不开各种电子设备,而充电宝作为保障电子设备续航的重要工具,其地位日益凸显。然而,面对市场上琳琅满目的充电宝品牌和产品,要挑选到一款性价比高的充电宝并非易事。在这篇盘点…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
