Queue队列是最基本的数据结构,在FreeRTOS v10.0后提供了另外两种高级数据结构为Streambuffer和MessageBuffer,称为流式缓冲区和消息缓冲区。
FreeRTOS - 嵌入式系统开源 - FreeRTOS xQueueCreate() API 函数描述
FreeRTOS xStreamBufferCreate() API 文档
FreeRTOS xMessageBufferCreate() API 文档
1. Queue队列
队列长度固定,所以占用空间相对较大。
比如:100条信息 一条信息512字节 那么就会占用512*100=51KB数据
2. StreamBuffer流缓冲区
队列长度不固定,类似于环形队列, 以字节为单位存储。
针对数据有长有短,这种类型就比较适合
函数:
#include "stream_buffer.h"
xStreamBufferCreate()
xStreamBufferCreateStatic()
xStreamBufferSend()
xStreamBufferSendFromISR()
xStreamBufferReceive()
vStreamBufferDelete()
xStreamBufferIsFull()
xStreamBufferIsEmpty()
xStreamBufferReset()
xStreamBufferSpacesAvailable()
xStreamBufferBytesAvailable()
xStreamBufferSetTriggerLevel()
xStreamBufferSendCompletedFromISR()
xStreamBufferReceiveCompletedFromISR()
xStreamBufferGenericCreate()
xStreamBufferGenericCreateStatic()
xStreamBufferNextMessageLengthBytes()
例如:第一条 10B 第二条 100B 第三条 30B 那么三条就是10+100+30 = 140B
如果采用第一种方式 就是512B*3
3. MessageBuffer 消息缓冲区
消息缓冲区是在 2 StreamBuffer流式缓冲区的基础上实现的,其进一步针对“消息”进行设计改进。MessageBuffer每一条消息的写入增加了一个字节用来表示该条消息的长度。读取时需要一次性读出至少一条消息,否则会返回 0.
一条消息包含多字节。
所以第三种方式 也比较省空间,在没有时,还有环队代替它。
函数:
#include "message_buffer.h"
xMessageBufferCreate()
xMessageBufferCreateStatic()
xMessageBufferSend()
xMessageBufferSendFromISR()
xMessageBufferReceive()
xMessageBufferReceiveFromISR()
vMessageBufferDelete()
xMessageBufferIsFull()
xMessageBufferIsEmpty()
xMessageBufferReset()
xMessageBufferSpaceAvailable()
xMessageBufferSpacesAvailable()
xMessageBufferNextLengthBytes()
xMessageBufferSendCompletedFromISR()
xMessageBufferReceiveCompletedFromISR()