使用 stream buffer 传递数据

news2025/4/17 4:23:25

使用 stream buffer 传递数据

概述

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

特性概述

Streambuffer 的中文含意是“流式缓冲区”,其特点可以概述如下:

1)发送消息的一方(发送方)与获取消息的一方(接收方)之间可以按任意长度的字节流的方式进行数据传递。

2)可以设置触发唤醒通知的字节数,仅在缓冲区中的数据达到一定长度时,才唤醒接收方接收数据。

在这里插入图片描述

3)适用于仅有一个发送方、一个接收方的场景。如果有多个发送方、接收方,则需要在发送、接收处添加互斥保护,特别地,多个接收方时应将接收阻塞时间设置为0。

Streambuffer 的基本结构如图所示,主要由消息缓冲区、管理消息缓冲区的相关字段、解阻塞字节数标记、以及两个阻塞延时列表组成。一定程度上,Streambuffer 可以看作在触发接收的机制上改良的队列。
在这里插入图片描述

相关 API

// 创建新的流缓冲区
StreamBufferHandle_t xStreamBufferCreate(xBufferSizeBytes, // 流缓冲区的总字节数。
					xTriggerLevelBytes) // 触发唤醒的字节数,流缓冲区中必须存在不少该字节数的数据才能唤醒等待数据的任务(设置为0时,将按照如1的方式处理,设置的数比buffer_size还大时,创建无效)
					
// 向流缓冲区去发送数据
size_t xStreamBufferSend(StreamBufferHandle_t xStreamBuffer, // 要从中发送字节的流缓冲区的句柄。
						const void *pvTxData, // 指向要复制到流缓冲区中的字节的缓冲区的指针。
						size_t xDataLengthBytes, // 从 pvTxData 复制到流缓冲区的最大字节数。
						TickType_t xTicksToWait) // 若无法完成发送 xDataLengthBytes 个字节数据的目的,则等待该延时时间
    
// 从流缓冲区中接收数据
size_t xStreamBufferReceive(StreamBufferHandle_t xStreamBuffer, // 要从中接收字节的流缓冲区的句柄。
							void *pvRxData,                     // 指向将接收的字节复制到的缓冲区的指针。
							size_t xBufferLengthBytes, // 设置一个要接收的最大字节数。
							TickType_t xTicksToWait) // 如果流缓冲区为空,则任务应保持“blocked”状态以等待数据变为可用的最长时间,时间以tick周期为基本单位。
    
// 重置流缓冲区
// 将流缓冲区重置为其初始空状态。流缓冲区中的任何数据都将被丢弃。仅当没有任务被阻止等待发送到流缓冲区或从流缓冲区接收时,才能重置流缓冲区。
 BaseType_t xStreamBufferReset(StreamBufferHandle_txStreamBuffer) // 

注意,Receive 返回的情况有两种可能:

1)获取到不小于唤醒长度的数据。

2)超时返回,此时实际获取的数据长度为 [0,TriggerLevel]。

API 参考:stream buffer API, 读者可以通过点击网页自行查看每个 API 的使用方法和参数。

需求及功能解析

示例创建了一个 TriggerLevel 为 5 的streambuf,来实现 task1 中每产生五个数据就自动唤醒 task2 处理数据的逻辑。

示例解析

示例输出:

This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, Minimum free heap size: 295348 bytes
TASK1: flag=0
TASK2: timeout and read some data
TASK2: The buffer data is as follows:00 
TASK1: flag=1
TASK1: flag=2
TASK1: flag=3
TASK1: flag=4
TASK1: flag=5
TASK2: read triggle level bytes
TASK2: The buffer data is as follows:01 02 03 04 05 
TASK1: flag=6
TASK1: flag=7
TASK1: flag=8
TASK1: flag=9
TASK1: flag=10
TASK2: read triggle level bytes
TASK2: The buffer data is as follows:06 07 08 09 0a

这种自动的触发机制,比上节使用队列的情况要简单了一些。

讨论

