FreeRTOS饥饿和时间分割

时间:2019-06-02 08:25:02

标签: c embedded freertos

我在皮质m4处理器上运行FreeRTOS时遇到问题。我完成了3个任务:定期任务和2个连续任务。

-O3 -m64 -march=native

上面的代码运行得很好,但只有当我在continousTask中获得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 ; } 时,如果我将其删除,我的连续任务2便会出现周期性的任务饿死(或不在期望的时间段内运行),因为周期性的任务是更高的优先级。连续任务2也不应挨饿,因为我定义了vTaskDelay(1)

1 个答案:

答案 0 :(得分:1)

最可能的原因是打印语句。如何实施?如果他们使用半主机,则调度程序将无法正常工作,因为会发生硬件冲突。如果他们没有使用半主机,则请确保它们正在阻止写操作(这是指执行写操作的任务进入阻止状态,因此在实际执行IO时不使用任何CPU时间并允许其他任务运行)。免费书籍(https://www.freertos.org/Documentation/RTOS_book.html)有更多关于使用printf()的风险。