一、环境配置

更新--- 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函数的错误

这个问题基本解决方法大概是这样子。如果后期再出现这种问题可以在下面留言

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