使用 message buffer 传递数据

2023-05-16

使用 message buffer 传递数据

概述

MessageBuffer,即消息缓冲区,是在流式缓冲区的基础上实现的针对离散消息的专用通信组件,其进一步针对“消息”进行设计改进。

在 StreamBuffer 的基础上,MessageBuffer 对每条数据的长度进行了记录。MessageBuffer每一条消息的写入增加了一个字段用来表示该条消息的长度。读取时需要一次性读出至少一条消息,否则会返回读取失败。

如下所示,在使用 MessageBuffer 时发送数据的一方在调用发送数据的接口时,组件会自动记录该条消息的长度。接收数据的一方接收到该条数据时,可以知道该条数据的长度。而 StreamBuffer 会把这些数据处理成连续的字节流,没有明确的区分它们到底属于什么结构的数据。

在这里插入图片描述
与 StreamBuffer 一样,MessageBuffer 适用于 一个发送者、一个接收者的数据通信场景。在多个发送者、接收者时需要添加互斥保护机制。

主要的 API 如下:

// 使用动态分配的内存创建新的消息缓冲区
MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes ); //消息缓冲区在任何时候都能够保存的总字节数(不是消息)。当消息写入消息缓冲区时,还会写入额外的大小(size_t)字节来存储消息的长度。例如存入一个 8bytes 的消息,则共使用的存储空间为 sizeof(size_t) + 8.

size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer, // 消息缓冲区的句柄。
                           const void *pvTxData, // 要复制到消息缓冲区的消息的指针。
                           size_t xDataLengthBytes, // 消息的长度。即,要从 pvTxData 复制到消息缓冲区的字节数。当消息写入消息缓冲区时,还会写入额外的大小(size_t)字节来存储消息的长度。
                           TickType_t xTicksToWait ); // 无法发送该条消息时,最大等待的时间。若发送成功则唤醒等待消息的任务。

size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,// 消息缓冲区的句柄。
                              void *pvRxData, // 指向要将收到的消息复制到的缓冲区的指针。
                              size_t xBufferLengthBytes, // pvRxData 参数所指向的缓冲区的长度。这将设置可以接收的消息的最大长度。如果 xBufferLengthBytes 太小而无法容纳下一条消息,则该消息将保留在消息缓冲区中,并返回 0。
                              TickType_t xTicksToWait ); // 等待消息的最大延时时间。

需求及功能解析

示例给出了使用 MessageBuffer 发送两种不同的离散消息的场景:

uint8_t ArrayToSend1[] = { 0, 1, 2, 3 }; // 短数据串
uint8_t ArrayToSend2[] = { 4, 5, 6, 7, 8, 9}; // 长数据串

示例解析

使用 MessageBuffer 发送两种不同的离散消息的示例输出如下:

This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, Minimum free heap size: 295348 bytes
TASK1: array is 1
TASK2: receive length is 4
TASK2: The buffer data is as follows:00 01 02 03 
TASK1: array is 2
TASK2: receive length is 6
TASK2: The buffer data is as follows:04 05 06 07 08 09 
TASK1: array is 1
TASK2: receive length is 4
TASK2: The buffer data is as follows:00 01 02 03 
TASK1: array is 2
TASK2: receive length is 6
TASK2: The buffer data is as follows:04 05 06 07 08 09 
TASK1: array is 1
TASK2: receive length is 4
TASK2: The buffer data is as follows:00 01 02 03 

讨论

1)存储身份证号和手机号的场景中,使用 queue、stream buffer、message buffer 时的示意图如下:

在这里插入图片描述

队列因为只能存储固定大小的数据,它需要按照最长的数据“身份证号”分配两块空间来存储身份证号+手机号。并且接收方要接收两次数据才能接收一次完整的身份证号+手机号。

流式缓存区可以存储身份证号和手机号,但它没有记录两者的长度,不容易区分到底哪部分数据属于身份证号、哪部分属于手机号,它不适合处理离散的数据块。

消息缓存区存储身份证号、手机号,并自动地记录它们的长度,最适合处理这种离散的消息。

2)目前讲述的通信组件 queue、StreamBuffer、MessageBuffer都具备一定的缓存能力,但他们都没有提供管理数据溢出的机制,即缓冲区写满之后,再次写入数据如何处理的问题,我们将在下一节介绍一种提供这个溢出管理机制的通信组件-ringbuffer。

