在freertos API中使用队列

时间:2018-06-18 17:12:11

标签: c freertos

在freertos文档中,他们说可以通过两种方式实现队列行为:

按副本排队:按副本排队意味着发送到队列的数据将逐字节复制到队列中。

按引用排队:按引用排队意味着队列只保存指向发送到队列的数据的指针,而不是数据本身。

当我发送结构" CommandData"时,我的问题出现在下面的代码中。从task1到task2,然后在接收中更改结构中的DataArray字段 task.does这会影响发送任务中的相同字段。

换句话说,在这种情况下,它是按副本排队还是按引用排队?

trailTime

谢谢

2 个答案:

答案 0 :(得分:2)

来自freeRTOS的说明非常明确:
功能原型:

BaseType_t xQueueSendToBack(QueueHandle_t xQueue,
                            const void * pvItemToQueue,
                            TickType_t xTicksToWait);
  

<强> pvItemToQueue :   指向要放在队列中的项的指针。队列将保留的项目大小是在创建队列时定义的,所以这么多字节将从pvItemToQueue复制到队列存储区域

注意:小心将0U作为xTicksToWait参数。

  

xTicksToWait :任务应阻止等待空间在队列中可用的最长时间(如果已满)。 如果此设置为0 ,则会立即返回此呼叫。时间在滴答周期中定义,因此如果需要,应使用常量portTICK_PERIOD_MS转换为实时。

答案 1 :(得分:0)

您通过使用包含指针的结构使自己感到困惑。是的,该结构是通过副本传递的,但是副本包含指针,而不是实际数据。

因为length是一个指针,所以如果接收者修改了长度,它将不会导致发送者上下文的改变,但是如果修改* length(指向实际数据长度),则发送者的* length确实会受到影响。 / p>