乐鑫 esp-idf 中的入门示例是 hello-world 和 blink。Hello-world 输出打印然后调用esp_restart();
- 所以它在它自己的特殊无限循环中。
blink 示例(删除了注释)有这个 app_main,它也是一个无限循环:
void app_main(void)
{
gpio_pad_select_gpio(BLINK_GPIO);
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
while(1) {
printf("Turning off the LED\n");
gpio_set_level(BLINK_GPIO, 0);
vTaskDelay(1000 / portTICK_PERIOD_MS);
printf("Turning on the LED\n");
gpio_set_level(BLINK_GPIO, 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
我将闪烁示例复制到我的 ~/esp 文件夹中,没有运行 makeconfig(所以只使用默认值),构建、刷新和监视它,它可以工作 - 监视器只显示“关闭 LED”和“打开引领'。没有提到看门狗定时器。
我编写了自己的最简单的应用程序,没有调用 vTaskDelay():
void app_main(void) {
long timeSinceBoot;
while (1) {
timeSinceBoot = esp_timer_get_time();
printf("Helloooo world %ld\n!",timeSinceBoot);
};
}
这会导致串行监视器定期显示以下输出:
E (20298) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (20298) task_wdt: - IDLE0 (CPU 0)
E (20298) task_wdt: Tasks currently running:
E (20298) task_wdt: CPU 0: main
E (20298) task_wdt: CPU 1: IDLE1
我明白为什么——我需要回调操作系统,让它做它需要做的事情。我已经通过yield
其他系统中的声明做到了这一点。
我只想使用一个核心,并试图避免使用 xTaskCreate 以使我的代码易于理解。
如果我不想延迟(就像眨眼示例所做的那样),将控制权从 app_main 传递回 FreeRTOS 以便它尽快返回的最有效方法是什么?