硬汉嵌入式论坛

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

[FreeRTOS] 为啥队列执行的顺序,和我想的不一样

[复制链接]

41

主题

215

回帖

338

积分

高级会员

积分
338
发表于 2021-2-26 22:17:27 | 显示全部楼层 |阅读模式

我天真的认为:
vTaskUserIF任务发送队列后,会先打印 "K2键按下,向xQueue1发送数据成功",
然后接收任务vTaskMsgPro才打印"接收到消息队列数据ucQueueMsgValue = 8"。

可是实际是相反的。为什么

实际打印顺序:
接收到消息队列数据ucQueueMsgValue = 8
K2键按下,向xQueue1发送数据成功


static void vTaskTaskUserIF(void *pvParameters)
{

                                        if( xQueueSend(xQueue1,    (void *) &ucCount,  (TickType_t)10) == pdFail )
                                        {
                                                printf("K2键按下,向xQueue1发送数据成功\r\n");                                               
                                        }

}

static void vTaskMsgPro(void *pvParameters)
{
        BaseType_t xResult;
        const TickType_t xMaxBlockTime = pdMS_TO_TICKS(300); /* éèÖÃ×î′óμè′yê±¼äÎa300ms */
        uint8_t ucQueueMsgValue;
       
    while(1)
    {
                xResult = xQueueReceive(xQueue1,                  
                                        (void *)&ucQueueMsgValue,  
                                        (TickType_t)xMaxBlockTime);
               
                if(xResult == pdPASS)
                {
                       
                        printf("接收到消息队列数据ucQueueMsgValue = %d\r\n", ucQueueMsgValue);
                }

    }
}


=================================================
任务名      任务状态 优先级   剩余栈 任务序号
vTaskUserIF     R       1       318     1               发送任务
IDLE            R       0       113     5
vTaskMsgPro     B       3       444     3
vTaskLED        B       2       444    2                 接收任务
vTaskStart      B       4       489     4

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2021-2-27 09:30:00 | 显示全部楼层
优先级不同,MsgPro优先级高于UserIF
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2021-2-27 09:38:49 | 显示全部楼层
eric2013 发表于 2021-2-27 09:30
优先级不同,MsgPro优先级高于UserIF

不是啊。
任务vTaskTaskUserIF的优先级最高,所以我认为,此任务里面,先打印"K2键按下,向xQueue1发送数据成功"。 可是这个是后打印的。

static void vTaskTaskUserIF(void *pvParameters)
{

                                        if( xQueueSend(xQueue1,    (void *) &ucCount,  (TickType_t)10) == pdFail )
                                        {
                                                printf("K2键按下,向xQueue1发送数据成功\r\n");                                               
                                        }

}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2021-2-27 09:56:54 | 显示全部楼层
snakeemail 发表于 2021-2-27 09:38
不是啊。
任务vTaskTaskUserIF的优先级最高,所以我认为,此任务里面,先打印"K2键按下,向xQueue1发送 ...

理解有偏,FreeRTOS里面,优先级数字越小,优先级越低,空闲任务最低位0

回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2021-2-27 10:36:04 | 显示全部楼层
感谢。我还事先在网上查了下freertos的优先级,结果看的是unix优先级。真是惭愧。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 07:38 , Processed in 0.310456 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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