15.FreeRTOS数据结构:StreamBuffer,MessageBuffer和Queue的区别

FreeRTOS数据结构:StreamBuffer,MessageBuffer和Queue的区别

介绍

在嵌入式系统开发中,任务间的通信是非常重要的一部分。FreeRTOS提供了多种数据结构来实现任务间的通信,包括StreamBufferMessageBufferQueue。这三种数据结构各又什么特点又有什么区别呢?

StreamBuffer

StreamBuffer是FreeRTOS中用于任务间或任务与中断间连续数据传输的数据结构。它允许你发送和接收任意长度的数据。StreamBuffer的主要特点是:

  • 数据连续:StreamBuffer传输连续的数据,可以一次写入任意数量的字节,并且可以一次读取任意数量的字节。
  • 适用场景:StreamBuffer主要应用于一个发送者一个接收者的场景,比如从中断发送给task,或者从一个cpu核发送到另一个cpu核。

MessageBuffer

MessageBuffer是FreeRTOS中用于任务间或任务与中断间离散数据传输的数据结构。它允许你发送和接收带有长度的消息。MessageBuffer的主要特点是:

  • 数据离散:MessageBuffer传送离散的带有长度的消息,每一条消息的写入增加了一个字节用来表示该条消息的长度。
  • 适用场景:MessageBuffer非固定长度,带有长度标签,适合传输协议帧数据。

Queue

Queue是FreeRTOS中用于任务间或任务与中断间数据传输的数据结构。它允许你发送和接收固定大小的数据项。Queue的主要特点是:

  • 数据固定:Queue传送固定大小的数据项,每一条数据项的大小在创建队列时确定。
  • 适用场景:Queue适用于多任务间的数据传输,可以有多个发送者和接收者。

Stream Buffer 和 Message Buffer的一些不同:

它们都可以用于任务-任务,任务-中断的数据传输,都遵循FIFO先进先出原则,数据传递的方式为拷贝。但是,它们之间存在一些关键的区别:

  1. 数据单位Stream Buffer传输连续的数据,可以一次写入任意数量的字节,并且可以一次读取任意数量的字节。而Message Buffer传送离散的带有长度的消息,每一条消息的写入增加了四个字节用来表示该条消息的长度。

  2. 接收方式Message Buffer一次只能接收1条Message,而Stream Buffer则根据长度接收。Message Buffer在接收缓冲区<1条消息大小时,不会接收,而Stream Buffer则会将数据截断接收。

  3. 使用场景Stream Buffer主要应用于一个发送者一个接收者的场景,比如从中断发送给task,或者从一个cpu核发送到另一个cpu核。而Message Buffer非固定长度,带有长度标签,适合传输协议帧数据。

需要注意的是,与大多数其他FreeRTOS API不同的是,Stream BufferMessage Buffer针对单个读取器单写入器场景进行了优化,例如将数据从中断服务例程传递到任务,或者从双核CPU上的一个微控制器核心传递到另一个。在多任务读写的环境中,需要将该函数相关的调用置于关键区域内(taskENTER_CRITICAL和taskEXIT_CRITICAL),也可以使用互斥信号量来解决。

以下是StreamBufferMessageBuffer接收数据的示例:

StreamBuffer示例

假设我们有一个StreamBuffer,其中包含字符串"Hello, World!"(包括结束符’\0’,总共13个字节)。我们的接收缓冲区只有10个字节的大小。

char pcReceivedString[10];
size_t xReceivedBytes;xReceivedBytes = xStreamBufferReceive(xStreamBuffer, (void *)pcReceivedString, 10, portMAX_DELAY);

在这种情况下,xStreamBufferReceive()将会接收前10个字节的数据(“Hello, Wor”),并返回接收到的字节数(10)。剩下的数据(“ld!\0”)仍然留在StreamBuffer中。

MessageBuffer示例

