snakeemail 发表于 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

eric2013 发表于 2021-2-27 09:30:00

优先级不同,MsgPro优先级高于UserIF

snakeemail 发表于 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");                                             
                                        }

}

eric2013 发表于 2021-2-27 09:56:54

snakeemail 发表于 2021-2-27 09:38
不是啊。
任务vTaskTaskUserIF的优先级最高,所以我认为,此任务里面,先打印"K2键按下,向xQueue1发送 ...

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

snakeemail 发表于 2021-2-27 10:36:04

感谢。我还事先在网上查了下freertos的优先级,结果看的是unix优先级。真是惭愧。:dizzy:
页: [1]
查看完整版本: 为啥队列执行的顺序,和我想的不一样