总结

1)队列 queue 处理固定大小的消息,通常是一个结构,但它也可以是一个包含指针的基类型。StreamBuffer 流缓冲区将消息作为字节流进行处理。消息将作为一个单元放入队列中,并且没有任何固定大小(只是它应该适合缓冲区的最大值),并且在取出时,可以以任意长度检索获取存入的数据。消息缓冲区保存具有固定大小的离散消息,但每条消息不必具有相同的大小,并且在取出时,消息的形式与存入时完全一致。

2)MessageBuffer 与 StreamBuffer 一样,适用于 一个发送者、一个接收者的数据通信场景。在多个发送者、接收者时需要添加互斥保护机制。

资源链接

1)Learning-FreeRTOS-with-esp32 系列博客介绍
2)对应示例的 code 链接 (点击直达代码仓库)

3)下一篇:使用 Ring Buffer 完成数据传递

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

使用 message buffer 传递数据 的相关文章

  • 使用自定义光标强制 WM_NCHITTEST 返回 HTCAPTION..?

    我创建了一个无边框窗口 使用wndProc 函数 强制WM NCHITTEST case回来HTCAPTION 它允许用户拖动窗口 无论其光标位于何处 问题是我设置了自定义光标 但是使用上述方法 光标总是设置回IDC ARROW 我该如何解
  • 无法设置 datagramPacket 对象中缓冲区的偏移量

    在java库中 http download java net jdk7 archive b123 docs api java net DatagramPacket html http download java net jdk7 archi
  • 当在 Node.js 中从 firebird 中选择时,未知值

    我是火鸟的新人 我试图从数据库中获取名称 但它返回
  • 如何获取以 Uint8Array 表示的图像的大小?

    我有一个用户头像图片的字节数组 它表示为键入的Unit8Array const imageBytes new Unit8Array 现在我需要检查图像大小以设置一些限制以防止用户放置大量图像 但我无法想出如何计算图像大小的想法 我该如何编写
  • 刷新jsp文件时线程锁定

    在重负载下 当 GZipping 和解压缩 JSP 文件时 我看到很多线程被锁定 线程转储如下所示 似乎来自大小为 14Kb 的 header jsp http 0 0 0 0 8080 304 daemon prio 3 tid 0x00
  • 为什么 openGL glDepthFunc() 不起作用?

    我正在玩 openGL 我试图摆脱蓝色标记的三角形 我用这个代码 glEnable GL DEPTH TEST glDepthFunc GL LESS glEnable GL CULL FACE 是的 我用 glClear GL COLOR
  • 运行时更改进度对话框消息

    我有一个相当简单的问题 我不知道如何解决 我想在进度对话框运行和显示时更改其消息文本 一个例子是 剩余时间 计数器 它会在进度动画旋转时进行倒计时 我不确定如何解决这个问题 因为即使在正在运行的线程中执行progressDialog set
  • 保护字符串缓冲区免受两个线程的影响?

    我正在通过 Indy 套接字处理流数据包字符串 在客户端 我有一个线程从TIdTCPClient并将这些数据连续附加到单个字符串缓冲区的末尾 我有另一个线程从头开始连续读取该缓冲区 根据需要复制 和删除 数据 一次一个完整的数据包 我知道在
  • Java 中最好的可调整大小的循环字节缓冲区是什么?

    我需要 Java 中的字节缓冲区类以供单线程使用 我应该能够在缓冲区后面插入数据并在前面读取数据 摊销成本为 O 1 缓冲区在满时应该调整大小 而不是抛出异常或其他东西 我可以自己写一个 但如果标准 Java 包中尚不存在这个 我会感到非常
  • Log4Net 中 AdoNetAppender 中的缓冲区的惰性评估

    我正在使用 Log4Net 自定义属性将一些环境信息添加到我的日志中 我创建了一个具有全局可访问属性的实用程序类 我的程序类使用它来存储上下文信息 订单 id 用户 id 等 以及围绕它们的惰性包装器 因此我不需要一直更改 Log4Net
  • 我如何在 Skype 上玩 google?

    此代码用于在 Skype 上向某人发送消息 但我不知道如何设置https play google com store apps details id com skype raider https play google com store
  • 在 Ubuntu 11.04 中禁用堆栈崩溃保护

    我在 2007 年 MacBook 上运行 32 位 Ubuntu 11 04 并且刚刚开始了解缓冲区溢出漏洞 我正在尝试运行书中的示例程序 但 Ubuntu 的安全措施使我无法成功执行缓冲区溢出 这是我尝试运行的代码 include
  • 如何使用 python smtplib 向多个收件人发送电子邮件?

    经过大量搜索后 我无法找到如何使用 smtplib sendmail 发送给多个收件人 问题是每次发送邮件时 邮件标头都会显示包含多个地址 但实际上只有第一个收件人会收到电子邮件 问题似乎在于email Message http docs
  • 在 JavaScript 或 Node 中将 Blob 数据转换为原始缓冲区

    我正在使用插件jsPDF https github com MrRio jsPDF它生成 PDF 并将其保存到本地文件系统 现在在 jsPDF js 中 有一些代码可以生成 blob 格式的 pdf 数据 如下所示 var blob new
  • BufferedWriter在java中如何工作

    我经常将文本输出到文件中 我想知道一件事 怎么办BufferedWriterwork 当我打电话时它会在文件中写入文本吗writer write text 如果不写文本 我需要使用flush函数来写数据吗 例如 File file new
  • 在 Matlab、VB6 和 VB.NET 程序之间发送消息的最简单方法

    我们正在将一套数据采集和分析例程从 VB6 程序升级为 VB NET VB6 和 Matlab 程序的混合体 我们希望保持系统模块化 单独的 EXE 以便我们可以轻松创建专门的独立分析程序 而无需不断升级大型应用程序 当所有程序都是用 VB
  • 在 C++\Win32 中编辑控件文本更改消息

    与 NET for C Win32 中的 TextChanged 属性匹配的消息是什么 假设你正在谈论编辑控件 http msdn microsoft com en us library bb775458 VS 85 aspx EN CHA
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行

