在freertos文档中,他们说可以通过两种方式实现队列行为:
按副本排队:按副本排队意味着发送到队列的数据将逐字节复制到队列中。
按引用排队:按引用排队意味着队列只保存指向发送到队列的数据的指针,而不是数据本身。
当我发送结构" CommandData"时,我的问题出现在下面的代码中。从task1到task2,然后在接收中更改结构中的DataArray字段 task.does这会影响发送任务中的相同字段。
换句话说,在这种情况下,它是按副本排队还是按引用排队?
trailTime
谢谢
答案 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>