FreeRTOS操作系统队列及队列API函数(五)

2023-05-16

FreeRTOS学习总结

文章目录

  • 前言
  • 一、队列功能
    • 1、数据存储
    • 2、多任务访问
    • 3、出队阻塞
    • 4、入队阻塞
  • 二、队列操作过程图示
    • 1.创建队列
    • 2、向队列发送第一个消息
    • 3、向队列发送第二个消息
    • 4、从队列中读取消息
  • 二、API函数
    • 1、队列创建函数
    • 2、入队函数
    • 1、函数 xQueueSend()、xQueueSendToBack()和 xQueueSendToFront()
    • 2、队列操作实践
    • 主要代码:
  • 总结


前言

队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中
断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之
间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的
长度
,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以
也称为消息队列。FreeRTOS 中的信号量的也是依据队列实现的!所以有必要深入的了解
FreeRTOS 的队列。


提示:以下是本篇文章正文内容,下面案例可供参考

一、队列功能

1、数据存储

通常队列采用先进先出(FIFO)的存储缓冲机制,也就是往队列发送数据的时候(也叫入队)永
远都是发送到队列的尾部,而从队列提取数据的时候(也叫出队)是从队列的头部提取的。但是
也可以使用 LIFO 的存储缓冲,也就是后进先出,FreeRTOS 中的队列也提供了 LIFO 的存储缓
冲机制。
数据发送到队列中会导致数据拷贝,也就是将要发送的数据拷贝到队列中,这就意味着在
队列中存储的是数据的原始值,而不是原数据的引用(即只传递数据的指针),这个也叫做值传
递。

2、多任务访问

队列不是属于某个特别指定的任务的,任何任务都可以向队列中发送消息,或者从队列中
提取消息。

3、出队阻塞

当任务尝试从一个队列中读取消息的时候可以指定一个阻塞时间,这个阻塞时间就是当任
务从队列中读取消息无效的时候任务阻塞的时间。出队就是就从队列中读取消息,出队阻塞是
针对从队列中读取消息的任务而言的。

eg、任务 A 用于处理串口接收到的数据,串口接收到数
据以后就会放到队列 Q 中,任务 A 从队列 Q 中读取数据。但是如果此时队列 Q 是空的,说明
还没有数据,任务 A 这时候来读取的话肯定是获取不到任何东西,那该怎么办呢?任务 A 现在
有三种选择,一:二话不说扭头就走,二:要不我在等等吧,等一会看看,说不定一会就有数
据了,三:死等,死也要等到你有数据!

*1.*如果阻塞时间为0就是不阻塞,没有数据的话会马上返回任务继续执行接下来的代码。
2、如果阻塞时间为 0~ portMAX_DELAY,当任务没有从队列中获
取到消息的话就进入阻塞态,阻塞时间指定了任务进入阻塞态的时间,当阻塞时间到了以后还没有接收到数据的话就退出阻塞态,返回任务接着运行下面的代码,如果在阻塞时间内接收到了数据就立即返回,执行任务中下面的代码

3、当阻塞时间设置为portMAX_DELAY 的话,任务就会一直进入阻塞态等待,直到接收到数据为止!

4、入队阻塞

入队说的是向队列中发送消息,将消息加入到队列中。和出队阻塞一样,当一个任务向队
列发送消息的话也可以设置阻塞时间。

二、队列操作过程图示

1.创建队列

在这里插入图片描述
图 13.1.1 中任务 A 要向任务 B 发送消息,这个消息是 x 变量的值。首先创建一个队列,并
指定队列的长度和每条消息的长度。这里我们创建了一个长度为 4 的队列,因为要传递的是
x 值,而 x 是个 int 类型的变量,所以每条消息的长度就是 int 类型的长度,在 STM32 中就是 4
字节,即每条消息是 4 个字节的。

2、向队列发送第一个消息

