一、环境配置
1、ESP-IDF 4.3 & ESP-IDF 4.4
2、应该适用于全部的ESP32系列,ESP8266就不太清楚,本人基本不用ESP8266了,所以没有遇到
提示 IDLE是FreeRTOS系统中必须有的一个最低级调度的空闲任务,具体为啥请百度
二、先看UART的LOG
这里提示说IDLE0空闲任务的看门狗被触发了(没有喂狗),但当前运行在loopTask任务中。当然可能是其他的任务,但都是同种情况。
这里分两种情况,一个是函数中没有运行vTaskDelay挂起函数,一个是运行了vTaskDelay挂起函数。
1、任务循环中没有运行vTaskDelay挂起函数
请添加vTaskDelay,至少有一段时间的运行权给到IDLE任务中。
2、任务循环中运行了vTaskDelay挂起函数
即使添加了vTaskDelay,但还是出现上述LOG的报告的话。请看下面。
三、在保证任务中已有运行vTaskDelay挂起函数的情况下,依旧出现卡狗的情况
1、添加相关头文件并打开宏开关
在你的main.c中添加
#include "freertos/FreeRTOSConfig.h"
#include "esp_task_wdt.h"
FreeRTOSConfig.h 一般情况下,是使用者更改宏开关的地方。在里面全局搜索 configUSE_IDLE_HOOK,请保证这个宏是 1;一般情况下这个宏默认是1
#define configUSE_IDLE_HOOK 1
esp_task_wdt.h则是稍后添加喂狗函数的头文件
2、添加IDLE空闲任务的钩子函数(钩子函数不知道的请百度,有点类似回调函数)
在main.c的最下面添加钩子函数,直接添加就可以了,不用其他操作。请注意,最好不要添加阻塞性的函数,包括printf函数,为了保证响应
void vApplicationIdleHook(void)
{
esp_task_wdt_reset();
}
在源代码中是这样的
#if ( configUSE_IDLE_HOOK == 1 )
{
extern void vApplicationIdleHook( void );
/* Call the user defined function from within the idle task. This
* allows the application designer to add background functionality
* without the overhead of a separate task.
* NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,
* CALL A FUNCTION THAT MIGHT BLOCK. */
vApplicationIdleHook();
}
#endif /* configUSE_IDLE_HOOK */
函数内声明了这个函数,所以使用者无需在.h中对外声明。而这个宏就是在第三点第一小点添加的那个宏
三、编译
可以编译了,但大概率会编译失败,原因是出现某个函数的多重定义问题
esp/esp-idf/components/esp_system/freertos_hooks.c:47:
multiple definition of `esp_vApplicationIdleHook';
我们直接Ctrl+鼠标左键跳转,把它这段代码注释掉即可.
再次编译就可以通过了
这个问题基本解决方法大概是这样子。如果后期再出现这种问题可以在下面留言