2025年Queue的多进单出模型

Queue的多进单出模型当多个发送数据的任务函数向同一个消息队列缓冲区中发送数据 接收数据的任务函数从消息队列缓冲区中接收数据 那么这个模型其实就很有意义了 include stdio h include sdkconfig h include freertos FreeRTOS h stdio h

大家好,我是讯享网,很高兴认识大家。

请添加图片描述
讯享网
当多个发送数据的任务函数向同一个消息队列缓冲区中发送数据,接收数据的任务函数从消息队列缓冲区中接收数据,那么这个模型其实就很有意义了。

#include <stdio.h> #include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_spi_flash.h" #include "freertos/queue.h" void sendTask1(void *pvParam) { 
    QueueHandle_t QHandle; QHandle = (QueueHandle_t)pvParam; BaseType_t xStatus; int i = 111; while (1) { 
    xStatus = xQueueSend(QHandle, &i, 0); if (xStatus != pdPASS) { 
    printf("send fail\n"); } else { 
    printf("send done\n"); } vTaskDelay(1000 / portTICK_PERIOD_MS); } } void sendTask2(void *pvParam) { 
    QueueHandle_t QHandle; QHandle = (QueueHandle_t)pvParam; BaseType_t xStatus; int i = 222; while (1) { 
    xStatus = xQueueSend(QHandle, &i, 0); if (xStatus != pdPASS) { 
    printf("send fail\n"); } else { 
    printf("send done\n"); } vTaskDelay(1000 / portTICK_PERIOD_MS); } } void sendTask3(void *pvParam) { 
    QueueHandle_t QHandle; QHandle = (QueueHandle_t)pvParam; BaseType_t xStatus; int i = 333; while (1) { 
    xStatus = xQueueSend(QHandle, &i, 0); if (xStatus != pdPASS) { 
    printf("send fail\n"); } else { 
    printf("send done\n"); } vTaskDelay(1000 / portTICK_PERIOD_MS); } } void recTask(void *pvParam) { 
    QueueHandle_t QHandle; QHandle = (QueueHandle_t)pvParam; BaseType_t xStatus; int i; while (1) { 
    xStatus = xQueueReceive(QHandle, &i, portMAX_DELAY); if (xStatus != pdPASS) { 
    printf("rec fail\n"); } else { 
    printf("rec %d\n", i); } } } void app_main(void) { 
    QueueHandle_t QHandle; QHandle = xQueueCreate(5, sizeof(int)); if (QHandle != NULL) { 
    printf("create queue successfully\n"); xTaskCreate(sendTask1, "sendTask1", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(sendTask2, "sendTask2", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(sendTask3, "sendTask3", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(recTask, "recTask", 1024 * 5, (void *)QHandle, 2, NULL); } else { 
    printf("can not create queue\n"); } } 

讯享网

创建三个发送数据的任务函数,具体的可以参考上一小节,发送数据的函数创建好后,再创建接收数据的函数。

讯享网xStatus = xQueueReceive(QHandle, &i, portMAX_DELAY); 
 xTaskCreate(sendTask1, "sendTask1", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(sendTask2, "sendTask2", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(sendTask3, "sendTask3", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(recTask, "recTask", 1024 * 5, (void *)QHandle, 2, NULL); 

这里值得提一句的是,三个发送数据端可以赋予相同的优先级,也可以赋予不同的优先级,这是根据实际情况去调整的。对于接收数据端,要比三个数据端赋予的优先级还要大才可以,这也是为了保证当消息队列缓冲区中存放了数据,接收端的任务函数可以立即取出并进行处理。
请添加图片描述

小讯
上一篇 2025-03-13 21:47
下一篇 2025-02-27 16:43

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/52284.html