FreeRTOS 冻结
FreeRTOS freezes
我有一个简单的 FreeRTOS 程序,基本上我需要计算 运行 不同迭代次数所需的时间。
问题是它只是冻结并且不再执行,尽管迭代尚未完成,我需要它成功地到达 vTaskEndScheduler() 终止以便我可以正确计算时间。可能是什么原因?
Freeze screenshot
void Task1() {
for (int i = 0; i < 100; i++)
{
printf("This is task 1 ");
printf("Iteration number ");
printf("%d", i);
printf("\n");
vTaskDelay(100);
}
vTaskEndScheduler();
};
void Task2() {
for (int i = 0; i < 100; i++) {
printf("This is task 2 ");
printf("Iteration number ");
printf("%d", i);
printf("\n");
vTaskDelay(100);
}
vTaskEndScheduler();
};
void main_blinky(void)
{
enableFlushAfterPrintf();
xTaskCreate(Task1, (signed char*) "t1", 100, NULL, 1, NULL);
xTaskCreate(Task2, (signed char*) "t2", 100, NULL, 1, NULL);
vTaskStartScheduler();
}
乍一看,在不了解您的系统的情况下,我猜 printf() 是导致问题的原因。它是如何实施的?它是线程安全的吗?您的任务是否有足够的堆栈 space 来满足其堆栈要求,这可能很大,具体取决于您使用的库:https://freertos.org/Stacks-and-stack-overflow-checking.html
请参阅(免费但有些过时)书中的注释 (https://freertos.org/Documentation/RTOS_book.html) ref printf。
您必须首先为任务选择合适的堆栈,并确保在 运行 时间内可以通过堆大小访问它,然后我认为
问题可能出在 printf() 方法及其实现方式上。
我有一个简单的 FreeRTOS 程序,基本上我需要计算 运行 不同迭代次数所需的时间。 问题是它只是冻结并且不再执行,尽管迭代尚未完成,我需要它成功地到达 vTaskEndScheduler() 终止以便我可以正确计算时间。可能是什么原因? Freeze screenshot
void Task1() {
for (int i = 0; i < 100; i++)
{
printf("This is task 1 ");
printf("Iteration number ");
printf("%d", i);
printf("\n");
vTaskDelay(100);
}
vTaskEndScheduler();
};
void Task2() {
for (int i = 0; i < 100; i++) {
printf("This is task 2 ");
printf("Iteration number ");
printf("%d", i);
printf("\n");
vTaskDelay(100);
}
vTaskEndScheduler();
};
void main_blinky(void)
{
enableFlushAfterPrintf();
xTaskCreate(Task1, (signed char*) "t1", 100, NULL, 1, NULL);
xTaskCreate(Task2, (signed char*) "t2", 100, NULL, 1, NULL);
vTaskStartScheduler();
}
乍一看,在不了解您的系统的情况下,我猜 printf() 是导致问题的原因。它是如何实施的?它是线程安全的吗?您的任务是否有足够的堆栈 space 来满足其堆栈要求,这可能很大,具体取决于您使用的库:https://freertos.org/Stacks-and-stack-overflow-checking.html
请参阅(免费但有些过时)书中的注释 (https://freertos.org/Documentation/RTOS_book.html) ref printf。
您必须首先为任务选择合适的堆栈,并确保在 运行 时间内可以通过堆大小访问它,然后我认为 问题可能出在 printf() 方法及其实现方式上。