问题描述
我试图通过FreeRTOS来学习ESP-IDF,并且当我使用数据表中的代码时所做的更改很小 (参考代码:https://S3MediaVault.com第53和54页。董事会正在重新启动。
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void vTask1(void* pvParameters){
const char* pcTaskName = "Task 1 is running \n";
for(;;){
printf(pcTaskName);
vTaskDelay(1000/ portTICK_PERIOD_MS);
}
}
void vTask2(void* pvParameters){
const char* pcTaskName = "Task 2 is running \n\n";
for(;;){
printf(pcTaskName);
vTaskDelay(1000/ portTICK_PERIOD_MS);
}
}
void app_main(void){
xTaskCreate( vTask1,"TASK 1",1000,NULL,1,NULL );
xTaskCreate( vTask2,"TASK 2",NULL);
vTaskStartScheduler();
while(true);
}
现在,当我删除vTaskStartScheduler()
和无限while循环时。程序未重新启动,但输出结果与预期不符。
使用的代码
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void vTask1(void* pvParameters){
const char* pcTaskName = "Task 1 is running \n";
for(;;){
printf(pcTaskName);
vTaskDelay(1000/ portTICK_PERIOD_MS);
}
}
void vTask2(void* pvParameters){
const char* pcTaskName = "Task 2 is running \n\n";
for(;;){
printf(pcTaskName);
vTaskDelay(1000/ portTICK_PERIOD_MS);
}
}
void app_main(void){
xTaskCreate( vTask1,NULL);
}
获得的输出是
解决方法
如果您使用的是ESP-IDF,则无需致电vTaskStartScheduler
。在其他平台上可能有所不同。 main()
开始之前已被调用(请参阅https://github.com/espressif/esp-idf/blob/master/components/freertos/xtensa/port.c#L619)。
如果再次调用它,则会导致问题,因为您已经学会了困难的方法。
输出符合预期:任务1和2每秒打印一行。
几乎在同一时间启动它们,它们执行相同的工作并且暂停了相同的时间,因此任务1或任务2每秒首先打印该消息多少是随机的。 / p>