FreeRTOS内核:详解Queue队列 FIFO(GPT4帮写)

2023-05-16

FreeRTOS内核:详解队列管理FIFO

  • 1. 背景
  • 2. Queue相关API
    • 2.1 xQueueCreate():创建
    • 2.2 xQueueSend():发送
    • 2.3 xQueueReceive():接收
    • 2.4 vQueueDelete():删除
    • 2.5 xQueuePeek() :不删除的方式从FIFO读数据,读完不改变FIFO
    • 2.6 uxQueueMessagesWaiting():返回FIFO中当前有效数据单元个数。
    • 2.7 xQueueReset():用于重置队列。
  • 3. FreeRTOS FIFO的原理
    • 读FIFO时task状态:
    • 写FIFO时task状态:
    • 关于优先级:
  • 4. 代码示例
  • 5. 总结
  • 博主热门文章推荐:
  • 附:GPT4 output:

(注:本文部分文案由ChatGPT辅助生成,但内容均经过Howie审核和优化,放心使用。)


1. 背景

当我们在嵌入式系统中使用FreeRTOS时,队列(Queue)是一种非常重要的数据结构,它可以帮助我们实现多个任务之间的通信。

在FreeRTOS中,队列的实现是基于FIFO(First-In-First-Out,先进先出)的原则,这意味着先入队列的数据将会先被出队列。

下面,我们将深入介绍FreeRTOS队列管理的细节和用法。

FreeRTOS队列是一种可以在任务之间传递数据的数据结构。队列可以存储多个数据项,每个数据项可以是任何类型的数据,例如整数和结构体。队列的实现是基于FIFO原则

在这里插入图片描述


2. Queue相关API

2.1 xQueueCreate():创建

在FreeRTOS中,我们可以使用xQueueCreate()函数来创建一个队列。该函数的原型如下所示:

QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize);

创建队列后返回一个句柄以便于对该队列进行引用, 其中,uxQueueLength参数是队列中可以存储的数据项的最大数量,uxItemSize参数是每个数据项的大小(以字节为单位)。

创建时,FreeRTOS内核从堆空间Heap分配FIFO内存空间,如果没有足够空间函数返回NULL

例如,如果我们想要创建一个可以存储10个整数的队列,可以使用以下代码:

QueueHandle_t xQueue = xQueueCreate(10, sizeof(int));

.

2.2 xQueueSend():发送

在FreeRTOS中,我们可以使用xQueueSend()函数向队列中发送数据。该函数的原型如下所示:

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

其中,xQueue参数是要发送数据的队列句柄,pvItemToQueue参数是要发送的数据的指针,xTicksToWait参数是等待数据被发送的最大时间(以FreeRTOS时钟节拍为单位)。

xQueueSend() == xQueneSendToBack()将数据发送到队列尾
中断中,要使用xQueueSendToBackFromISR()安全版本的API

例如,如果我们想要将整数10发送到队列中,可以使用以下代码:

int data = 10;
BaseType_t result = xQueueSend(xQueue, &data, 100);

在上面的代码中,我们将整数10发送到队列中,并等待100个FreeRTOS时钟节拍来等待数据被发送。该函数的返回值是一个BaseType_t类型的值,用于指示数据是否成功发送到队列中。

.

2.3 xQueueReceive():接收

在FreeRTOS中,我们可以使用xQueueReceive()函数从队列中接收数据。该函数的原型如下所示:

BaseType_t xQueueReceive(QueueHandle_t xQueue, void * pvBuffer, TickType_t xTicksToWait);

其中,xQueue参数是要接收数据的队列句柄,pvBuffer参数是一个指向缓冲区的指针,用于存储接收到的数据,xTicksToWait参数是等待数据被接收的最大时间(以FreeRTOS时钟节拍为单位)。

XQueueReceive()用于从FIFO中读取数据,读取完的单元数据同时会自动从FIFO中删除

例如,如果我们想要从队列中接收一个整数,可以使用以下代码:

int data;
BaseType_t result = xQueueReceive(xQueue, &data, 100);

