首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FreeRTOS队列

FreeRTOS队列
EN

Stack Overflow用户
提问于 2022-10-23 13:29:28
回答 1查看 69关注 0票数 0

我现在还不熟悉FreeRTOS和学习队列。我有一个将5个整数发送到队列的Task_3和Task4,它读取队列并打印读取的值。问题是我将0..4写入队列,但Task 4读取队列的所有5个位置的值5。为什么不是0..4?

发送任务3

代码语言:javascript
复制
    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的产出

代码语言:javascript
复制
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

代码语言:javascript
复制
    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的产出

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-23 15:20:43

xQueueSend()发送指向值的指针,而不是值本身。它并不能复制被指的东西。如果指向的值在读取队列之前发生了更改,则读取器将看到新的值。

您的代码将相同的五个指针排队到变量count,而不是count值的五个副本。到task_4运行时,count等于5,所以task_4每次读取5。

正确的方法是每次传递一个不同的指针。您可以每次malloc()值并释放它:

代码语言:javascript
复制
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");
        }
    }

代码语言:javascript
复制
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()并初始化它,或者对要传递的对象执行自己的内存管理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74171522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档