0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTOS的流缓冲区机制解析

麦克泰技术 来源:麦克泰技术 2025-02-14 11:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

SAFERTOS中的流缓冲区(Stream buffer)机制,可以实现任务到任务或中断到任务之间的通信。字节流是由发送方写入缓冲区,接收方读取缓冲区数据。流缓冲区作为队列的轻量级级替代方案,适合单读单写场景,写者在流缓冲区中放置任意数量的字节,读者读取任意数量的字节。

流缓冲区

顾名思义,存储数据的结构是一个先进先出的缓冲区。通过调用xStreamBufferSend或xStreamBufferSendFromISR API写缓冲区,将数据添加到缓冲区末尾,可以使用任务通知发信号通知等待任务。

流缓冲区有一个触发级别,其值为流缓冲区必须写入的最小字节数,因此,触发级别值可以在1和流缓冲区的长度之间。缓冲区长度是有限的,这意味着如果从缓冲区读操作发生得不够快,缓冲区可能会满。

因此,对缓冲区的写入可以是阻塞的(非ISR函数可以阻塞),阻塞时间可以自定义。可以使用任务通知将缓冲区空闲空间通知写任务。否则,所有数据需在阻塞时间内发送。

大多数情况下,由于对发送数据的处理太慢(读任务的优先级太低,或者数据生成速度比预期的要快),缓冲区被尽可能多的字节填充,API将返回一个错误代码以及写入的数据量。

从流缓冲区中读取数据通过调用xStreamBufferReceive或xStreamBufferReceiveFromISR完成。如果操作成功,函数返回一个状态码及读取的数据。读取数据的数量取决于流缓冲区中的可用字节数和指定数组的大小,可以指定阻塞时间(只有非ISR函数可以阻塞),如果规定的时间内没有数据可用,或没有任务通知解除阻塞,则会超时。尽管发生了超时,但流缓冲区中可能有数据,但不足以达到触发级别(如果触发级别大于1)。读操作成功将返回可用数据。如果从满流缓冲区中读取数据,则发送任务通知给等待写数据但由于缓冲区满而阻塞的任务。

9bcd2330-ea80-11ef-9310-92fbcf53809c.png

图1 Stream buffer示例

图1的流缓冲器示例应用是一个模数转换器,当数据可用时就会产生中断。转换后的数据在中断服务程序中发送到缓冲区。然后,通知使用数据的任务从流缓冲区中读取并处理数据,如过滤数据或计算控制器步长。

消息缓冲(message buffer)

消息缓冲区建立在流缓冲区上,用于交换离散的消息。消息具有定义的长度,其长度被附加到有效负载中。这意味着当发送10字节的消息时,消息的长度(数字10)首先添加到缓冲区中,因此接收方可以在读取消息之前读取该值,了解有多少字节的有效载荷。存储消息长度的字节数是可配置的,必须预先定义,以便接收方确切地知道从缓冲区读取多少字节以获得下一条消息的长度。如何配置存储消息长度的字节数取决于最大的消息长度,单个字节长度可用于最多255字节的消息,2字节长度字段可用于最多65535字节的消息。

缓冲区的大小应考虑最大消息长度和长度字段,例如,报文长度为10字节,长度字段2字节,每个消息的缓冲区中占用12字节。

在SAFERTOS中,流缓冲区和消息缓冲区使用相同的API函数。为了区分两者,在StreamBuffer结构体中使用了一个额外的标志,在创建流/消息缓冲区时指定。API函数的行为略有不同。

使用流缓冲区时,如果指定了阻塞时间(只有非ISR函数可以阻塞),读取和写入操作可以阻塞。消息缓冲区的行为与流缓冲区相似。如果消息缓冲区中没有消息,则消息缓冲区的读取操作将被阻塞,任务将阻塞,直到阻塞时间到或足够的数据被发送到消息缓冲区。因为消息不会部分发送,对于消息缓冲区,在大多数情况下触发级别为1字节是最有用的,单个字节消息将解除等待任务阻塞。

如果缓冲区不够用,写操作就会阻塞,直到足够的字节/消息从缓冲区中读取,或阻塞时间超时。