在这里插入图片描述
任务 A 的变量 x 值为 10,将这个值发送到消息队列中。此时队列剩余长度就是3 了。前面说了向队列中发送消息是采用拷贝的方式,所以一旦消息发送完成变量 x 就可以再次被使用,赋其他的值。

3、向队列发送第二个消息

在这里插入图片描述
图 13.1.3 中任务 A 又向队列发送了一个消息,即新的 x 的值,这里是 20。此时队列剩余长
度为 2。

4、从队列中读取消息

在这里插入图片描述
中任务 B 从队列中读取消息,并将读取到的消息值赋值给 y,这样 y 就等于 10了。任务 B 从队列中读取消息完成以后可以选择清除掉这个消息或者不清除。当选择清除这个消息的话其他任务或中断就不能获取这个消息了,而且队列剩余大小就会加一,变成 3。如果
不清除的话其他任务或中断也可以获取这个消息,而队列剩余大小依旧是 2。

先发送的先读取,后发送的后读取

二、API函数

1、队列创建函数

在这里插入图片描述
函数 xQueueCreate()

QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,
UBaseType_t uxItemSize)

参数:
uxQueueLength:要创建的队列的队列长度,这里是队列的数量
uxItemSize: 队列中每个项目(消息)的长度,单位为字节 队列创捷成功以后返回的队列句柄!
NULL: 队列创建失败

2、入队函数

在这里插入图片描述
中断级一般不使用

1、函数 xQueueSend()、xQueueSendToBack()和 xQueueSendToFront()

这三个函数都是用于向队列中发送消息的,这三个函数本质都是宏,其中函数 xQueueSend()
和 xQueueSendToBack()是一样的,都是后向入队,即将新的消息插入到队列的后面。函数
xQueueSendToToFront()是前向入队,即将新消息插入到队列的前面。然而!这三个函数最后都
是调用的同一个函数:xQueueGenericSend()。这三个函数只能用于任务函数中,不能用于中断
服务函数,中断服务函数有专用的函数
,它们以“FromISR”结尾,这三个函数的原型如下:

BaseType_t xQueueSend( QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait);

BaseType_t xQueueSendToBack(QueueHandle_t xQueue,
 const void* pvItemToQueue,
 TickType_t xTicksToWait);
 
BaseType_t xQueueSendToToFront(QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait);

xQueue: 队列句柄,指明要向哪个队列发送数据,创建队列成功以后会返回此队列的
队列句柄。
pvItemToQueue:指向要发送的消息,发送时候会将这个消息拷贝到队列中。
xTicksToWait: 阻塞时间,此参数指示当队列满的时候任务进入阻塞态等待队列空闲的最大
时间。如果为 0 的话当队列满的时候就立即返回;当为 portMAX_DELAY 的
话就会一直等待,直到队列有空闲的队列 项,也就是死等,但是宏
INCLUDE_vTaskSuspend 必须为 1。
返回值:
pdPASS: 向队列发送消息成功!
errQUEUE_FULL: 队列已经满了,消息发送失败。

2、队列操作实践

在这里插入图片描述

主要代码:

任务与任务之间:
在这里插入图片描述
在这里插入图片描述
发送:
在这里插入图片描述
接收:
阻塞时间采用死等的方式
在这里插入图片描述
(串口)中断发送:
在这里插入图片描述
在这里插入图片描述
定时器接收:
在这里插入图片描述

总结

