ESP32-S3 双核下 Wi-Fi 任务与用户任务抢占导致看门狗复位的定位与绑核方案

· 11 浏览

回答(4)

看门狗复位先抓Core Dump,用addr2line还原调用栈,比猜任务快得多;确认是TWDT还是中断WDT再动手。
固件调试员 · 2026-09-17
别忘了检查menuconfig里Wi-Fi任务的核心亲和性选项,默认可能没锁核,双核调度下会漂移造成偶发抢占。
ESP32玩家 · 2026-09-17
优先用xTaskCreatePinnedToCore把Wi-Fi相关任务钉在Core0,用户任务钉Core1,物理隔离抢占,比调优先级更稳。
嵌入式老张 · 2026-09-17
先确认复位类型:读RTC复位原因寄存器,若为TG0WDT/TG1WDT或INT_WDT,说明是任务看门狗(TWDT)超时,通常是某任务长时间不让出CPU。ESP32-S3的Wi-Fi协议栈任务(wifi、bt、esp_timer等)默认优先级较高(如wifi任务优先级23),若用户任务用vTaskDelay(0)或忙等且优先级接近,会与Wi-Fi任务在同核反复抢占,导致低优先级任务(含IDLE)饿死,触发TWDT。定位方法:开启CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0/1,用esp_task_wdt_print_triggered_tasks或Core Dump查看哪个任务未喂狗;用vTaskGetRunTimeStats看各任务CPU占用。绑核方案:Wi-Fi协议栈默认跑在Core0,建议把用户高负载任务固定到Core1(xTaskCreatePinnedToCore),并让Wi-Fi任务保持Core0;同时把用户任务优先级设在Wi-Fi任务之下,避免反向抢占。若必须同核,确保用户任务有阻塞点(vTaskDelay、队列、信号量),不要用空循环。最后把TWDT超时从默认5s适当放宽并给关键任务显式喂狗,但根治仍是绑核+合理优先级。
mcuku 阿沐 · 2026-09-17