使用 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 传递数据 的相关文章

  • Magento:如何在管理面板中使用 JS 显示标准错误/成功消息?

    我可以从服务器端将错误 成功消息添加到 Magento 管理面板 例如 Mage getSingleton core session gt addError 但是如何使用 JS 在客户端显示相同的消息呢 我的意思是标准方式 当然我可以创建相
  • C# 中的 StreamReader 和缓冲区

    我对 StreamReader 的缓冲区使用有疑问 这里 http msdn microsoft com en us library system io streamreader aspx http msdn microsoft com e
  • 如何在vim的ex模式下从缓冲区粘贴?

    我在从文件复制某些文本然后将其复制到新的拆分窗口时遇到问题 3yy 新 p 在命令模式下它的工作 当我按下时 复制后分割窗口中的 p 它的工作 我理解您想要 拉出当前缓冲区中的当前行和下面的两行 在新的水平分割中打开一个空缓冲区并 将这三行
  • Symfony2 自定义表单错误消息

    你能帮我了解如何使用 Symfony2 自定义表单中的错误消息吗 我想更改 HTML 布局 添加 div 类等 阅读指南 它给出了一段代码 可以放入一个名为的文件中fields errors html twig但它没有告诉将该文件放在哪里以
  • 为什么启用自动刷新后使用空打印?

    我在一段代码中发现了类似的东西 use IO Handle autoflush STDOUT 1 print 打印 的目的是清空可能已满的缓冲区吗 The print强制立即输出缓冲区中的所有文本 来自先前的打印 该代码基本上禁用缓冲并刷新
  • 在没有缓冲区的情况下将数据从 fstream 复制到 stringstream?

    无论如何 我可以从fstream 一个文件 到一个stringstream 内存中的流 目前 我正在使用缓冲区 但这需要双倍的内存 因为您需要将数据复制到缓冲区 然后将缓冲区复制到字符串流 直到删除缓冲区为止 数据都会在内存中复制 std
  • 向 Windows 窗体消息循环发送或发布消息

    我有一个线程从命名管道读取消息 它是阻塞读取 这就是它在自己的线程中的原因 当该线程读取消息时 我希望它通知主线程中运行的 Windows 窗体消息循环消息已准备就绪 我怎样才能做到这一点 在win32中我会做一个PostMessage 但
  • 无法获取 GED 日志缓冲区,错误(0)

    我的 Android 项目有一个大问题 那就是error Failed to get GED Log Buf err 0 我真的不知道该怎么办以及如何解决它 有人可以帮我吗 非常感谢 Find Advanced logging在你手机的De
  • 在 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
  • PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

    我预计由于 PrintStream 是缓冲的 通过在每次 print 之后添加刷新操作 速度性能应该会显着降低 但事实并非如此 如下面的代码片段所示 此外 将 PrintStream 包裹在 BufferedOutputStream 周围可
  • 从 Handler.obtainMessage() 获取什么参数

    我正在使用线程来执行一些 BT 任务 我正在尝试向 UI 线程发送消息 以便我可以基于我的 BT 线程执行 UI 工作 为此 我使用处理程序 但我不知道如何检索发送到处理程序的数据 要发送数据 我使用 handler obtainMessa
  • 使用 FileInputStream 时如何确定理想的缓冲区大小?

    我有一个从文件创建 MessageDigest 哈希 的方法 我需要对很多文件 gt 100 000 执行此操作 用于读取文件的缓冲区应该设置多大才能最大限度地提高性能 大多数人都熟悉基本代码 为了以防万一 我将在这里重复一遍 Messag
  • socket.io 中的消息排序

    socket io 是否保证 on 回调将按照消息发出的顺序调用 Node js 是单个事件循环 所以是的 但是你还有另一个问题 考虑你和你的客户端之间的延迟 如果两个客户端发送消息 到达服务器的第一条消息将首先被处理 所以如果第一个客户端
  • 金属着色语言 - 更改缓冲区大小

    是否可以在运行时更改缓冲区大小 我们在注册期间分配缓冲区大小device device MTLCreateSystemDefaultDevice queue device makeCommandQueue do let library de
  • 如何指定消息是否应显示在 p:growl 或 p:messages 中?

    在我的 Facelets 页面中 我有这个
  • 如何使用 apache2 和 mod_proxy_fcgi 禁用缓冲?

    我在 debian Jessie 上使用 mod proxy fcgi 和 apache 2 4 以及我的 C 应用程序 该应用程序使用 libfcgipp 执行 ServerSentEvents 我的问题是 apache 仍然缓冲我的响应
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 在 XMPPFrameWork ios 中将 XMPPMessage 保存在 CoreData 中

    我正在开发一个聊天应用程序并使用 xmppframework 现在需要将消息存储在持久存储中 谁能告诉我如何在 IOS 中从 CoreData 存储和检索消息 由于您使用的是 github robbiehanson XMPPFramewor
  • 如何在nodejs缓冲区中存储整数?

    节点jsBuffer http nodejs org docs v0 4 12 api buffers html是相当膨胀 然而 它似乎适合存储字符串 构造函数采用字符串 字节数组或要分配的字节大小 我使用的是 Node js 0 4 12

随机推荐

  • 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