今天学习了队列的具体操作以及API函数的应用,要注意的是参数的使用方法。
继续加油!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS操作系统队列及队列API函数(五) 的相关文章

  • C++ API 设计和错误处理

    我需要使用 lib 文件 MSVC 编写 C API 它由 Dll 公开的几个导出的 C 类组成 从我的另一个问题的答案中我了解到 如果 C API 是在一个 VC 版本 假设是 2010 中构建的 并且客户端代码是在另一个 VC 版本中编
  • 如何在 .NET 应用程序中使用 W3C 标记验证器 API?

    我发现有一个W3C 标记验证器的 API http validator w3 org docs api html 我之前曾问过 是否有适用于 W3C 标记验证器 API 的 NET 库 https stackoverflow com que
  • 使用magento中SOAP API的salesOrderInfo获取简单的产品sku和数量

    我在以下代码中添加了 app code core Mage Sales Model Order Api php File public function info orderIncrementId order Mage getModel s
  • 收到“提供的 API 密钥已过期”。使用 Places API 时出错

    我已经从 Google 控制台为 Places API 密钥生成了服务器密钥 但每当我访问该服务时 我都会收到 提供的 API 密钥已过期 错误 我已尝试重新生成密钥 但仍然出现相同的错误 我遇到了同样的问题 但终于解决了 Google 地
  • Skype API 的实现[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的 Skype 插件 https stackoverflow com questions 1149615 skype addon in c sharp 如何在 C 中实现 Skype API 来
  • 如何使用 Visual C++ 在 win32 API 中创建圆形/圆形按钮

    我有一个 Visual C 中的 Window Win32 API 应用程序 我没有使用MFC 我必须创建一个带有位图图像的圆形 圆形按钮 我的应用程序有一个皮肤视图 任何人都可以帮助我完成这项任务吗 按钮是窗口 您可以使用 CreateW
  • 通过 C# 访问 Google 拼写/建议 API [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在我正在开发的应用程序中使用 Google 的拼写纠正 建议 我用 google 搜索过 但发现的只是 Google 取消的 SO
  • 如何获取 Twitter 上发布的 foursquare 签到的位置(纬度、经度)?

    我使用 Twitter API 搜索带有 4sq com 的所有公共推文 http search twitter com search json q 4sq com http search twitter com search json q
  • Soundcloud API 不明确支持 json 分页

    我正在使用的具体示例 http api soundcloud com users dubstep tracks json client id YOUR CLIENT ID http api soundcloud com users dubs
  • 尝试在 Facebook 中注册成就时出现 OAuthException 2500(未知路径组件)

    我正在尝试为应用程序注册 Facebook 开放图谱成就 我获取应用程序访问令牌并使用开放图 API 资源管理器发布以下请求 请注意 上面的应用程序 ID 和访问令牌不是真实的 但是 我得到以下答复 error message Unknow
  • Canvas.drawVertices(...) 不绘制任何内容

    下一类是红色三角形的视图 public class FreeStyleViewII extends View private final Paint paint new Paint private final int colors new
  • API 请求和curl::curl_fetch_memory(url, handle = handle) 中的错误:SSL 证书问题:证书已过期

    几天前 我运行了代码几个月 没有任何问题 GET url myurl query 今天我遇到一个错误 Error in curl curl fetch memory url handle handle SSL certificate pro
  • 在库的公共接口中使用 boost::shared_ptr

    我们有一个 C 库 提供给多个不同的客户 最近 我们从在公共接口中使用原始指针改为使用 boost sharedptr 正如您可能猜到的那样 这提供了巨大的好处 因为现在客户不再需要担心谁需要删除什么以及何时删除 当我们进行切换时 我相信这
  • 获取 2 个字母的州/省缩写

    因此 我使用 GeoNames API 获取国家 地区和州 省信息 并使用这些信息填充表单中的选择下拉列表 此表单将其信息提交给 SOAP Web 服务 并且 SOAP 服务器仅理解 2 个字母形式的国家 地区和州 省数据 IE CA 代表
  • C# 如何使用 WM_GETTEXT / GetWindowText API / 窗口标题

    我想获取应用程序的控件 句柄的内容 这是实验代码 Process processes Process GetProcessesByName Notepad foreach Process p in processes StringBuild
  • Android REST API 连接

    我有点傻 对此感到抱歉 我编写了一个 API 它返回一些 JSON 我的目标是从 Android 应用程序使用此 API 我已经尝试过使用 AsyncTask 但失败了 我想像这样使用它 调用该类 告知 URL 和结果的类型 哪个json
  • 删除或更新 HDF5 中的数据集?

    我想以编程方式更改与 HDF5 文件中的数据集关联的数据 我似乎找不到一种方法来按名称删除数据集 允许我使用修改后的数据再次添加它 或按名称更新数据集 我正在使用 HDF5 1 6 x 的 C API 但指向任何 HDF5 API 的指针都
  • 嵌入式签名 api 文档签名

    我正在使用 DocuSign 将电子签名添加到我的请求中 一切正常 现在 我使用嵌入式方法发送签名请求 通过导航到 URL 立即启动我的工作流程 登录后 执行以下代码 我得到 嵌入视图 但是当我粘贴网址尝试在导航中签署文档时 但会将我重定向
  • Facebook OAuth 验证验证码时有时会发生错误

    我在验证 Facebook 用户身份时遇到一个非常奇怪的问题 基本上它适用于 90 的用户 但对于 10 的用户 我总是收到错误 验证验证码时出错 他们尝试从不同的浏览器 操作系统登录 但总是得到相同的错误 我都是按照书本做的 https
  • 将 API 数据存储到 DataFrame 中

    我正在运行 Python 脚本来从 Interactive Brokers API 收集金融市场数据 连接到API后 终端打印出请求的历史数据 如何将数据保存到数据帧中而不是在终端中流式传输 from ibapi wrapper impor

随机推荐

  • MOBILEVITV3: MOBILE-FRIENDLY VISION TRANS- FORMER WITH SIMPLE AND EFFECTIVE FUSION OF LOCAL, GLOBAL

    paper链接 https arxiv org abs 2209 15159 code链接 MOBILEVITV3 MOBILE FRIENDLY VISION TRANS FORMER WITH SIMPLE AND EFFECTIVE
  • 位置型PID的实现——基于直线一级倒立摆

    倒立摆的实验是在小半年前的课程实验中遇到的 xff0c 由于比较感兴趣 xff0c 就多花了些时间研究了一下 xff0c 实验设备是前海格致便携倒立摆 xff0c 编写语言是C语言 xff0c 如果你需要使用其他语言 xff0c 我相信在理
  • 第7章 HBase操作

    文章目录 一 xff1a 判断题二 xff1a 单选题三 xff1a 主观题1 xff1a 创建学生表scores xff0c 列族为grade 年级 course 课程 xff0c 学生姓名name作为行健的代码 2 xff1a 查看创建
  • Python/Pytorch常用函数大汇总(持续更新中)

    python装饰器 def dec1 func print 34 1111 34 def one print 34 2222 34 func print 34 3333 34 return one def dec2 func print 3
  • 将uc/OS其移植到stm32并完成相关任务

    目录 一 uc OS的介绍 1 概述 2 工作原理 3 主要特点 二 创建cubemx项目 1 选择stm32f103c8 2 配置RCC 编辑 3 配置SYS 4 生成项目 三 移植和keil5相关操作 1 进入官网下载 xff1a ht
  • 匿名飞控TI版_PID部分,串级PID,微分先行,前馈控制

    文章目录 PID介绍有趣的故事控制模型位置式PID和增量式PID位置式PID增量式PID 串级PID前馈控制微分先行匿名代码分析 PID介绍 PID介绍 有趣的故事 PID的故事 space space space space space
  • c#委托的定义和使用

    什么是委托 xff1f 当你需要将方法当成一个参数传递的时候就需要使用委托 xff0c 委托是一个类型 xff0c 可以赋值一个方法的引用 具体怎么使用下面就简单展示一下 1 定义委托 delegate void MyDelegate in
  • ssh登录出现 “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”解决办法

    问题场景 xff1a 第一次ssh板子成功登录后 xff0c 换了另外一块同样型号的开发板 xff0c 重新ssh远程登录 xff0c 出现了WARNING REMOTE HOST IDENTIFICATION HAS CHANGED 问题
  • 多线程及网络编程

    目录 实验目的及要求 一 实验原理 xff1a 二 操作步骤 xff1a 三 实验数据 1 模拟火车站4个窗口同时卖50张票 2 使用UDP协议实现用户信息的发送和接收功能 3 运用TCP协议实现向服务器上传文件 实验结果及分析 个人简介
  • 阿里云在线扩容磁盘,最简化,但不一定适用你的ECS版本

    在扩展系统盘扩展分区和文件系统前 xff0c 请提前完成以下工作 已创建快照备份数据 为防止操作失误导致数据丢失 xff0c 建议您操作前使用快照备份数据 若尚未创建快照 xff0c 请参见创建快照 已扩容云盘 若尚未扩容 xff0c 请参
  • AD学习笔记(二)原理图库以及原理图绘制

    文章目录 AD学习笔记第二讲 原理图库以及原理图绘制一 认识原理图二 原理图库绘制三 原理图绘制1 原理图纸的操作2 原理图库的调用放置3 导线及网络标识的添加4 原理图可读性优化处理5 原理图统一编号设置6 PCB封装名称的统一添加与管理
  • C工程与寄存器封装

    目录 一 C语言工程简介 二 启动代码分析 三 C语言实现LED 四 寄存器的封装方式 五 寄存器操作的标准化 六 流水灯 一 C语言工程简介 先将工程模板解压 include里是 h文件 src里是 c文件 start里面是 s启动文件
  • Python第三章函数

    函数 文章目录 函数一 函数基础1 参数2 拆分参数列表3 参数传递位置传递地址传递传对象引用 4 函数返回值5 变量的作用域局部变量全局变量nonlocal关键字 7 包8 猴子补丁9 python标准库的应用1 random模块2 ti
  • 无显示器怎么玩树莓派

    无显示器怎么玩树莓派 文章目录 无显示器怎么玩树莓派 前言一 给树莓派烧系统二 设置WiFi及ssh端口三 远程连接四 注意事项 前言 很多时候我们在使用树莓派的时候身边都没有显示器 xff0c 关于这个问题 xff0c 我也十分苦恼 xf
  • ROS智能车定位导航仿真(Gazebo搭建赛道)

    ROS智能车定位导航仿真 xff08 Gazebo搭建赛道 xff09 前言一 ROS仿真功能包下载二 安装运行所需的插件三 racecar功能包编译四 测试程序运行五 运行功能包赛道六 注意事项 前言 Ubuntu版本 xff1a 18
  • 阿木实验室PX4开发课程整理

    1 1 xff1a alt 43 ctrl 43 t 打开终端 cd Desktop 进入到桌面目录 cd 返回上次访问目录 cd 返回上一目录 gedit circular cpp 进入某文件 roscd px4 control 进入文件
  • Java并发编程—CompletableFuture的异步执行案例

    在博主前几篇博客中 xff0c https blog csdn net qq 52545155 article details 128167519 spm 61 1001 2014 3001 5501 xff0c 给大家分享了关于多线程中异
  • 手写rtos的第一天

    唉 xff0c 不自不觉已经大三了啊 xff0c 大二的智能车生涯已经结束了 xff0c 不得不说 xff0c 省二是我不太能接受的 结果 xff0c 虽然嘴上说着没啥 xff0c 真正面对全省排名的时候 xff0c 内心的寂寥真的难以言表
  • FreeRTOS任务(动态)创建与删除(一)

    FreeRTOS学习总结 文章目录 前言一 浅浅了解二 创建任务1 动态任务创建2 动态实践 总结 前言 听朋友说 xff0c FreeRTOS很好用 xff0c 就在无聊的上网课期间浅学一下 提示 xff1a 以下是本篇文章正文内容 xf
  • FreeRTOS操作系统队列及队列API函数(五)

    FreeRTOS学习总结 文章目录 前言一 队列功能1 数据存储2 多任务访问3 出队阻塞4 入队阻塞 二 队列操作过程图示1 创建队列2 向队列发送第一个消息3 向队列发送第二个消息4 从队列中读取消息 二 API函数1 队列创建函数2