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.…...
性价比高充电宝有哪些?充电宝十大最佳品牌大盘点!
在如今这个高度数字化的时代,我们的生活离不开各种电子设备,而充电宝作为保障电子设备续航的重要工具,其地位日益凸显。然而,面对市场上琳琅满目的充电宝品牌和产品,要挑选到一款性价比高的充电宝并非易事。在这篇盘点…...
客户和采购都在用豆包、deepseek查资料,怎么才能让这些国内头部大模型在回答时优先推荐公司的产品?
随着人工智能技术的爆发,企业获客与消费者决策的路径正在发生深刻的重构。据近期的公开市场调研与行业报告显示,包括豆包、DeepSeek、文心一言在内的国内头部大模型,其月活跃用户数正呈现指数级增长。一个不可忽视的趋势是:无论是…...
如何永久保存微信聊天记录:WeChatMsg本地化数据管理完全指南
如何永久保存微信聊天记录:WeChatMsg本地化数据管理完全指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...
原神帧率解锁终极指南:三步轻松突破60FPS限制
原神帧率解锁终极指南:三步轻松突破60FPS限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 还在为《原神》60帧限制感到困扰吗?genshin-fps-unlock是一款专为《…...
Python实战:5分钟搞定Infoway期货行情API接入(附完整代码)
Python实战:5分钟搞定Infoway期货行情API接入(附完整代码) 最近两年量化交易的热度持续攀升,身边不少程序员朋友都在尝试将自己的编程技能转化为交易优势。作为Python开发者,我们最关心的莫过于如何快速获取可靠的实时…...
docker 安装 MrDoc
这里写目录标题一、说明二、安装1. 将离线包上传到root,导入docker离线包2. 创建并运行容器3.账号admin,初始密码获取如下一、说明 doc、git、nexus之类不是常用的,而本身又包含数据库、软件或者nginx之类的,用docker来安装是不错…...
Pixel Dream Workshop应用场景:像素游戏测试用占位图(placeholder)批量生成
Pixel Dream Workshop应用场景:像素游戏测试用占位图批量生成 1. 像素游戏开发中的占位图挑战 在独立游戏开发过程中,美术资源往往是开发进度的瓶颈之一。特别是对于像素风格的游戏项目,开发者经常面临一个两难选择: 等待专业美…...
RexUniNLU部署教程:Kubernetes集群中水平扩缩容RexUniNLU服务的Helm Chart实践
RexUniNLU部署教程:Kubernetes集群中水平扩缩容RexUniNLU服务的Helm Chart实践 1. 为什么需要在K8s中部署RexUniNLU? 你可能已经试过在本地跑通 python test.py,也成功启动了 server.py 提供的 FastAPI 接口。但当真实业务流量进来——比如…...
WinForm实战:C#如何优雅地调用外部exe并传递多个参数(附完整代码示例)
WinForm实战:C#如何优雅地调用外部exe并传递多个参数(附完整代码示例) 在Windows桌面应用开发中,经常需要与其他程序进行交互。想象这样一个场景:你正在开发一个数据可视化工具,需要调用Python脚本处理原始…...
告别重复劳动,用快马平台ai高效生成openclaw自动化脚本
最近在折腾一些文件批量处理的自动化任务,发现OpenClaw这个命令行工具特别适合做这类工作。但每次都要手动敲命令实在太费时间了,特别是需要组合多个命令的时候,调试起来特别麻烦。后来发现了InsCode(快马)平台,用它来编写OpenCla…...
SEO聚合页与传统网页有什么区别
SEO聚合页的核心理念与传统网页的差异 在互联网的世界里,网页的形式和功能不断演变,其中SEO聚合页与传统网页的区别尤为显著。理解这两者的不同,对于提升网站的流量和用户体验至关重要。 SEO聚合页是一种专注于内容聚合和优化的网页形式&am…...