Streambuffer 虽然实现了可以发送不定长度的数据串,并规定了一定的触发唤醒机制:即数据量至少达到 TriggerLevel 才唤醒等待数据的任务。

但是一些情况下,发送的数据是不定长度的数据块,每个数据块都具有指定的格式,具备不同的长度,并且不能被拆分和组合。

比如发送数据的任务发送人的身份证号、手机号码。接收数据的任务要准确地识别这些数据,必须知道数据的长度,否则无法区分那部分数据属于身份证数据、手机号码数据。

流式缓冲区无法描述这些不定长数据块的具体长度。我们将在下一节介绍处理不定长离散数据块的通信组件。

总结

1)Streambuffer 可看作针对单一生产者、消费者传输不定长数据通信场景而优化的 queue。

2)Streambuffer 还优化了唤醒机制,可以设置触发唤醒通知的字节数,仅在缓冲区中的数据达到一定长度时,才唤醒接收方接收数据。

3)Streambuffer 可以传输没有固定结构的不定长数据,但是它无法描述这些不定长数据块的具体长度。

资源链接

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

3)下一篇:

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

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

相关文章

Chapter5.5:频率响应法

此系列属于胡寿松《自动控制原理题海与考研指导》(第三版)习题精选,仅包含部分经典习题,需要完整版习题答案请自行查找,本系列属于知识点巩固部分,搭配如下几个系列进行学习,可用于期末考试和考研复习。 自动控制原理(…

Hive与Hbase的区别与联系

一、概念 1,Hive hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询…

网站中的经典,分享那些我用过的宝藏网站

前言 本篇将会具体分享我在最开始学习编程时了解到的网站,并分享自己使用这些网站的感受,当然,如果我有说的不正确的或者需要补充的,欢迎评论区补充纠正。还有各位来自优秀学校的伙伴们,或许其中一些资源在你们的学校…

安卓开发Android studio学习笔记15:关于如何使用Okhttp框架的网络请求(调用API接口)

Android studio一、安卓基于HTTP网络编程(一)、两种请求方式(二)、安卓基于HTTP网络编程的两种方式1、使用HttpURLConnection访问网络资源**2、利用HttpClient访问网络资源**(1)HttpGet(2)HttpPost二、基础Okhttp的网络…

修改 echarts 默认样式记录

1、修改折线图上的数据标记点 showSymbol:false , 表示不展示数据点,只有鼠标 hover 时, tooltip 展示。 series: [{name: 进场, // 名称,图例和 tooltip 中展示showSymbol: false, // 不展示数据标记点type: line, // 类型color: #0091FF…

大学解惑10 - CSS中的content怎么换行,以及使用before伪类的优点

大学解惑09 - 单独用HTML javascript CSS 实现三版99乘法表,你就是班里最靓的仔https://blog.csdn.net/xingyu_qie/article/details/127631612 ☆ 上一篇文章用前端HTML CSS JS基础写了3版99乘法表,有同学说终于把99乘法表写透了,但是紧接着就…

Linux关于JDK、Tomcat以及MySQL安装

目录 一、JDK安装 1、 上传jdk、tomcat安装包 2、解压两个工具包 3、配置环境 4、在配置文件中加入java环境变量: 5、保存,让新设置的环境变量生效 二、Tomcat安装 1、将tomcat解压到/opt下 2、配置环境变量 3、启动tomcat 4、创建启动脚本 三…

入门学习XSS漏洞,这一篇就够了

入门学习XSS漏洞,这一篇就够了1.XSS简介2.XSS的类型反射型XSS存储型XSSDOM型XSS1.XSS简介 XSS攻击,通常指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。在一开始…

【沐风老师】怎么在3DMAX中使用MAXScript脚本动画编程?

大家可能对3dmax都抱有很浓厚的兴趣,但如果你接触到max脚本(MAXScript),你会觉得它比max本身更让人着迷,因为它更能拓展我们的想象力,或者帮助我们更好的提高工作效率。不过,MAXScript是解释语言,不适合编写过于复杂的功能,因为这将大大影响执行的速度。 言归正传,就…

jmeter模拟多IP访问

1. 前言: 今天一同事在压测时提到怎么用jmeter里虚拟多个ip来发送请求,我想了一下以前用LR时用过虚拟ip地址,jmeter还没有使用过。想着原理应该是相通的,既然LR都能支持的话,那Jmeter应该也是支持,于是就有…

ARM pwn 入门 (1)

最近笔者刚刚加入了一个项目组,需要用到ARM架构的东西,和ARM pwn也有一定关系,因此一不做二不休,决定开始学习ARM pwn,顺便熟悉项目前置知识,一举两得。 ARM与x86分属不同架构,指令集不同&…

用frp搞个内网穿透

使用场景: 在公司用电脑敲代码,环境都是localhost,有时候你要接第三方接口比如支付、或者企业微信的事件回调等,都需要一个公网地址,因为这时候是开发阶段,你即想要公司电脑上运行的环境又想要回调能找到你…

2022年首家民营征信机构浙江同信获企业征信备案公示

2022年首家民营征信机构浙江同信获企业征信备案公示 2022年11月1日,中国人民银行杭州中心支行公示了浙江同信企业征信服务有限公司企业征信机构备案,该机构为浙江省进行备案公示的第九家机构。其他八家分别为芝麻信用管理有限公司、浙江有数数智科技有限…

Transform介绍(1)

文章目录1. transform 方法2. transform 增量模式3. 注册 Transform使用Transform的常见场景有埋点统计、耗时监控、方法替换 通过上图以我们了解下transform的作用,transform在 class 到 dex 之间工作,处理包括 javac 编译后的字节码文件,每…

【Linux内核系列】进程调度

目录 一、为什么要调度 二、调度均衡 三、进程调度框架 3.1 调度队列 3.2 进程唤醒 3.3 调度时机 主动调度: 被动调度: 四、调度算法 4.1 先来先服务调度算法 4.2 最短作业优先调度算法 4.3 高响应比优先调度算法 4.4 时间片轮转调度算法 …

洛谷千题详解 | P1007 独木桥【C++、Pascal语言】

博主主页:Yu仙笙 专栏地址:洛谷千题详解 目录 题目背景 题目描述 输入格式 输出格式 输入输出样例 解析: C源码: Pascal源码: ------------------------------------------------------------------------------------…

NFT 推荐|辛迪加黑市系列第一弹

由 Planet Rift 呈现! 塞巴星球的辛迪加已经洗劫了政府,现在是时候揭开补给品的神秘面纱了! 辛迪加黑市系列的第一弹包括 30 个由 Planet Rift 宇宙设计的资产。其中首次发售的包含 4 套未来风格的盔甲、3 台彩色自动售货机和其他装备。 别忘…

项目管理之项目干系人

目录 前言 一、项目干系人的重要性 二、项目干系人管理过程 三、识别干系人 1.识别干系人的概念定义 2.识别干系人的输入 3.干系人分类模型 4.识别干系人的工具与技术 5.识别干系人的输出 四、规划干系人管理 1.规划干系人的输入 2.规划干系人的工具与技术 3.规划…

电脑蓝屏是哪里出了问题?不一定要非要重装系统

电脑蓝屏是非常常见的电脑故障现象,导致电脑蓝屏的原因很多,很多人第一时间反应可能是给电脑重装系统,但是有时并不能解决问题。那么电脑蓝屏是哪里出了问题呢?其实导致蓝屏不一定是系统故障,还有很多情况也会出现蓝屏…

Python3,爬虫有多简单,一个库,一行代码,就OK, 你确定不来试试?

爬虫进阶库:Scrapeasy1、 引言2、Scrapeasy2.1 简介2.1.1 Scrap2.1.2 Scrapeasy2.2 安装2.3 代码示例3、总结1、 引言 小屌丝:鱼哥, 我最近在练习写爬虫, 你有没有什么便捷的方式… 小鱼:比如呢? 小屌丝&a…