FreeRTOS源码分析-Stream Buffer .c

张开发
2026/4/15 16:46:48 15 分钟阅读

分享文章

FreeRTOS源码分析-Stream Buffer .c
一、Stream Buffer 整体总览1 是什么?流缓冲区(Stream Buffer)*是 FreeRTOS 提供的*原始字节流传输机制。基于 ** 环形缓冲区(FIFO)** 实现以字节流为单位传输数据支持任务 ↔ 任务、中断 ↔ 任务安全通信比队列更轻量、更快、专门为数据流设计2 有啥用?在任务 / 中断之间传输连续字节流(串口、网口、音频、传感器数据)数据缓冲、流量平滑支持读取指定长度字节支持写入指定长度字节中断安全3 啥时候用?串口、USB、网口等数据收发缓冲需要字节流传输而非消息队列对性能要求高、需要低开销场景中断与任务之间传递数据流4 怎么用?(最简流程)// 1. 创建 StreamBufferHandle_t h = xStreamBufferCreate(512, 64); ​ // 2. 发送(任务) xStreamBufferSend(h, data, len, portMAX_DELAY); ​ // 3. 接收(任务) xStreamBufferReceive(h, buf, len, portMAX_DELAY); ​ // 4. 中断发送 xStreamBufferSendFromISR(h, data, len, woken);5 限制只能传输字节流,不支持结构化消息不支持多接收者(只能一个任务读取)不支持广播无优先级继承触发阈值不能大于缓冲区大小7 实现逻辑(核心)内部使用 ** 环形缓冲区(Ring Buffer)** 存储字节维护两个指针:头指针(写入)、尾指针(读取)维护两个等待链表:xTasksWaitingForData:等待数据的任务xTasksWaitingForSpace:等待空间的任务写入数据:拷贝数据到缓冲区数据量 ≥ 触发阈值 → 唤醒等待数据的任务读取数据:从缓冲区拷贝数据释放空间 → 唤醒等待空间的任务8 补充流缓冲区是FreeRTOS 最低开销通信机制专为大量字节流设计(比队列快很多)支持接收触发阈值(Receive Trigger Level)支持静态 / 动态内存中断安全 API 完善四、流缓冲区工作原理总流程写入数据 → 存入环形缓冲区 ↓ 数据量 ≥ 触发阈值 ↓ 唤醒等待数据的任务 ↓ 任务读取数据 ↓ 释放空间 ↓ 唤醒等待空间的任务二、最重要补充知识1. 与队列区别Queue:传输固定大小消息Stream Buffer:传输连续字节流,更快、更轻2. 触发阈值(Trigger Level)只有缓冲区数据 ≥ 该值,才会唤醒接收任务用于减少唤醒次数、提高效率3. 单读取者限制只能有一个任务读取流缓冲区多任务读取会导致数据错乱4. 环形缓冲区无锁设计中断安全效率极高5. 适用场景串口 / USB / 网口数据缓冲音频、传感器数据流高吞吐量、低延迟需求总结Stream Buffer = FreeRTOS 最高效、最轻量化的字节流传输机制核心能力:字节流 FIFO中断安全接收触发阈值超轻量、高性能任务 / 中断无缝通信一、创建 / 删除函数名功能说明xStreamBufferGenericCreate动态创建流缓冲 / 消息缓冲 / 批处理缓冲(通用底层函数)xStreamBufferGenericCreateStatic静态创建流缓冲 / 消息缓冲 / 批处理缓冲xStreamBufferGetStaticBuffers获取静态分配的缓冲区地址vStreamBufferDelete删除流缓冲,释放内存(动态)或清空结构体(静态)二、重置 / 阈值函数名功能说明xStreamBufferReset任务级清空缓冲区(无等待任务时才成功)xStreamBuf

更多文章