FreeRTOS - 任务优先级和空闲任务

时间:2021-06-04 14:28:06

标签: task priority-queue freertos

我一直在学习 FreeRTOS 教程,以快速掌握框架。

我认为我拥有的文档有点旧,但我认为这对我的问题并不重要(我使用的是直接来自 FreeRTOS 网站的“161204 掌握 FreeRTOS 实时内核”文档)。

文档第 84 页的图 22 显示空闲任务永远不会运行,因为总是有更高优先级的任务可用。我试图在我拥有的 SAMD21 Xplained Pro 板上模拟这一点,但看到了我无法解释的行为:

我有两个任务,它们使 LED 闪烁并切换引脚:

void AppLEDTask_On(void *pvParameters)
{
    portTickType startedAt = xTaskGetTickCount();
    while (1)
    {
        uint8_t prior = 0;
                
        dbg_print_hexint(u32IdleCount);
        dbg_print_str(" On Task\r\n");
        
        port_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
        port_pin_set_output_level(PIN_PB00, true);
        
        vTaskPrioritySet(AppLEDTask_Off_Handle, 2);
        vTaskPrioritySet(AppLEDTask_On_Handle, 1);
    }
    vTaskDelete(NULL);
}

void AppLEDTask_Off(void *pvParameters)
{
    portTickType startedAt = xTaskGetTickCount();
    while (1)
    {
        uint8_t prior = 0;
        
        dbg_print_hexint(u32IdleCount);
        dbg_print_str(" Off Task\r\n");
        
        port_pin_set_output_level(LED_0_PIN, !LED_0_ACTIVE);
        port_pin_set_output_level(PIN_PB00, false);
        
        vTaskPrioritySet(AppLEDTask_On_Handle, 2);
        vTaskPrioritySet(AppLEDTask_Off_Handle, 1);
    }
    vTaskDelete(NULL);
}

在主要部分:

void create_tasks(void)
{
    xTaskCreate(AppLEDTask_Off,
        "Control of LED",
        configMINIMAL_STACK_SIZE,
        NULL,
        2,
        &AppLEDTask_Off_Handle);
        
    xTaskCreate(AppLEDTask_On,
        "Control of LED",
        configMINIMAL_STACK_SIZE,
        NULL,
        2,
        &AppLEDTask_On_Handle);
}

我还有一个空闲任务,它会增加 u32IdleCount。我假设空闲任务永远不会运行,因为总是有更高优先级的任务可用,但我可以看到空闲计数在增加。我错过了什么吗?

编辑:好的,从根本上说,我认为我误解了 FreeRTOS 文档。如果我删除除单个任务和空闲任务以外的所有内容:

void SomeTask(void *pvParameters)
{
    while (1)
    {
        dbg_print_hexint(u32IdleCount);
    }
    vTaskDelete(NULL);
}
void vApplicationIdleHook(void)
{
    u32IdleCount++;
}

并且这个任务的创建优先级大于空闲优先级,确定 u32IdleCount 永远不应该增加吗?我可以看到空闲计数正在增加,因此空闲任务(优先级为 0)必须正在运行,这不是文档所述...

0 个答案:

没有答案
相关问题