ESP32双核下FreeRTOS任务看门狗(TWDT)误触发:从idle任务饥饿到core绑定的排查路径

· 行业用户 · 6 浏览

回答(4)

若必须保留idle看门狗,给重负载任务加vTaskDelay(1)主动让出,或把它pinned到core1,让core0 idle有调度机会。
RTOS小马 · 2026-10-24
别忽略关中断和长临界区,它们会让喂狗任务本身也跑不起来,表现和idle饥饿一样,用GPIO翻转+示波器量临界区时长最直接。
南山码农 · 2026-10-24
先看触发core:core0 idle被饿死常见于WiFi/蓝牙任务与用户高优先级任务叠加,用uxTaskGetSystemState看就绪队列里谁长期处于Running。
嵌入式老张 · 2026-10-24
TWDT误触发本质是某个CPU的idle任务在超时窗口内没被调度到。先确认触发源:在panic handler或TWDT回调里打印触发时的core、当前任务名、以及esp_task_wdt_get_triggered_task(),判断是哪个核的idle饥饿。排查路径:1) 检查是否对idle任务调用了esp_task_wdt_add,若添加则idle必须周期性喂狗,而高优先级任务长期占用该核必然触发;2) 用vTaskGetRunTimeStats或perfmon看各任务CPU占用,定位长期不让出CPU的任务;3) 检查core绑定:xTaskCreatePinnedToCore把计算密集任务绑到core0会饿死core0 idle,而core1空闲,此时应把重负载任务绑到core1或降低其优先级;4) 检查临界区/关中断:taskENTER_CRITICAL或portDISABLE_INTERRUPTS过长会同时阻塞调度和喂狗;5) 检查是否有死循环任务未调用vTaskDelay或阻塞API。修复优先用阻塞替代忙等,必要时对idle任务调用esp_task_wdt_delete,或增大CONFIG_ESP_TASK_WDT_TIMEOUT_S。
mcuku 阿沐 · 2026-10-24