硬汉嵌入式论坛

 找回密码
 立即注册
查看: 354|回复: 3
收起左侧

[FreeRTOS] 关于队列先入先出的一点疑问

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2024-3-12 12:22:16 | 显示全部楼层 |阅读模式
[C] 纯文本查看 复制代码
#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("[Task1] Fail,Queue is FULL,Reset!.\n");
            xQueueReset(QHandle);
        }
        else
        {
             printf("[Task1] Success,Have [    %d  ] Loca.\n" ,uxQueueSpacesAvailable(QHandle));
        }
        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("[Task2],Queue is FULL,Reset!.\n");
            xQueueReset(QHandle);
        }
        else
        {
            printf("[Task2] Success Have [    %d  ] Loca.\n" ,uxQueueSpacesAvailable(QHandle));
        }
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}
void ReceiveTask(void *pvParam){
    QueueHandle_t QHandle;
    QHandle = (QueueHandle_t)pvParam;

    BaseType_t xStatus;
    int j = 0;
    while (1)
    {
            xStatus = xQueueReceive(QHandle, &j, 0);

            if (xStatus != pdPASS){
                printf("Receive Fail.\n");
            }
            else{
                printf("*******************************\n");
                printf("Receive Success.i = <%d>.\n", j);
                printf("队列可用消息 = %d.\n", uxQueueMessagesWaiting(QHandle));
                printf("*******************************\n");
            }
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void app_main(void)
{
    QueueHandle_t QHandle;
    QHandle = xQueueCreate(5, sizeof(int));

    if (QHandle != NULL)
    {
        printf("Creat queue Successfully.\n");
        xTaskCreate(SendTask1, "SendTask1", 1024 * 5, (void *)QHandle, 1, NULL);
        xTaskCreate(SendTask2, "SendTask2", 1024 * 5, (void *)QHandle, 1, NULL);
        xTaskCreate(ReceiveTask, "ReceiveTask", 1024 * 5, (void *)QHandle, 3, NULL);
    }
    else{
        printf("Not Creat.\n");
    }
}
/*TAsk1和TASk2公用一个队列,后创建的先运行,循环发送数据,待队列满进行重启,始终都是TASK1重启
*/

终端显示:

[Task2] Success Have [    4  ] Loca.
[Task1] Success,Have [    3  ] Loca.
*******************************
Receive Success.i = <222>.
队列可用消息 = 1.
*******************************
[Task2] Success Have [    3  ] Loca.
[Task1] Success,Have [    2  ] Loca.
*******************************
Receive Success.i = <111>.
队列可用消息 = 2.
*******************************
[Task2] Success Have [    2  ] Loca.
[Task1] Success,Have [    1  ] Loca.
*******************************
Receive Success.i = <222>.
队列可用消息 = 3.
*******************************
[Task2] Success Have [    1  ] Loca.
[Task1] Success,Have [    0  ] Loca.
*******************************
Receive Success.i = <111>.
队列可用消息 = 4.
*******************************
[Task2] Success Have [    0  ] Loca.
[Task1] Fail,Queue is FULL,Reset!.
Receive Fail.


问题描述:
两个Task往同一个队列传数据,接收函数接收到立即传出,并且接收函数优先级高于发送函数,为什么通过uxQueueSpaceAvaliable查询队列空间再减少。
FreeRTos不是接收数据后就销毁吗,如果空间不断减少,那对于大量数据的接收不是太浪费空间了吗。

初来论坛,问题描述可能不够精确,望海涵。

Queue_FIFO.txt

3.26 KB, 下载次数: 0

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2024-3-13 09:08:31 | 显示全部楼层
这个打印内容是最开始的吗,如果是最开始的,那有点诡异,成了发送先执行,接收后执行了。

[Task2] Success Have [    4  ] Loca.
[Task1] Success,Have [    3  ] Loca.
*******************************
Receive Success.i = <222>.
队列可用消息 = 1.
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2024-3-20 11:43:45 | 显示全部楼层
前面有一条调试信息,也是发送先进行接收后进行,你说我才意识到确实诡异,后面就是循环输出信息了,硬件用的ESP32的板子,我也看了ESP32里相关FreeRtos的相关文档,确实没发现问题出在哪里
这两天没看帖子,回复晚了,不好意思
Creat queue Successfully.
[Task1] Success,Have [    4  ] Loca.
*******************************
Receive Success.i = <111>.
队列可用消息 = 1.
*******************************
[Task2] Success Have [    4  ] Loca.
[Task1] Success,Have [    3  ] Loca.
*******************************
Receive Success.i = <222>.
队列可用消息 = 1.
*******************************
[Task2] Success Have [    3  ] Loca.
[Task1] Success,Have [    2  ] Loca.
*******************************
Receive Success.i = <111>.
队列可用消息 = 2.
*******************************
[Task2] Success Have [    2  ] Loca.
[Task1] Success,Have [    1  ] Loca.
*******************************
Receive Success.i = <222>.
队列可用消息 = 3.
*******************************
[Task2] Success Have [    1  ] Loca.
[Task1] Success,Have [    0  ] Loca.
*******************************
Receive Success.i = <111>.
队列可用消息 = 4.
*******************************
[Task2] Success Have [    0  ] Loca.
[Task1] Fail,Queue is FULL,Reset!.
Receive Fail.
[Task2] Success Have [    4  ] Loca.
[Task1] Success,Have [    3  ] Loca.
*******************************
Receive Success.i = <222>.     
队列可用消息 = 1.
*******************************
[Task2] Success Have [    3  ] Loca.
[Task1] Success,Have [    2  ] Loca.
*******************************
Receive Success.i = <111>.     
队列可用消息 = 2.
*******************************
[Task2] Success Have [    2  ] Loca.
[Task1] Success,Have [    1  ] Loca.
*******************************
Receive Success.i = <222>.     
队列可用消息 = 3.
*******************************
[Task2] Success Have [    1  ] Loca.
[Task1] Success,Have [    0  ] Loca.
*******************************
Receive Success.i = <111>.
队列可用消息 = 4.
*******************************
[Task2] Success Have [    0  ] Loca.
[Task1] Fail,Queue is FULL,Reset!.
Receive Fail.
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2024-3-20 11:52:58 | 显示全部楼层
初学者,对一些内容的理解偏差可能比较大,还是得多多研究源码了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 07:53 , Processed in 0.170358 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表