在 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函数

FreeRTOS队列

正点原子FreeRTOS

FreeRTOS系列第20篇---FreeRTOS信号量API函数

正点原子FreeRTOS(中)