假设我们有一个MessageBuffer,其中包含消息"Hello, World!"(包括结束符’\0’,总共13个字节,加上4个字节的长度字段,总共17个字节)。我们的接收缓冲区只有10个字节的大小。

char pcReceivedMessage[10];
size_t xReceivedBytes;xReceivedBytes = xMessageBufferReceive(xMessageBuffer, (void *)pcReceivedMessage, 10, portMAX_DELAY);

在这种情况下,xMessageBufferReceive()将会检查下一条消息的大小。由于下一条消息的大小(13个字节)大于接收缓冲区的大小(10个字节),xMessageBufferReceive()将不会接收任何数据,而是立即返回0。消息"Hello, World!"仍然完整地留在MessageBuffer中。

结语

这就是StreamBufferMessageBuffer在接收数据时的主要区别。StreamBuffer会根据长度接收数据,即使这意味着数据会被截断。而MessageBuffer则会检查整条消息是否可以完整地接收,如果不能,它就不会接收任何数据。

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

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

相关文章

SpringBootWeb登录认证

JWT令牌 JSON Web Token JSON Web Tokens - jwt.ioJSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signatur…

MogDBopenGauss查询重写规则uniquecheck

在MogDB&openGauss中,参数rewrite_rule用于控制查询重写,本文介绍查询重写规则uniquecheck uniquecheck表示提升无agg的where子查询 现在有如下例子 orcl> explain analyze select count(*)from test01 t1where t1.data_object_id (select data…

文件系统和日志分析

文件系统 概述 文件是存储在硬盘上的。硬盘上的最小存储单位是扇区,每个扇区的大小是512字节。 inode号:又叫索引号,保存的是元信息(主要有文件的属性 :包括权限,创建者,创建日期等&#xff…

Nodejs 调用langchain的实验

langchain 支持js/ts 语言,可以在nodeJs 中调用langchain 。这有利于在网站后台软件中使用,本博文记录做的小实验。 安装与升级 升级node 直接在官网下载,重新安装就可以了。 安装大模型模块 npm install openai 安装langchain npm insta…

Renesas MCU之使用e² studio搭建开发环境

目录 概述 1 e studio介绍 2 搭建Renesas MUC开发环境 2.1 软件版本信息 2.2 安装软件 3 创建工程 3.1 板卡硬件接口 3.2 FSP配置IO 4 Generate Project 4.1 项目目录介绍 4.2 LED接口相关驱动 5 调试 5.1 测试代码 5.2 J-Link调试代码 5.3 硬件结构 概述 本文主…

ES6-01-简介

一、什么是ES6? 每年一个版本o(╥﹏╥)o。 二、javaScript新特性的特点 1、语法简洁,功能丰富; 2、框架开发应用。 3、岗位需求! 三、let关键字 3-1、声明变量 let a;let a,b;let e100;let f521, gmilk-love, h[]; 3-2、声明的…

python采集汽车价格数据

python采集汽车价格数据 一、项目简介二、完整代码一、项目简介 本次数据采集的目标是车主之家汽车价格数据,采集的流程包括寻找数据接口、发送请求获取响应、解析数据和持久化存储,先来看一下数据情况,完整代码附后: 二、完整代码 #输入请求页面url #返回html文档 imp…

Linux C/C++目录操作

获取当前目录 #include <unistd.h>char *getcwd(char *buf,size_t size); char *get_current_dir_name(void);//注意释放内存 malloc() free()切换工作目录 #include <unistd.h>int chdir(const char *path);//0成功&#xff0c;其他失败&#xff08;目录不存在…

fbd编程语言:深度解析与未来展望

fbd编程语言&#xff1a;深度解析与未来展望 在编程语言的浩瀚海洋中&#xff0c;fbd编程语言以其独特的魅力和潜力&#xff0c;逐渐引起了开发者的关注。那么&#xff0c;fbd编程语言究竟有何特别之处&#xff1f;它的发展前景又如何呢&#xff1f;本文将从四个方面、五个方面…

PostgreSQL的视图pg_class

PostgreSQL的视图pg_class 在 PostgreSQL 中&#xff0c;pg_class 是一个系统目录表&#xff0c;用于存储所有关系&#xff08;如表、索引、视图、序列等&#xff09;的元数据。pg_class 是数据库系统的重要组成部分&#xff0c;包含了关于每个关系的具体信息。 pg_class 视图…

数据结构基础篇(7)

二十三.串、数组和广义表 -串的定义 零个或多个任意字符组成的有限序列串的术语 - 子串&#xff1a;一个串中任意连续字符组成的子序列&#xff08;含空串&#xff09;叫该串的子串- 主串&#xff1a;包含子串的串对应叫主串- 字符位置&#xff1a;字符在序列中序号是该字符串…

react-intl国际化在项目中的使用

前言 使用成熟的第三方库的国际化&#xff0c;可以直接使用封装好的方法&#xff0c;这个国际化的原理其实是使用了react 的第三方库react-intl &#xff0c;感觉主要比较好的就是使用其中的模版&#xff0c;它的本质还是通过了Provider的形式 第一步新建文件夹&#xff0c;计…

Python 限制输入数的范围

Python 限制输入数的范围 在 Python 编程中&#xff0c;我们经常需要限制用户输入的数据范围&#xff0c;以避免一些可能出现的问题。例如&#xff0c;在一个游戏程序中&#xff0c;我们可能想要确保玩家的分数在某个范围内&#xff0c;而不是太高或太低。在这个博文中&#x…

minos 2.4 中断虚拟化——中断子系统

首发公号&#xff1a;Rand_cs 该项目来自乐敏大佬&#xff1a;https://github.com/minosproject/minos 前面讲述了 minos 对 GICv2 的一些配置和管理&#xff0c;这一节再往上走一走&#xff0c;看看 minos 的中断子系统 中断 中断描述符 /** if a irq is handled by minos…

属性(property)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 创建用于计算的属性 在Python中&#xff0c;可以通过property&#xff08;装饰器&#xff09;将一个方法转换为属性&#xff0c;从而实现用于计算…

几种更新 npm 项目依赖的实用方法

引言 在软件开发的过程中&#xff0c;我们知道依赖管理是其中一个至关重要的环节。npm&#xff08;Node Package Manager&#xff09; 是 Node.js 的包管理器&#xff0c;它主要用于 Node.js 项目的依赖管理和包发布。随着项目的不断发展&#xff0c;依赖库的版本更新和升级成…

字符串-459重复字符串

459. 重复的子字符串 - 力扣&#xff08;LeetCode&#xff09; 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "ab…

基于Win11下的Wireshark的安装和使用

Wireshark的安装和使用 前言一、Wireshark是什么简介 二、下载Wireshark下载过程查看自己电脑配置 三、安装Wireshark安装过程安装组件创建快捷方式winPacpNpcap 打开检验 四、使用Wireshark实施抓包捕获数据包 五、基于Wireshark使用显示过滤器简介使用方法注意ICMP的请求和应…

【明道云】如何在发送邮件模块给出多条记录形成的列表

【背景】 在完成批量分别发送邮件给不同部门担当的任务后,作为主管部门的用户希望能够获得成功得到处理的所有记录信息。这些信息需要在提醒邮件中以表格形式呈现。 【分析】 获得多条记录的方法能够拿到数据,问题在于如何合适地以表格形式呈现在邮件中。 只有富文本支持表…

c++文件流

1.流的概念 在 C 中&#xff0c;流&#xff08;stream&#xff09;是一种用来处理输入输出数据的概念。 可以把流看作从源头&#xff08;如文件、键盘、网络连接等&#xff09;到终端的数据传输管道。 这些管道在程序运行时动态创建&#xff0c;并可以连接到多种不同的源头和…