在上面的代码中,我们从队列中接收一个整数,并等待100个FreeRTOS时钟节拍来等待数据被接收。该函数的返回值是一个BaseType_t类型的值,用于指示数据是否成功接收到了缓冲区中。

.

2.4 vQueueDelete():删除

在FreeRTOS中,我们可以使用vQueueDelete()函数来删除一个队列。该函数的原型如下所示:

void vQueueDelete(QueueHandle_t xQueue);

其中,xQueue参数是要删除的队列句柄。例如,如果我们想要删除上面创建的队列,可以使用以下代码:

vQueueDelete(xQueue);

.

2.5 xQueuePeek() :不删除的方式从FIFO读数据,读完不改变FIFO

同样中断中使用xQueueReceiveFromISR()

.

2.6 uxQueueMessagesWaiting():返回FIFO中当前有效数据单元个数。

.

2.7 xQueueReset():用于重置队列。


3. FreeRTOS FIFO的原理

FreeRTOS中所有的通讯与同步机制都是基于消息队列实现

  • 队列就是链表
  • 队列两个关键字:深度和每个单元的大小。其中深度即 队列可保存的最大单元数

FIFO是具有自己独立权限的内核对象,并不属于Task的资源,所有任务都可以向同一个FIFO队列写入和读出。

读FIFO时task状态:

Task读取队列可设置一个阻塞超时时间,
1、 正常情况下,在设置的超时时间内,如果FIFO为空,则task保持阻塞,当FIFO有数据写入(如其他Task或中断写FIFO),这时该Task将自动由阻塞态转为就绪态。
2、 当等待的时间超过了设定的超时时间,即使队列为空,Task也会自动转为就绪态。
如果多个任务读取FIFO,则根据优先级以及等待时间来决定哪一个Task被解除阻塞

写FIFO时task状态:

当FIFO已满时,写队列的Task进入阻塞态以等待FIFO空间有效,同样可以设置阻塞超时时间。

在这里插入图片描述

关于优先级:

如果读队列Task优先级高 -> 队列一直是空的,反之写队列优先级高 -> 队列一直是满的

一旦读队列Task从队列中读走一个数据单元,某个写队列Task就会立即抢占读队列任务,把刚读走的位置重新写入,之后便又转入阻塞态以等待队列空间有效。

如果读队列task的优先级最低,则只有在所有写队列task都进入阻塞态时,读队列task才执行,而写队列只有在队列满时才会进入阻塞态,所以读队列task执行时队列一定是满的。

4. 代码示例

下面是一个简单的代码示例,演示了如何在FreeRTOS中使用FIFO队列:

#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#define QUEUE_LENGTH 5
#define QUEUE_ITEM_SIZE sizeof(int)
QueueHandle_t queue;
void producer_task(void *pvParameters)
{
    int i;
    for (i = 0; i < 10; i++) {
        printf("Producer: Sending %d to queue\n", i);
        xQueueSend(queue, &i, 0);
    }
    vTaskDelete(NULL);
}
void consumer_task(void *pvParameters)
{
    int item;
    while (1) {
        xQueueReceive(queue, &item, portMAX_DELAY);
        printf("Consumer: Received %d from queue\n", item);
    }
}
int main(void)
{
    queue = xQueueCreate(QUEUE_LENGTH, QUEUE_ITEM_SIZE);
    xTaskCreate(producer_task, "Producer", 1000, NULL, 1, NULL);
    xTaskCreate(consumer_task, "Consumer", 1000, NULL, 1, NULL);
    vTaskStartScheduler();
    return 0;
}

在该示例中,我们创建了一个FIFO队列,并创建了一个生产者任务和一个消费者任务。生产者任务会向队列中发送数据,消费者任务会从队列中接收数据。通过这种方式,我们可以测试FIFO队列的工作原理。


5. 总结

FreeRTOS提供了非常方便和高效的FIFO队列管理方法,它可以帮助开发人员更好地管理和传输数据。在实际应用中,我们可以根据具体的需求选择不同的队列管理方法,并根据变化规律编写相应的代码来实现数据的存储和传输。


博主热门文章推荐:

在这里插入图片描述