9c356ff8-ea80-11ef-9310-92fbcf53809c.png

图2 stream buffer序列

多核应用

流缓冲区和消息缓冲区也可以将在一个核上数据发送到另一个核上执行的任务/中断中。在非对称多处理器配置中,每个处理器运行自己的RTOS实例。为了在核间共享数据,必须使用共享内存保存流缓冲区数据。

为了通知读核有新的数据产生,可以使用从一个核到另一个核的中断。

SAFERTOS API有多个函数处理多核流缓冲区的使用,但核心功能很大程度上依赖于处理器体系结构。因此这些函数为弱定义的桩,必须由应用程序实现特定于核的功能。

要通知读核一个缓冲区写入完成,可以使用API函数vStreamBufferSendCompletedMulticore和vStreamBufferSendCompletedFromISRMulticore。如果另一个核上的任务试图从空的流/消息缓冲区中读取数据并等待数据发送,则调用这些函数。使用这些函数来代替单核场景中的任务通知,并且可以触发等待核的中断,从而解除等待读取任务的阻塞。

使用vStreamBufferReceiveCompletedMulticore和StreamBufferReceiveCompletedFromISRMulticore函数通知写核可用的缓冲区空间。如果另一个核上的任务试图写满的缓冲区并等待发送数据,则调用这些函数。使用这些函数来代替单核场景中的任务通知,并且可以触发等待核的中断,从而解除等待写入任务的阻塞。

多核应用的一个重要方面是对流/消息缓冲区数据访问的协调。在单核设备上,一次只能有一个任务或中断处于活动状态,如果一个任务需要访问数据结构而不被中断,它可以在临界区内操作。当多个核同时处于活动状态时,必须防止对共享数据结构的并行访问。因此,必须使用锁定机制来确保核对缓冲区数据结构的独占访问。SAFERTOS提供xStreamBufferAttemptToLock和vStreamBufferReleaseLock函数实现此功能。这些函数也是弱定义的桩,应用程序必须基于特定于处理器的实现来协调访问。

9c95620a-ea80-11ef-9310-92fbcf53809c.png

图3 多核示例系统

基于流缓冲区机制可以实现任务间实时数据处理,有效地管理任务之间的数据流,确保RTOS应用程序中的高效通信和同步。

麦克泰技术是安全预认证操作系统SAFERTOS在中国的代理商,具有超过20年嵌入式实时操作系统和功能安全软件服务的市场、服务和培训经验,联系info@bmrtech.com。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    114

    文章

    17646

    浏览量

    190261
  • 嵌入式
    +关注

    关注

    5186

    文章

    20151

    浏览量

    328876
  • 模数转换器
    +关注

    关注

    26

    文章

    3951

    浏览量

    129728
  • RTOS
    +关注

    关注

    25

    文章

    862

    浏览量

    122611
  • Stream
    +关注

    关注

    0

    文章

    21

    浏览量

    8218