随机推荐

  • AUTOSAR E2E & SecOC Comparison

    AUTOSAR E2E amp SecOC Comparison 前面已经介绍过了E2E 和 SecOC CMAC 了 xff0c 既然2者都可以进行数据完整性保护 xff0c 那么2者有什么区别呢 下面基于我的经验所总结 欢迎补充 xff
  • 解决:source devel/setup.bash(只在当前终端生效)的问题,使其在其他终端

    解决方法 xff1a 终端输入 xff1a gedit bashrc 文件打开后直接翻到最后面 在底部添加source catkin ws devel setup bash 保存退出即可
  • ROS与C++入门教程

    https www ncnynl com archives 201701 1279 html
  • HiChart图表统计:jsp中hichart用法以及从后台获取数据

    在做web服务器时 xff0c 用到了图表 xff0c 对一天内资源的下载量进行统计 xff0c 让数据更加的直观 上网查了很多资料 xff0c 最后发现HiChart很好用 xff0c 相对比较简单 下面作以详细介绍 xff1a 1 首先
  • [论文]欠驱动水下机器人的平面轨迹规划与跟踪控制设计

    论文 欠驱动水下机器人的平面轨迹规划与跟踪控制设计 摘要 研究了欠驱动自主水下航行器在水平面上的轨迹规划与跟踪控制的组合问题 给定光滑的 惯性的二维参考轨迹 xff0c 规划算法利用车辆动力学计算参考方向和机体固定速度 利用这些 xff0c
  • sql查询语句汇总,先撸为敬

    一 简单查询语句 group by 和having的区别 链接 二 复杂查询 1 数据分组 max min avg sum count SQL gt SELECT MAX sal MIN age AVG sal SUM sal from e
  • 最优化的基本概念

    最优化的基本概念 连续和离散优化问题无约束和约束优化问题随机和确定性优化问题线性和非线性规划问题凸和非凸优化问题全局和局部最优解优化算法 一般来说 xff0c 最优化算法研究可以分为 xff1a 构造最优化模型 确定最优化问题的类型和设计算
  • [RISCV]为RISC-V移植FreeRTOS系列之一 -- 目录结构

    前言 写这篇文章的时候 xff0c 我基本已经完成了这项工作了 xff0c 花了一周的时间来把freertos porting到Andes公司的N25 riscv core上 xff0c 本来其实是想支持国产的RT Thread xff0c
  • [RISCV]为RISC-V移植FreeRTOS系列之三 -- 时基

    前言 书接上回 xff0c 上回说到我们已经做好了准备 xff0c 所谓万事具备 xff0c 就差一场东风 xff0c 而能吹动FreeRTOS这条大船的是什么呢 xff1f 没错 xff0c 聪明的你已经猜到了 xff0c 是时基 有过其
  • [RISCV]为RISC-V移植FreeRTOS系列之四 -- 中断与trap handler

    前言 上回说到了我们已经把系统的心跳动起来了 xff0c 但是这里面还有一个问题 xff0c 我们都知道timer中断 xff0c 中断的trap怎么来的呢 这回就来解决这个事情 作者 xff1a wangyijieonline 链接 xf
  • [RTOS]uCOS、FreeRTOS、RTThread、RTX等RTOS的对比之特点

    最近正好又重新回顾了一下这几款OS xff0c 心里一直有个疑问 xff0c 明明这几款RTOS是这么像 xff0c 为什么还要搞出这么多个来呢 xff0c 最后的结论就是 xff0c 管他呢 xff0c 反正哪个用的顺手用哪个 本篇博客就
  • git submodule

    此文已由作者张磊薪授权网易云社区发布 欢迎访问网易云社区 xff0c 了解更多网易技术产品运营经验 前言 submodule 目前对 git 仓库拆分的已有实现之一 环境 git version 2 7 4 windows 1 准备工作 首
  • FreeRTOS 通信方式

    文章目录 一 消息队列二 信号量三 互斥量四 事件五 通知 一 消息队列 消息队列是一种常用于任务间通信的数据结构 xff0c 队列可以在任务与任务间 中断和任务间传递信息 读写队列均支持超时机制 1 创建队列 QueueHandle t
  • 芯片、模组、开发板的区别与联系-结合ESP32浅谈

    1 从外形说起 xff1a 1 1芯片 没错 xff0c 这块黑色的小硅片就是 芯片 本体 xff08 通常比大拇指还小 xff0c 内部集成了实现特定功能的硬件集成电路 xff09 1 2模组 由上述芯片研发的模组是这样的 xff1a 从
  • 一文读懂局域网、广域网、WLAN、WiFi的联系与区别

    1 引言 最近总有小伙伴问我 xff0c 广域网 局域网的区别与联系 WLAN与WiFi的关系 xff0c 遂写此文 xff0c 以作解答 2 广域网与局域网 广域网 xff08 Wide Area Network xff09 xff0c
  • RTOS 和裸机系统的异同-基于 ESP32 学习双核 FreeRTOS 的使用

    Learning FreeRTOS with esp32 什么是 RTOS 其本质上是运行在小型嵌入式设备上的特殊软件 系统软件 如同手机的安卓系统软件 windows 系统软件 RTOS VS 裸机系统 传统的裸机系统 xff08 无操作
  • u盘打开之后就只有一个快捷方式

    我今天也出现了这种问题 xff0c 百度一下发 现都解决不了 xff0c 然后自己尝试了一个新的方法 xff1a 其实还有一个又简单又好用又快捷的方法就是 1 只要你记得你的U盘里的任何一个文件或者文件夹的名称 xff0c 2 然后搜索U盘
  • FreeRTOS 删除任务

    FreeRTOS 删除任务 概述 任务的删除使用的 API 为 xff1a void vTaskDelete TaskHandle t xTask 任务删除主要是两种情况 xff1a 自删除 xff0c 即在任务本身的 TaskCode 中
  • 使用 stream buffer 传递数据

    使用 stream buffer 传递数据 概述 如前所述 xff0c 队列虽然提供了任务之间传递数据的功能 xff0c 但没有对通知机制进行优化 xff0c 即不方便实现多次采集不同长度的数据 xff0c 然后触发一次通知接收的机制 特性
  • 使用 message buffer 传递数据

    使用 message buffer 传递数据 概述 MessageBuffer xff0c 即消息缓冲区 xff0c 是在流式缓冲区的基础上实现的针对离散消息的专用通信组件 xff0c 其进一步针对 消息 进行设计改进 在 StreamBu