0
点赞
收藏
分享

微信扫一扫

[笔记]ESP32 踩坑 任务看门狗超时的问题---Task watchdog got triggered

技术只适用于干活 2022-04-13 阅读 219

一、环境配置

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+鼠标左键跳转,把它这段代码注释掉即可.

 再次编译就可以通过了

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

举报

相关推荐

0 条评论