原文标题:RTOS的Stream buffer通信机制

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    解析RZ/N2L CANFD模块的缓冲区机制(1)

    在工业自动化、智能交通、机器人等领域,CANFD(CAN with Flexible Data-Rate)技术正逐步取代传统CAN,以适应更高的数据速率和更复杂的通信需求。本文将深入解析RZ/N2L CANFD模块的缓冲区机制
    的头像 发表于 05-19 14:10 958次阅读
    <b class='flag-5'>解析</b>RZ/N2L CANFD模块的<b class='flag-5'>缓冲区</b><b class='flag-5'>机制</b>(1)

    解析RZ/N2L CANFD模块的缓冲区机制(2)

    在工业自动化、智能交通、机器人等领域,CANFD(CAN with Flexible Data-Rate)技术正逐步取代传统CAN,以适应更高的数据速率和更复杂的通信需求。本文将深入解析RZ/N2L CANFD模块的缓冲区机制
    的头像 发表于 05-19 14:13 1147次阅读
    <b class='flag-5'>解析</b>RZ/N2L CANFD模块的<b class='flag-5'>缓冲区</b><b class='flag-5'>机制</b>(2)

    FreeRTOS进阶使用之流缓冲区:高效处理字节流的秘密武器

    解析其原理、特点、使用方法及注意事项,助你进阶掌握这一关键技术。 一、缓冲区是什么?为什么需要它? 缓冲区是FreeRTOS中基于环形
    发表于 03-24 11:37

    基于状态图的缓冲区溢出攻击分析

    结合缓冲区溢出攻击产生的原理,分析缓冲区溢出攻击代码的结构,论述Snort规则对缓冲区溢出攻击的检测,在此基础上构建一个基于状态图的缓冲区溢出攻击的分析模型。该模型对
    发表于 04-10 08:46 32次下载

    清除键盘缓冲区原理

    清除键盘缓冲区原理 有时用户的按键响应可能导致数据丢失或破坏了数据而不能挽回。在这种情况下,消除缓
    发表于 06-12 23:07 2284次阅读

    环形缓冲区的实现原理

    在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。
    的头像 发表于 03-22 10:03 8310次阅读
    环形<b class='flag-5'>缓冲区</b>的实现原理

    缓冲区是啥意思 STM32串口数据接收之环形缓冲区

    缓冲区顾名思义是缓冲数据用的。实现缓冲区最简单的办法时,定义多个数组,接收一包数据到数组A,就把接收数据的地址换成数组B,每个数据有个标记字节用于表示这个数组是否收到数据,收到数据是否处理
    的头像 发表于 07-22 15:33 1.2w次阅读

    STM32串口数据接收 --环形缓冲区

    STM32串口数据接收 --环形缓冲区环形缓冲区简介  在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。  在通信
    发表于 12-28 19:24 31次下载
    STM32串口数据接收 --环形<b class='flag-5'>缓冲区</b>

    什么是缓冲区?有什么作用

    缓冲区其实就是一个存储区域,它是由专门的硬件寄存器所组成的。
    的头像 发表于 02-02 09:57 2.7w次阅读

    消除IoT上的缓冲区溢出漏洞

    黑客可以使用堆栈缓冲区溢出将可执行文件替换为恶意代码,从而允许他们利用堆内存或调用堆栈本身等系统资源。例如,控制劫持利用堆栈缓冲区溢出将代码执行重定向到正常操作中使用的位置以外的位置。
    的头像 发表于 10-12 15:25 1481次阅读
    消除IoT上的<b class='flag-5'>缓冲区</b>溢出漏洞

    消除物联网上的缓冲区溢出漏洞

      黑客可以使用堆栈缓冲区溢出将可执行文件替换为恶意代码,从而使他们能够利用堆内存或调用堆栈本身等系统资源。例如,控制劫持利用堆栈缓冲区溢出将代码执行重定向到正常操作中使用的位置以外的位置。
    的头像 发表于 12-02 11:57 1551次阅读

    环形缓冲区的实现思路

    单片机程序开发一般都会用到UART串口通信,通过通信来实现上位机和单片机程序的数据交互。通信中为了实现正常的收发,一般都会有对应的发送和接收缓存来暂存通信数据。这里使用环形缓冲区的方式来设计数据收发的缓存,即缓冲区溢出后,从缓冲区
    的头像 发表于 01-17 15:07 2626次阅读

    C++环形缓冲区设计与实现

    一、环形缓冲区基础理论解析(Basic Theory of Circular Buffer) 1.1 环形缓冲区的定义与作用(Definition and Function of Circular
    的头像 发表于 11-09 11:21 3781次阅读
    C++环形<b class='flag-5'>缓冲区</b>设计与实现

    西门子博诊断缓冲区的使用方法

    可从在线和诊断视图中“诊断”文件夹的“诊断缓冲区”组中读出 CPU 的诊断缓冲区
    的头像 发表于 12-11 10:24 8248次阅读
    西门子博诊断<b class='flag-5'>缓冲区</b>的使用方法

    交换芯片缓冲区大小是什么

    交换芯片缓冲区大小并不一定是固定的。缓冲区的设计和实现会根据芯片的具体型号、规格以及应用场景的不同而有所差异。一些交换芯片可能具有固定大小的缓冲区,以满足特定的性能需求或成本限制。然而,随着技术
    的头像 发表于 03-18 14:42 1187次阅读