在 freertos API 中使用队列
Posted
技术标签:
【中文标题】在 freertos API 中使用队列【英文标题】:Using Queues in freertos API 【发布时间】:2018-11-27 14:17:00 【问题描述】:在 freertos 文档中,他们说有两种方法可以实现队列行为:
队列复制:复制队列是指发送到队列的数据被逐字节复制到队列中。
引用队列:引用队列意味着队列只保存指向发送到队列的数据的指针,而不是数据本身。
当我将结构“CommandData”从 task1 发送到 task2 然后在接收中更改结构中的 DataArray 字段时,我的问题在下面的代码中 任务。这是否会影响发送任务中的同一字段。
换句话说,在这种情况下是通过复制排队还是通过引用排队?
typedef struct
uint8_t * ArrayLength;
uint8_t * DataArray;
FunctionStruct;
bool Read(uint8_t * Length, uint8_t * AttributeData)
FunctionStruct CommandData;
....
__t_CommandData.ArrayLength = Length;
__t_CommandData.DataArray = AttributeData;
....
xQueueSendToBack(x_Queue, &CommandData, 0U)
.....
谢谢你
【问题讨论】:
这也是你的Q吗? ***.com/q/50912392/758133 @Umaiki 您的评论不适用于该问题 - 这是另一回事。 【参考方案1】:freeRTOS的描述很清楚: 函数原型:
BaseType_t xQueueSendToBack(QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait);
pvItemToQueue: 指向要放置在队列中的项目的指针。队列将容纳的项目的大小是在创建队列时定义的,所以这么多字节将从 pvItemToQueue 复制到队列存储区。
注意:小心将0U
作为xTicksToWait
参数。
xTicksToWait:如果队列已满,任务应该阻塞等待队列中可用空间的最长时间。 如果设置为 0,调用将立即返回。时间以滴答周期定义,因此如果需要,应使用常量 portTICK_PERIOD_MS 转换为实时时间。
【讨论】:
【参考方案2】:您对使用包含指针的结构感到困惑。是的,结构是通过副本传递的,但是副本保存的是指针,而不是实际的数据。
由于length是一个指针,所以如果接收者修改length,发送者的上下文不会改变,但是如果修改了*length(实际数据长度指向),那么发送者的*length确实会受到影响。
【讨论】:
以上是关于在 freertos API 中使用队列的主要内容,如果未能解决你的问题,请参考以下文章
FreeRTOSFreeRTOS学习笔记(14)— FreeRTOS的消息队列(原生API)
FreeRTOS系列第18篇---FreeRTOS队列API函数