FreeRTOS 饥饿和时间切片
FreeRTOS starvation and time slicing
我在 cortex m4 处理器上使用 运行ning FreeRTOS 时遇到问题。我有 3 个任务:周期性任务和 2 个连续性任务。
static const char text1[] = "Periodic task\r\n";
static const char text2[] = "Continous Task\r\n";
static const char text3[] = "Continous Task 2\r\n";
void periodicTask(void *pvParameter)
{
TickType_t prevCount;
char *printText = (char*)pvParameter;
prevCount= xTaskGetTickCount();
for(;;)
{
printf(printText);
vTaskDelayUntil(&prevCount,pdMS_TO_TICKS(5));
}
}
void continousTask(void *pvParameter)
{
char *printText = (char*)pvParameter;
for(;;)
{
printf(printText);
vTaskDelay(1);
}
}
int main(void)
{
xTaskCreate(periodicTask,"periodic task",200,(void*)text1,3,NULL);
xTaskCreate(continousTask,"continous task 1",200,(void*)text2,0,NULL);
//xTaskCreate(continousTask,"continous task 2",200,(void*)text3,0,NULL);
vTaskStartScheduler();
while(1)
{
}
return 0 ;
}
上面的代码 运行ning 很好,但只有当我在 continousTask 中得到 vTaskDelay(1)
如果我删除它,我的连续任务 2 和周期性任务将饿死(或者 运行 不在desired period) 这不应该发生,因为周期性任务具有更高的优先级。连续任务 2 也不应该饿死,因为我定义了 configUSE_TIME_SLICING 1
。
最有可能的原因是打印语句。它们是如何实施的?如果他们使用半主机,那么调度程序将无法正常工作,因为会发生硬件冲突。如果他们不使用半主机,那么确保他们正在阻塞写入(我的意思是执行写入的任务进入阻塞状态,因此不使用任何 cpu 时间并允许其他任务 运行,而实际上执行了 IO)。免费书籍 (https://www.freertos.org/Documentation/RTOS_book.html ) 详细介绍了使用 printf() 的危险。
我在 cortex m4 处理器上使用 运行ning FreeRTOS 时遇到问题。我有 3 个任务:周期性任务和 2 个连续性任务。
static const char text1[] = "Periodic task\r\n";
static const char text2[] = "Continous Task\r\n";
static const char text3[] = "Continous Task 2\r\n";
void periodicTask(void *pvParameter)
{
TickType_t prevCount;
char *printText = (char*)pvParameter;
prevCount= xTaskGetTickCount();
for(;;)
{
printf(printText);
vTaskDelayUntil(&prevCount,pdMS_TO_TICKS(5));
}
}
void continousTask(void *pvParameter)
{
char *printText = (char*)pvParameter;
for(;;)
{
printf(printText);
vTaskDelay(1);
}
}
int main(void)
{
xTaskCreate(periodicTask,"periodic task",200,(void*)text1,3,NULL);
xTaskCreate(continousTask,"continous task 1",200,(void*)text2,0,NULL);
//xTaskCreate(continousTask,"continous task 2",200,(void*)text3,0,NULL);
vTaskStartScheduler();
while(1)
{
}
return 0 ;
}
上面的代码 运行ning 很好,但只有当我在 continousTask 中得到 vTaskDelay(1)
如果我删除它,我的连续任务 2 和周期性任务将饿死(或者 运行 不在desired period) 这不应该发生,因为周期性任务具有更高的优先级。连续任务 2 也不应该饿死,因为我定义了 configUSE_TIME_SLICING 1
。
最有可能的原因是打印语句。它们是如何实施的?如果他们使用半主机,那么调度程序将无法正常工作,因为会发生硬件冲突。如果他们不使用半主机,那么确保他们正在阻塞写入(我的意思是执行写入的任务进入阻塞状态,因此不使用任何 cpu 时间并允许其他任务 运行,而实际上执行了 IO)。免费书籍 (https://www.freertos.org/Documentation/RTOS_book.html ) 详细介绍了使用 printf() 的危险。