我现在还不熟悉FreeRTOS和学习队列。我有一个将5个整数发送到队列的Task_3和Task4,它读取队列并打印读取的值。问题是我将0..4写入队列,但Task 4读取队列的所有5个位置的值5。为什么不是0..4?
发送任务3
void task_3(void *args)
{
uint32_t count = 0;
uint32_t *Value;
Value = &count;
ESP_EARLY_LOGI(TAG, "Task 3 entered..");
if (myQueue_2 == NULL)
{
printf("myQueue_2 could not be created !\n");
}
ESP_EARLY_LOGI("TASK 3", "Data waiting in myQueue_2_1 : %d, Space available : %d", uxQueueMessagesWaiting(myQueue_2), uxQueueSpacesAvailable(myQueue_2));
for (count = 0; count < 5;count++)
{
ESP_EARLY_LOGI("TASK 3", "Value = %d\n", *Value);
xQueueSend(myQueue_2, (void*)&Value, (TickType_t)0);
}
ESP_EARLY_LOGI("TASK 3", "Data waiting in myQueue_2_1 : %d, Space available : %d",
uxQueueMessagesWaiting(myQueue_2), uxQueueSpacesAvailable(myQueue_2));
while (1)
{
vTaskDelay(pdMS_TO_TICKS(500));
}
}任务3的产出
I (0) TASK 3: Data waiting in myQueue_2_1 : 0, Space available : 5
I (10) TASK 3: Value = 0
I (10) TASK 3: Value = 1
I (20) TASK 3: Value = 2
I (20) TASK 3: Value = 3
I (20) TASK 3: Value = 4读取任务4
void task_4(void *args)
{
uint32_t *RxValue = NULL;
while (1)
{
vTaskDelay(pdMS_TO_TICKS(500));
if (uxQueueMessagesWaiting(myQueue_2) > 0)
{
xQueueReceive(myQueue_2, &RxValue, (TickType_t)5);
ESP_EARLY_LOGI("TASK 4", "Received from myQueue_2 = %d\n", *RxValue);
ESP_EARLY_LOGI("TASK 4", "Data waiting in myQueue_2 : %d, Space available : %d",
uxQueueMessagesWaiting(myQueue_2), uxQueueSpacesAvailable(myQueue_2));
}
}
}任务4的产出
I (30) TASK 3: Data waiting in myQueue_2_1 : 5, Space available : 0
I (1300) TASK 4: Received from myQueue_2 = 5
I (1300) TASK 4: Data waiting in myQueue_2 : 4, Space available : 1
I (1800) TASK 4: Received from myQueue_2 = 5
I (1800) TASK 4: Data waiting in myQueue_2 : 3, Space available : 2
I (2300) TASK 4: Received from myQueue_2 = 5
I (2300) TASK 4: Data waiting in myQueue_2 : 2, Space available : 3
I (2800) TASK 4: Received from myQueue_2 = 5
I (2800) TASK 4: Data waiting in myQueue_2 : 1, Space available : 4
I (3300) TASK 4: Received from myQueue_2 = 5
I (3300) TASK 4: Data waiting in myQueue_2 : 0, Space available : 5发布于 2022-10-23 15:20:43
xQueueSend()发送指向值的指针,而不是值本身。它并不能复制被指的东西。如果指向的值在读取队列之前发生了更改,则读取器将看到新的值。
您的代码将相同的五个指针排队到变量count,而不是count值的五个副本。到task_4运行时,count等于5,所以task_4每次读取5。
正确的方法是每次传递一个不同的指针。您可以每次malloc()值并释放它:
for (count = 0; count < 5;count++)
{
uint32_t *value = (uint32_t *)malloc(sizeof(uint32_t));
if (value) {
*value = count;
ESP_EARLY_LOGI("TASK 3", "Value = %d\n", *value);
xQueueSend(myQueue_2, (void*)&Value, (TickType_t)0);
} else {
ESP_EARLY_LOGI("TASK 3", "malloc failed");
}
}和
while (1)
{
vTaskDelay(pdMS_TO_TICKS(500));
if (uxQueueMessagesWaiting(myQueue_2) > 0)
{
xQueueReceive(myQueue_2, &RxValue, (TickType_t)5);
ESP_EARLY_LOGI("TASK 4", "Received from myQueue_2 = %d\n", *RxValue);
ESP_EARLY_LOGI("TASK 4", "Data waiting in myQueue_2 : %d, Space available : %d",
uxQueueMessagesWaiting(myQueue_2), uxQueueSpacesAvailable(myQueue_2));
free(RxValue);
}
}第一个代码片段分配存储空间并每次对其进行排队,因此每个排队的项都将不同。非常重要的是,第二个代码片段释放存储空间,否则程序将泄漏内存并最终耗尽内存。
由于指针足够大以存储uint32_t,所以您也可以将计数器转换为void *,并在接收任务中将其转换回uint32_t。如果您想传递比指针更大的内容,则需要对其进行malloc()并初始化它,或者对要传递的对象执行自己的内存管理。
https://stackoverflow.com/questions/74171522
复制相似问题