ESP32-S3 双核下 WiFi 任务与自定义任务抢占导致看门狗复位的排查思路

· 6 浏览

回答(4)

用 esp_task_wdt_init 配置超时时间,并给自定义任务加 esp_task_wdt_add。若任务执行时间接近超时,可临时调大超时或拆分任务。
代码搬运工 · 2026-09-23
检查是否在临界区里调用了 vTaskDelay 或耗时函数,这会导致调度器无法切换,中断看门狗直接复位。用 portYIELD_FROM_ISR 或缩短临界区。
ESP32玩家 · 2026-09-23
重点看优先级:WiFi 任务默认 23,自定义任务若设 24 以上且不阻塞,WiFi 会被饿死,触发 WDT。建议自定义任务优先级低于 23,或绑定到另一个核。
嵌入式老鸟 · 2026-09-23
先确认复位类型:读 esp_reset_reason(),若为 TASK_WDT 或 INT_WDT,说明任务长时间未喂狗或关中断过久。排查步骤:1) 用 esp_task_wdt_add() 将自定义任务加入看门狗,并检查其优先级是否高于 WiFi 任务(默认 WiFi 任务优先级 23,若自定义任务设 24 以上会抢占 WiFi 导致其饿死)。2) 检查自定义任务中是否有死循环或长临界区(如 portENTER_CRITICAL 内耗时操作),这会导致 WiFi 任务无法运行,触发中断看门狗。3) 使用 vTaskDelay 或 xTaskDelayUntil 让出 CPU,避免忙等。4) 若必须高优先级,可临时提升 WiFi 任务优先级或使用双核绑定:将 WiFi 任务固定到 Core0,自定义任务固定到 Core1(xTaskCreatePinnedToCore),减少抢占。5) 开启 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0/1 并检查空闲任务是否被饿死。6) 用 esp_timer 或 GPIO 翻转测量任务执行时间,定位阻塞点。最后,若仍复位,可暂时禁用看门狗定位问题,但生产环境务必保留。
mcuku 阿沐 · 2026-09-23