0

乐鑫 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 以便它尽快返回的最有效方法是什么?

4

2 回答 2

1

问题不在于将控制权交还给 FreeRTOS,而在于处理 eps-idf 框架中的看门狗。

看门狗在 IDLE 任务中被“馈送”,而 APP_MAIN 任务的优先级高于 IDLE,它永远不会被中断。

如果您不想使用vTaskDelay,也许您可​​以使 IDLE 和 MAIN 任务的优先级相等。比这两个都应该执行(但是如果有更多的任务没有得到足够的关注,你必须小心)。

于 2019-09-10T08:52:33.567 回答
0

除了测试,我不建议这样做,但您可以简单地禁用空闲任务上的任务看门狗。

menuconfig->Component config->Esp32-specific config->deactivate Task watchdog

对于生产代码,您应该遵循最佳实践并使用 FreeRTOS 功能,例如 vTaskDelay,这样您就不会占用 CPU。

于 2019-10-02T14:18:58.757 回答