FreeRTOS学习第9篇--队列介绍
目录
- FreeRTOS学习第9篇--队列介绍
- 1. 数据传输的方法
- 1.1 任务之间如何传输数据
- 1.2 队列的本质
- 2. 队列的工作原理和实现
- 2.1 创建队列
- 2.2 向队列发送数据
- 2.3 从队列接收数据
- 3. 使用队列进行任务间的通信
- 3.1 通信示例
- 3.2 同步示例
- 结论
FreeRTOS学习第9篇–队列介绍
本文目标:FreeRTOS学习第9篇–队列介绍
按照本文的描述,理解操作系统中的队列
本文实验条件:理论学习篇
1. 数据传输的方法
1.1 任务之间如何传输数据
多种方法比较:
| 数据个数 | 互斥措施 | 阻塞-唤醒 | 使用场景 | |
|---|---|---|---|---|
| 全局变量 | 1 | 无 | 无 | 一读一写 |
| 环形缓冲区 | 多个 | 无 | 无 | 一读一写 |
| 队列 | 多个 | 有 | 有 | 多读多写 |
初学感觉消息队列挺麻烦,搞个全局数组不是更简单,其实不然。在裸机编程时,使用全局数组的确比较方便,但是在加上 RTOS 后就是另一种情况了。相比消息队列,使用全局数组主要有如下四个问题:
1.使用消息队列可以让 RTOS 内核有效地管理任务,而全局数组是无法做到的,任务的超时等机制需要用户自己去实现。
2.使用了全局数组就要防止多任务的访问冲突,而使用消息队列则处理好了这个问题,用户无需担心。
3.使用消息队列可以有效地解决中断服务程序与任务之间消息传递的问题。
4.FIFO 机制更有利于数据的处理。
1.2 队列的本质
队列中,数据的读写本质就是环形缓冲区,在这个基础上增加了互斥措施、阻塞-唤醒机制。
如果这个队列不传输数据,只调整"数据个数",它就是信号量(semaphore)。
如果信号量中,限定"数据个数"最大值为1,它就是互斥量(mutex)。
接下来,我们将继续深入探讨队列的工作原理、实现方式以及如何在FreeRTOS中使用队列进行任务间的同步和通信。
2. 队列的工作原理和实现
队列(Queue)是一种先进先出(FIFO,First In First Out)的数据结构,它允许在一端(rear)添加数据,在另一端(front)移除数据。在FreeRTOS中,队列不仅用于数据传输,还可以用作任务同步机制。FreeRTOS队列传递的是实际数据,并不是数据地址。
2.1 创建队列
在FreeRTOS中,队列是通过调用xQueueCreate()函数创建的。此函数需要两个参数:队列可以存储的最大元素数量和每个元素的大小。
c复制QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
创建成功后,函数返回一个队列句柄(QueueHandle_t),通过这个句柄可以访问队列。如果创建失败,返回NULL。
2.2 向队列发送数据
通过xQueueSend()、xQueueSendToFront()、xQueueSendToBack()和xQueueSendOverwrite()函数可以向队列发送数据。这些函数允许在不同的场景下发送数据,比如添加到队列的前面或后面,或者覆盖队列中的现有数据。
BaseType_t xQueueSend( QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait );
2.3 从队列接收数据
通过xQueueReceive()函数从队列接收数据。调用此函数时,如果队列为空,则任务可以选择阻塞等待直到数据可用。
BaseType_t xQueueReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait );
3. 使用队列进行任务间的通信
队列是实现任务间通信的强大工具。它们允许任务以线程安全的方式交换信息,而不必担心数据损坏或竞态条件。
3.1 通信示例
考虑一个生产者-消费者场景,生产者任务创建数据,消费者任务处理数据。这里,队列充当生产者和消费者之间的桥梁。
- 生产者任务将数据发送到队列。
- 消费者任务等待队列中的数据,接收后进行处理。
3.2 同步示例
队列也可以用于任务同步。例如,一个任务可能需要等待另一个任务完成特定工作后才能继续。这可以通过发送和接收特定的同步消息(或信号)来实现。
结论
理解和使用队列是掌握FreeRTOS中任务间通信和同步的关键。通过本文的介绍,您应该能够理解队列的基本概念、如何创建和使用队列以及如何利用队列在任务间传递数据和信号。实践中,灵活运用队列不仅可以解决复杂的同步问题,还能提升系统的稳定性和响应速度。
相关文章:
FreeRTOS学习第9篇--队列介绍
目录 FreeRTOS学习第9篇--队列介绍1. 数据传输的方法1.1 任务之间如何传输数据1.2 队列的本质 2. 队列的工作原理和实现2.1 创建队列2.2 向队列发送数据2.3 从队列接收数据 3. 使用队列进行任务间的通信3.1 通信示例3.2 同步示例 结论 FreeRTOS学习第9篇–队列介绍 本文目标&a…...
qt如何配置ros环境
在Qt5.7的版本可以使用bash -i -c来启动qt,让Qt自己识别系统环境,不知道为什么Qt在之后的版本,这样使用都失效了。因为它会默认把CMAKE_PREFIX_PATH修改掉。 网上还有安装ros插件版本的qt creator,感觉失去了一些灵活性。 自己测试…...
20240310-1-Java后端开发知识体系
Java 基础 知识体系 Questions 1. HashMap 1.8与1.7的区别 1.71.8底层结构数组链表数组链表/红黑树插入方式头插法尾插法计算hash值4次位运算5次异或运算1次位运算1次异或运算扩容、插入先扩容再插入先插入再扩容扩容后位置计算重新hash原位置或原位置旧容量 (1) 扩容因子…...
Python基础学习(7)函数作用域与名称空间
文章目录 一.认识函数对象1.函数被引用2.函数作为元素3.函数可以作为参数和返回值 二,名称空间1.内建名称空间(存放内置函数)2.全局名称空间(Python定义在外层的名字)3.局部名称空间(存在函数内定义的名字) 三,作用域1.global 提权2.nonlocal 降权 四,匿名函数 Python基础学习(…...
使用helm部署clickhouse
(作者:陈玓玏) 前置条件 已安装 Kubernetes 集群; 已安装 Helm 包管理工具。 部署 1 添加 RadonDB ClickHouse 的 Helm 仓库 helm repo add ck https://radondb.github.io/radondb-clickhouse-kubernetes/ helm repo upd…...
2024.02.09 校招 实习 内推 面经
绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招 | 中国电信江苏分公司2024年春季校园招聘 校招 | 中国电信江苏分公司2024年春季校园招聘 2、校招 | 国机集团2024届总部管培生春季招聘全面启动! 校招 | 国机集团202…...
【其他】清风眼中的《妙手仁心》
我是清风,一个以医生为正职,平时喜欢写点文字的男人。人家喜欢把我称为作家,可是我觉得我还配不上这个称呼。因为我所记录的只是一些身边的人和事,所抒发的也只是一些个人的情感,这与“作家”二字相去甚远。有人也许会…...
洛谷 P1036 [NOIP2002 普及组] 选数
题目描述 已知 nn 个整数 x_1,x_2,\cdots,x_nx1,x2,⋯,xn,以及 11 个整数 kk(k<nk<n)。从 nn 个整数中任选 kk 个整数相加,可分别得到一系列的和。例如当 n4n4,k3k3,44 个整数分别为 3,7,12,1…...
SSM整合项目(删除家居 + 分页查询)
1.删除家居 1.需求分析 2.编写Service层 1.FurnService.java 添加方法 //删除家居public void del(Integer id);2.FurnServiceImpl.java 实现方法 Overridepublic void del(Integer id) {furnMapper.deleteByPrimaryKey(id);}3.单元测试 Testpublic void del() {furnService.…...
记录一下go的包管理
如何降低版本 假设go版本go 1.16运行项目, 查看运行报错,根据报错信息,一条一条解决 go run main.go错误: /home/server1/go/pkg/mod/google.golang.org/grpcv1.58.2/internal/buffer/unbounded.go:92:34: undefined: any类似这样的报错提醒…...
【APB协议 UVM_Sequencer Driver Monitor_2024.03.04】
apb协议 写时序 地址、写信号、PSEL、写数据信号同时发生变化,即传输的第一个时钟被称为SETUP周期。在下个时钟上升沿,PENABLE信号拉高,表示ENABLE周期,在该周期内,数据、地址以及控制信号都必须保持有效。整个写传输在这个周期…...
C++ Qt开发:QFileSystemWatcher文件监视组件
Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemWatcher组件实现对文件或…...
window Zookeeper 启动;
文章目录 前言一、Zookeeper 介绍:二、window 使用:2.1 下载:2.2 启动2.3 连接: 总结 前言 本文对window Zookeeper zk 启动 进行介绍; 一、Zookeeper 介绍: ZooKeeper 是一个开源的分布式协调服务&#…...
数据分析-Pandas如何画图验证数据随机性
数据分析-Pandas如何画图验证数据随机性 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表…...
地球系统模式(CESM)
目前通用地球系统模式(Community Earth System Model,CESM)在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来,一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…...
数据通信练习题
1.0osi七层模型 应用层 data 表示层 会话层 传输层 数据段 防火墙,端口(TCP UDP) 网络层 数据包 路由器 数据链路层 数据帧 交换机 物理层 比特流 网卡 2.IP地址分类 私有地址 A类 0--127 10.0.0.0…...
本地部署推理TextDiffuser-2:释放语言模型用于文本渲染的力量
系列文章目录 文章目录 系列文章目录一、模型下载和环境配置二、模型训练(一)训练布局规划器(二)训练扩散模型 三、模型推理(一)准备训练好的模型checkpoint(二)全参数推理ÿ…...
设计模式: 模板方法模式
文章目录 一、什么是模板方法模式二、模板方法模式结构三、优点 一、什么是模板方法模式 模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现。这样可以使得子类…...
C++ 打印输出十六进制数 指定占位符前面填充0
C 打印十六进制数据,指定数据长度,前面不够时,补充0. 代码如下: #include <iostream> #include <iomanip> #include <cmath>using namespace std;int main() {unsigned int id 0xc01;unsigned int testCaseId…...
基于 Win Server 2008 复现 IPC$ 漏洞
写在前面 本篇博客演示了使用 winXP(配合部分 win10 的命令)对 win server 2008 的 IPC$ 漏洞进行内网渗透,原本的实验是要求使用 win server 2003,使用 win server 2003 可以规避掉很多下面存在的问题,建议大家使用 …...
Pixel Aurora Engine 与MySQL联动:构建带审核的图像素材管理库
Pixel Aurora Engine与MySQL联动:构建带审核的图像素材管理库 1. 业务场景与痛点分析 电商设计团队每天需要制作大量商品展示图,传统设计流程面临三大挑战: 人力成本高:每张主图需要设计师2-3小时制作风格不统一:不…...
如何在不安装Steam的情况下获取创意工坊模组
如何在不安装Steam的情况下获取创意工坊模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 对于许多游戏爱好者来说,Steam创意工坊是一个宝库,里面充满…...
大语言模型作为语种民族文明压缩镜像的映射特性分析
摘要 大语言模型通过预测下一个词学习语言概率模式的本质,使其成为其所训练语料库的统计压缩体。这种本质决定了模型能够映射特定语种民族或文明的深层文化偏好,成为一个独特的“压缩镜像”。该镜像并非对文明的完整复制,而是基于海量文本数据…...
3个关键技巧:如何用Blender 3MF插件重塑你的3D打印工作流?
3个关键技巧:如何用Blender 3MF插件重塑你的3D打印工作流? 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾经遇到过这样的困境࿱…...
Youtu-Parsing模型重装系统后快速恢复:开发环境与模型服务一键配置脚本
Youtu-Parsing模型重装系统后快速恢复:开发环境与模型服务一键配置脚本 每次重装系统或者换新电脑,最头疼的是什么?对我来说,就是重新搭建开发环境。特别是那些依赖复杂的AI模型项目,比如Youtu-Parsing模型࿰…...
避坑指南:FCOS环境配置与训练中那些版本依赖的“坑”和解决方案(PyTorch 1.0+)
FCOS实战避坑手册:从环境配置到训练优化的全流程解决方案 如果你正在尝试部署FCOS目标检测模型,却频繁遭遇环境配置失败、版本冲突或训练异常等问题,这篇文章将为你提供一份详尽的避坑指南。不同于常规教程,这里聚焦于那些官方文档…...
很多团队开始用 AI Agent 写代码以后,都会经历一个很像的时刻 | 模型不行!!!
很多团队开始用 AI Agent 写代码以后,都会经历一个很像的时刻。你把任务丢过去:给用户模块加个搜索功能。20 分钟后,Agent 回来交卷。你打开项目一看:功能加了,但测试全红用的是项目里已经废弃的旧语法API 没走团队统一…...
实战指南:在华为Ascend NPU上实现大模型W8A8量化精度调优
1. 华为Ascend NPU与大模型量化基础 第一次在华为Ascend NPU上做W8A8量化时,我盯着30%的精度损失直挠头。后来才发现,这其实是硬件特性与算法特性不匹配的典型表现。华为Ascend系列NPU采用达芬奇架构,其计算单元对8bit整数的处理效率远超浮点…...
Windows Server 操作主机管理实验文档
实验概述 实验目的 本实验旨在帮助学员掌握Active Directory域环境中操作主机(FSMO)的相关知识,熟练掌握操作主机角色的查看、转移和夺取方法,能够独立处理域环境中操作主机故障相关的运维问题。 前置知识 实验开始前请掌握以下知识点: 操作主机(FSMO,灵活单一主机操作)…...
告别ArcGIS Server高成本!手把手教你用GeoServer 2.16发布ArcGIS 10.2切片包
开源GIS解决方案:GeoServer高效发布ArcGIS切片全流程指南 在GIS领域,数据可视化与在线地图服务已成为基础设施建设的标配需求。然而,商业软件高昂的许可费用常常让中小型团队望而却步——以ArcGIS Server企业版为例,单台服务器年费…...