一篇读懂系列:

  • 一篇读懂无线充电技术(附方案选型及原理分析)
  • 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信
  • 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

LoRa Mesh系列:

  • LoRa学习:LoRa关键参数(扩频因子,编码率,带宽)的设定及解释
  • LoRa学习:信道占用检测原理(CAD)
  • LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)

网络安全系列:

  • ATECC508A芯片开发笔记(一):初识加密芯片
  • SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
  • 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
  • AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例

嵌入式开发系列:

  • 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
  • IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
  • Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
  • Android底层调用C代码(JNI实现)
  • 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
  • Android/Linux设备有线&无线 双网共存(同时上内、外网)

AI / 机器学习系列:

  • AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
  • AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
  • AI: 什么是机器学习的数据清洗(Data Cleaning)
  • AI: 机器学习的模型是如何训练的?(在试错中学习)
  • 数据可视化:TensorboardX安装及使用(安装测试+实例演示)

附:GPT4 output:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

FreeRTOS内核:详解Queue队列 FIFO(GPT4帮写) 的相关文章

  • 使用 Tensorflow 对象检测 api 打乱训练数据集

    我正在使用 Faster RCNN 模型和 Tensorflow 对象检测 API 来开发徽标检测算法 我的数据集按字母顺序排列 因此有一百个阿迪达斯徽标 然后是一百个苹果徽标等 我希望在训练时对其进行洗牌 我在配置文件中添加了一些值 tr
  • Node.js 公牛队列中的作业陷入“等待”状态

    我有一堆工作在公牛队列中 其中一个被卡住了 1 个多小时 通常需要大约 2 分钟才能运行 但没有失败 我无法使用我使用的 bull arena UI 将作业从活动状态中删除 因此我删除了 Redis 中活动作业的密钥 这消除了卡住的活动作业
  • 如何在没有线程或任务队列的情况下在 Flask 中运行后台作业

    我正在使用 Flask restplus 构建 REST API 我的端点之一获取从客户端上传的文件并运行一些分析 该作业最多需要 30 秒 我不希望这项工作阻塞主进程 因此端点将立即返回 200 或 201 响应 作业仍然可以运行 结果将
  • 在C中读/写结构到fifo

    我正在尝试使用命名管道在进程之间传递结构 我在尝试打开管道非阻塞模式时陷入困境 这是我写入 fifo 的代码 void writeUpdate Create fifo for writing updates strcpy fifo writ
  • Python - 使用线程或队列迭代调用函数的 for 循环

    我对 python 相当陌生 正在制作一个脚本 允许将其他程序的点云数据引入 Autodesk Maya 我的脚本运行良好 但我想做的是让它更快 我有一个 for 循环 它遍历编号文件的列表 IE datafile001 txt dataf
  • 使用 Celery 创建动态队列

    这是我的场景 当用户登录我的网站时 我会为给定用户排队一堆任务 通常每个任务需要 100 毫秒 每个用户有 100 多个任务 这些任务排队到默认的 Celery 队列中 并且我有数百个工作线程正在运行 当任务在后端完成时 我使用 webso
  • NestJS Bull 队列:如何跳过测试环境中的处理?

    我在用着通过 Bull 的 NestJS 队列 https docs nestjs com techniques queues并用 Jest 编写单元测试 我想跳过测试期间触发的作业的处理 存在 GH 问题Bull 的测试模式 https
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 如何让客户端下载动态生成的非常大的文件

    我有一个导出功能 可以读取整个数据库并创建一个包含所有记录的 xls 文件 然后文件被发送到客户端 当然 导出完整数据库的时间需要大量时间 并且请求很快就会以超时错误结束 处理这种情况的最佳解决方案是什么 例如 我听说过使用 Redis 创
  • TensorFlow 队列关闭后可以重新打开吗?

    我想将项目入队 关闭队列以确保其他会话将所有剩余项目出队 然后在下一个纪元稍后重新打开它 这可能吗 q tf FIFOQueue close q q close reopen q with tf Session as sess sess r
  • Laravel 5.1 失败的排队作业在 failed() 方法上失败,阻止调用队列失败事件处理程序

    我正在测试 Laravel 5 1 中的队列功能 我可以让作业在我的数据库表中排队 称为作业 并且可以让它们成功运行 我还创建了一个名为 failed jobs 的队列失败表 为了测试它 在作业表中 我操作有效负载数据以使其失败 然后像这样
  • 如何在命名管道 (mkfifo) 上执行非阻塞 fopen?

    如果我有一个程序使用 mkfifo 创建并尝试打开命名管道 如何在不阻塞的情况下打开管道进行读取或写入 具体来说 我正在编写一个 C 程序 它可以在有或没有 GUI 的情况下运行 用 Java 编写 在 C 程序中 我使用 mkfifo 成
  • cron 作业和 PHP (Zend Framework) 入门

    我对 cron 作业这个主题完全陌生 所以我不知道从哪里开始学习它们 何时 为何或如何将它们与我的 Zend Framework 应用程序或一般的 PHP 一起使用 任何人都可以通过示例解释该过程 或者推荐一些好的资源来入门吗 Cron 作
  • 在内核 OpenCL 中实现 FIFO 的最佳方法

    目标 在 OpenCL 中实现下图所示 OpenCl 内核所需的主要内容是将系数数组和临时数组相乘 然后最后将所有这些值累加为 1 这可能是最耗时的操作 并行性在这里非常有帮助 我正在为内核使用一个辅助函数来执行乘法和加法 我希望这个函数也
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • 删除队列对象数组

    我正在研究一个包含数组的对象queues数组长度在调用构造函数之前才确定 基本上看起来像下面这样 include
  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • OutOfRangeError(请参阅上面的回溯):FIFOQueue '_1_batch/fifo_queue' 已关闭并且元素不足(请求 32,当前大小 0)

    我在使用队列中张量流读取图像时遇到问题 请让我知道我犯了什么错误 下面是代码 import tensorflow as tf slim tf contrib slim from tensorflow python framework imp
  • Nodejs 异步 Promise 队列

    我需要使用速率受限的 API 例如 我一秒钟只能进行 10 个 API 调用 因此我需要等待当前秒结束才能进行另一个 API 调用 为了实现这一目标 我想创建一个可以自行管理的异步队列 它的主要功能是让我向队列添加一个新的 Promise
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • Apache 2部署SSL证书

    在Ubuntu系统Apache 2部署SSL证书 本文介绍了如何在Ubuntu系统以及Apache 2中安装阿里云SSL证书 前提条件 已从SSL证书控制台下载Apache服务器证书 已安装Open SSL 环境准备 操作系统 xff1a
  • NVDIA Jetson TX2软件介绍

    介绍 JETSON TX2 模块 它是一台基于 NVIDIA Pascal 架构的 AI 单模块超级计算机 它性能强大 xff0c 但外形小巧 xff0c 节能高效 xff0c 非常适合机器人 无人机 智能摄像机和便携医疗设备等智能终端设备
  • 12.6V/8.4V锂离子或锂聚合物电池充电器

    AL1261是一款专门为高精度的线性锂电池充电器而设计的电路 xff0c 非常适合那些低成本 便携式的充电器使用 它集高精度预充电 恒定电流充电 恒定电压充电 电池状态检测 充电结束低泄漏 充电状态指示等性能于一身 xff0c 可以广泛地使
  • import requests ModuleNotFoundError: No module named 'requests'

    错误描述 xff1a import requests ModuleNotFoundError No module named 39 requests 39 解决办法 xff1a Step 1 xff1a 打开命令窗口 xff0c Win 4
  • UITableViewController

    UITableViewController 表视图控制器 UITableViewController继承自UIViewController 自带了一个tableView 其根视图就是tableView 创建UIViewVontroller运
  • stm32开发板点亮led遇到问题

    最近由于毕业设计是四旋翼无人飞行器的系统设计 xff0c 在学STM32F103R8 xff0c 学长自己设计的一块板子 xff0c 让我根据野火的教程一步一步做 xff0c 先熟悉一下板子的工作原理 xff0c 为以后编程控制电机转速做准
  • Debian Linux 的安装

    Debian Linux 的安装 作者 xff1a Grey 原文地址 xff1a 博客园 xff1a Debian Linux 的安装 CSDN xff1a Debian Linux 的安装 说明 本安装说明是基于 Windows 10
  • 基于pytest设计自动化测试框架实战

    简介 基于pytest实现测试用例收集方案 自定义参数化方案 页面元素定位数据存储方案 测试用例数据存储和维护方案 xff0c 这样可直接进入到设计编写测试用例业务代码阶段 xff0c 避免重复设计这些方案以及方案不统一导致维护复杂 困难的
  • windows安全模型--令牌(token)和安全描述符

    当一个程序访问一个资源时 xff0c 需要有相应的访问权限 windwos安全模型中 xff0c 有两个角色 xff0c 一个就是访问者 xff08 进程 xff09 xff0c 一个是被访问者 xff08 资源 xff09 资源 xff0
  • firefox查找插件和插件媒体类型的方法

    firefox从两个位置加载插件 xff0c 并查找插件对应的媒体类型 xff08 mimetype xff09 1 安装目录的plugins文件夹下 可以直接把一个插件的dll放到plugins目录下 xff0c 该插件对应的媒体类型 x
  • Windows内存机制的问与答

    学习windows内存管理过程中 xff0c 会先有些疑问 xff0c 然后在不断学习中得到解答 xff0c 解答也是基于我的不断理解 xff0c 未必完全正确 下面记录一些 一 如果一个内存页没有被修改过 xff0c 操作系统可以直接释放
  • Python中if语句的使用方法

    if语句用来表示某种可能的情况 xff0c 并如何处理该情况 if语句可以用来表示一种可能性 两种可能性或者多种可能性 1 一种可能性 单个的if语句表示一种可能性 xff0c if关键字后面跟着表达式 xff0c 当表达式是True时 x
  • [Util]-VSCode+WSL开发环境

    文章目录 WSL升级到WSL2安装编译环境相关命令 VSCode快捷键书签代码折叠 配置文件C 43 43 格式化 远程linux 调试程序启动调试变量查看print打印display追踪x内存 变量监控 VSCode是非常流行的代码编辑器
  • 用递归方法求n的阶乘(C语言)

    用递归方法求n xff01 include lt stdio h gt int main int n int y printf 34 input a integer number 34 scanf 34 d 34 amp n y 61 fa
  • ./nginx: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No suc

    span class token function ln span s usr local lib64 libssl so 1 1 usr lib64 libssl so 1 1 span class token function ln s
  • RootCause深度分析:为什么DCache常会导致LCD显示异常(数据一致性问题)

    DCache导致LCD显示异常RootCause深度分析 问题描述 xff1a L1 L2 Cache简介问题分析 xff1a 问题解决 xff1a 如何编程 xff1a InvalideCleanHyperRAM xff1a Cache
  • FreeRTOS内核笔记(一):基本知识和命名规则

    FreeRTOS内核笔记 xff08 一 xff09 xff1a 基本知识和命名规则 FreeRTOS内核笔记命名规则 xff1a 常用宏定义Thread运行状态 xff1a RTOS TickContext切换 xff1a 实时调度器Sc
  • pyttsx3 快速上手之:语音合成播报

    Python pyttsx3 快速上手之 xff1a 语音合成播报 安装 pyttsx3 xff1a API封装API使用博主热门文章推荐 xff1a pyttsx3 是python中最常用的文字转语音库 xff0c 使用方便 xff0c
  • FreeRTOS内核:详解Task各状态(GPT4帮写)

    FreeRTOS内核 xff1a 详解Task各状态 xff08 GPT4帮写 xff09 1 背景2 Task顶层状态区分3 运行状态 xff08 Running xff09 4 非运行状态4 1 阻塞态 xff08 Blocked xf
  • FreeRTOS内核:详解Queue队列 FIFO(GPT4帮写)

    FreeRTOS内核 xff1a 详解队列管理FIFO 1 背景2 Queue相关API2 1 xQueueCreate xff1a 创建2 2 xQueueSend xff1a 发送2 3 xQueueReceive xff1a 接收2