夜雨聆风学习资料网

ARTICLE · 1087870

FreeRTOS 流缓冲与消息缓冲源码剖析

FreeRTOS 流缓冲与消息缓冲源码剖析

FreeRTOS 的流缓冲和消息缓冲,主体路径上居然一条等待链表都没有,连关中断都不用。

这俩东西专门对付变长数据。队列定长,传日志要么浪费要么截断;流缓冲就是一块环形字节数组,写者只碰头索引,读者只碰尾索引,谁也不改对方的字段。没有共享写,自然不需要临界区保护。

代价是硬约束:只能单读单写。两个任务同时写,头指针各推各的,数据当场交错损坏。

消息缓冲则在它上面加了层装帧协议。写入时先塞 4 字节长度前缀,再塞数据;读取时先读长度再整条拿走。这样 7 字节和 48 字节的日志就能原样进出,读者永远看不到半条消息。

触发水位还能省掉多余唤醒。同样收 20 字节,水位设成 20,消费者被叫醒 1 次;设成 1,就被叫醒 5 次。没触发的那几次,直接省掉了任务通知。

xStreamBufferCreate(200, 1) 请求 200 字节,那内核pvPortMalloc实际申请了多大?为什么故意多申请 1 个字节?

原文FreeRTOS 流缓冲与消息缓冲源码剖析:主体不用等待链表,也不用关中断的队列
收录于FreeRTOS学习
作者提示: 个人观点,仅供参考
广东,1小时前,

相关学习资料