我一直在学习 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)必须正在运行,这不是文档所述...