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

news2025/1/9 1:12: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:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序技术给统一门户的建设带来新思路

统一门户的发展可以追溯到20世纪90年代初期&#xff0c;当时的企业和组织开始意识到信息技术可以用于整合和管理各种分散的应用程序和服务。随着互联网的普及和Web 2.0技术的兴起&#xff0c;统一门户的发展迅速加速。 在早期&#xff0c;统一门户主要采用定制化开发的方式实现…

Qt音视频开发45-音视频类结构体参数的设计

一、前言 视频监控内核组件重构和完善花了一年多时间&#xff0c;整个组件个人认为设计的最好的部分就是各种结构体参数的设计&#xff0c;而且分门别类&#xff0c;有枚举值&#xff0c;也有窗体相关的结构体参数&#xff0c;解码相关的结构体参数&#xff0c;同时将部分常用…

动态规划的学习

文章目录 动态规划的学习一、什么是动态规划&#xff1f;二、如何思考状态转移方程&#xff1f;三、动态规划的基本原理1.[509. 斐波那契数](https://leetcode.cn/problems/fibonacci-number/)1.1 暴力递归解法&#xff1a;1.1.1 递归算法的时间复杂度那为什么时间复杂度会这么…

vcruntime140.dll丢失的解决方法分享,多种修复方式

随着最新版本的Windows 10操作系统推出&#xff0c;个人电脑的性能和功能得到了巨大提升。然而&#xff0c;尽管Microsoft已经不断更新固件和驱动程序&#xff0c;但仍然存在一些常见问题&#xff0c;例如“ vcruntime140.dll丢失 ”错误。这个错误可能会导致某些应用程序无法正…

三流面试聊技术,二流面试聊框架,一流面试…

前言 本文是为了帮大家快速回顾了软件测试中知识点&#xff0c;这套面试手册涵盖了诸多软件测试技术栈的面试题和答案&#xff0c;相信可以帮助大家在最短的时间内用作面试复习&#xff0c;能达到事半功倍效果。 本来想将文件上传到github上&#xff0c;但由于文件太大有的都…

模板学堂|BI大屏制作十大高频问题的解决技巧

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https://dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&#xff0c;并…

4.3 线性表之链表

目录 链表的存储结构 链表的结构 链表的相关运算 链表的存储结构 将线性表L(a0,a1,……,an-1)中各元素分布在存储器的不同存储块&#xff0c;称为结点&#xff0c;通过地址或指针建立元素之间的联系 结点的data域存放数据元素ai&#xff0c;而next域是一个指针&#xff…

Android Framework开发的前景如何?

Android Framework是Android操作系统中的重要组成部分&#xff0c;它提供了一系列的API&#xff08;应用程序接口&#xff09;和服务&#xff0c;方便开发人员创建Android应用程序。随着Android设备的普及和移动互联网市场的快速发展&#xff0c;Android Framework开发有着广泛…

我怎样一步一步引导ChatGPT写完一篇本科毕业论文

先了解毕业论文相关专家 给ChatGPT指定一个角色 我给ChatGPT指定一个学术导师角色&#xff0c;好家伙&#xff0c;给我谦虚起来了 好&#xff0c;换个方式&#xff0c;他开始听话了 了解论文格式 计算机科学与技术专业论文一般有哪些部分组成 选题 了解方向 请先告诉我计算…

(一)空间数据的转换与处理——投影变换

空间数据的转换与处理——投影变换 原始数据往往由于在数据结构、数据组织、数据表达等方面与用户需求不一致而要进行转换与处理。本节主要介绍 ArGIS 中数据的投影变换内容。 目录 空间数据的转换与处理——投影变换 1.概述2.定义投影3.投影变换3.1栅格数据的投影变换3.2矢量…

私人图床 - 本地快速搭建简单的EasyImage图床并实现公网远程访问

文章目录 1.前言2. EasyImage网站搭建2.1. EasyImage下载和安装2.2. EasyImage网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2 Cpolar内网穿透本地设置 4. 公网访问测试5. 结语 1.前言 一个好的图床&#xff0c;是网站或者文章图片能稳定显示的关键&…

pytest分布式执行(pytest-xdist)

前言 平常我们手工测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟。如果一个测试人员执行需要1000分钟才能执行完&#xff0c;当项目非常紧急的时候&#xff0c; 我们会用测试人力成本换取时间成本&#xff0c;这个时候多找个小伙伴把任务…

加密与解密

加密与解密 加密方式分类 加密方式主要分为两种 一种是对称加密一种是非对称加密 对称加密 对称和非对称两种方式主要说的是加密和解密两个过程。 如果对数据用一个钥匙进行了加密&#xff0c;那么&#xff0c; 你想成功读取到这个加密了的数据的话&#xff0c;就必须对这…

任务提醒工具:Gestimer for Mac

Gestimer for Mac是一款运行在mac平台上的任务提醒工具&#xff0c;可以帮助用户快速地创建提醒事项&#xff0c;提醒用户完成重要的任务。它采用了简单的手势操作&#xff0c;让用户可以更加快速地创建和管理提醒事项&#xff0c;提高了工作效率。 Gestimer是一款美丽的菜单栏…

Win10下Docker Desktop+k8s安装

一、安装docker 安装好了docker环境&#xff0c;必须是desktop 版本&#xff0c;本例子就是以docker decktop版本为基本讲解的 具体docker的安装方法如下 进入 https://www.docker.com/get-started 点击下载就是 双击“Docker Desktop Installer.exe”安装docker desktop&a…

什么是UN38.3/UN38.3/MSDS+货物运输鉴定报告是什么?怎么做?

一&#xff1a;什么是UN38.3? UN38.3是指在联合国针对危险品运输专门制定的《联合国危险物品运输试验和标准手册》的第3部分38.3款&#xff0c;简称UN38.3。 据国际航协《危险物品规则》的相关规定&#xff0c;对适用于包括但不限于单独或与设备一起运输的属可充电型锂电池的手…

JS逆向 -- 某房登录加密分析

一、输入账号密码&#xff0c;点击登录 账号&#xff1a;15836353612 密码&#xff1a;123456 二、F12打开开发者工具&#xff0c;抓包分析&#xff0c;j_password被加密了 三、全局搜索j_password&#xff0c;发现就一个JS文件 四、进入JS文件&#xff0c;局部搜索&#xff0…

励志长篇小说《周兴和》书连载之一地窖出生的孩子

第一章 苦 难 岁 月 人&#xff0c;离开母体一来到这个陌生的世界&#xff0c;或许由于胆怯&#xff0c;或许由于惶恐&#xff0c;或许由于焦虑&#xff0c;面对即将走过的人生&#xff0c;无一例外地都是嗷嗷大哭。人生美好&#xff0c;但人生无常。无论帝王或是庶民&#x…

使用chroot定制系统

假设下载的桌面系统为ubuntu.iso。 一、进入iso并安装软件包 首先创建一个目录&#xff0c;如my-ubuntu&#xff0c;然后将ubuntu.iso挂载到这个目录上&#xff0c;或者不用挂载&#xff0c;直接解压也行&#xff0c;总之要能进入到iso里面去&#xff1a; sudo mount -o loop…

2023年宜昌市中职组“网络安全”赛项竞赛任务书-2

2023年宜昌市中职组“网络安全”赛项 竞赛任务书-2 一、竞赛时间 总计&#xff1a;180分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 Windows操作系统渗透测试 100分钟 700分 任务二 Linux操作系统渗透测试…