一、环境配置
更新--- 2022/4/13
问题:之前的操作会造成新项目无法找到esp_vApplicationldleHook的函数,所以改成了屏蔽宏定义的操作,但是需要使用者在自己的所有项目的main.c中添加void vApplicationldleHook(void)函数,不然会编译出错
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中对外声明。而代码中的这个宏就是在第三点第一小点的宏
三、屏蔽宏函数(更新修改点)
因为ESP32的系列中,分两个内核,一个是riscv,一个是xtensa,所以在.h中也分两个文件,按照自己需要的屏蔽即可
我使用的是ESP32-C3,内核是riscv,所以要找到对应riscv的.h文件
四、编译
可以编译了
再次提醒!!!
这样做的话,要在你使用的所有项目中,都添加void vApplicationIdleHook(void),参考第三点第二小点----添加IDLE空闲任务的钩子函数。
不然的话编译到最后会报无法找到vApplicationIdleHook函数的错误
这个问题基本解决方法大概是这样子。如果后期再出现这种问题可以在下面留言