赞
踩
在嵌入式系统开发中,任务间的通信是非常重要的一部分。FreeRTOS提供了多种数据结构来实现任务间的通信,包括StreamBuffer
,MessageBuffer
和Queue
。这三种数据结构各又什么特点又有什么区别呢?
StreamBuffer
是FreeRTOS中用于任务间或任务与中断间连续数据传输的数据结构。它允许你发送和接收任意长度的数据。StreamBuffer
的主要特点是:
StreamBuffer
传输连续的数据,可以一次写入任意数量的字节,并且可以一次读取任意数量的字节。StreamBuffer
主要应用于一个发送者一个接收者的场景,比如从中断发送给task,或者从一个cpu核发送到另一个cpu核。MessageBuffer
是FreeRTOS中用于任务间或任务与中断间离散数据传输的数据结构。它允许你发送和接收带有长度的消息。MessageBuffer
的主要特点是:
MessageBuffer
传送离散的带有长度的消息,每一条消息的写入增加了一个字节用来表示该条消息的长度。MessageBuffer
非固定长度,带有长度标签,适合传输协议帧数据。Queue
是FreeRTOS中用于任务间或任务与中断间数据传输的数据结构。它允许你发送和接收固定大小的数据项。Queue
的主要特点是:
Queue
传送固定大小的数据项,每一条数据项的大小在创建队列时确定。Queue
适用于多任务间的数据传输,可以有多个发送者和接收者。它们都可以用于任务-任务,任务-中断的数据传输,都遵循FIFO先进先出原则,数据传递的方式为拷贝。但是,它们之间存在一些关键的区别:
数据单位:Stream Buffer
传输连续的数据,可以一次写入任意数量的字节,并且可以一次读取任意数量的字节。而Message Buffer
传送离散的带有长度的消息,每一条消息的写入增加了四个字节用来表示该条消息的长度。
接收方式:Message Buffer
一次只能接收1条Message,而Stream Buffer
则根据长度接收。Message Buffer
在接收缓冲区<1条消息大小时,不会接收,而Stream Buffer
则会将数据截断接收。
使用场景:Stream Buffer
主要应用于一个发送者一个接收者的场景,比如从中断发送给task,或者从一个cpu核发送到另一个cpu核。而Message Buffer
非固定长度,带有长度标签,适合传输协议帧数据。
需要注意的是,与大多数其他FreeRTOS API不同的是,Stream Buffer
和Message Buffer
针对单个读取器单写入器场景进行了优化,例如将数据从中断服务例程传递到任务,或者从双核CPU上的一个微控制器核心传递到另一个。在多任务读写的环境中,需要将该函数相关的调用置于关键区域内(taskENTER_CRITICAL和taskEXIT_CRITICAL),也可以使用互斥信号量来解决。
以下是StreamBuffer
和MessageBuffer
接收数据的示例:
假设我们有一个StreamBuffer
,其中包含字符串"Hello, World!"(包括结束符’\0’,总共13个字节)。我们的接收缓冲区只有10个字节的大小。
char pcReceivedString[10];
size_t xReceivedBytes;
xReceivedBytes = xStreamBufferReceive(xStreamBuffer, (void *)pcReceivedString, 10, portMAX_DELAY);
在这种情况下,xStreamBufferReceive()
将会接收前10个字节的数据(“Hello, Wor”),并返回接收到的字节数(10)。剩下的数据(“ld!\0”)仍然留在StreamBuffer
中。
假设我们有一个MessageBuffer
,其中包含消息"Hello, World!"(包括结束符’\0’,总共13个字节,加上4个字节的长度字段,总共17个字节)。我们的接收缓冲区只有10个字节的大小。
char pcReceivedMessage[10];
size_t xReceivedBytes;
xReceivedBytes = xMessageBufferReceive(xMessageBuffer, (void *)pcReceivedMessage, 10, portMAX_DELAY);
在这种情况下,xMessageBufferReceive()
将会检查下一条消息的大小。由于下一条消息的大小(13个字节)大于接收缓冲区的大小(10个字节),xMessageBufferReceive()
将不会接收任何数据,而是立即返回0。消息"Hello, World!"仍然完整地留在MessageBuffer
中。
这就是StreamBuffer
和MessageBuffer
在接收数据时的主要区别。StreamBuffer
会根据长度接收数据,即使这意味着数据会被截断。而MessageBuffer
则会检查整条消息是否可以完整地接收,如果不能,它就不会接收任何数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。