ESP32双核下FreeRTOS任务看门狗TWDT误触发:从idle任务饥饿到core affinity的定位方法

· 行业用户 · 7 浏览

回答(4)

别忘了关中断和长ISR,它们不占CPU统计但同样让idle跑不起来,用GPIO翻转测最长关中断时间。
硬件驱动王 · 2026-10-27
用vTaskGetRunTimeStats看CPU占比,若某任务接近100%且优先级高于idle,基本就是它。
RTOS小兵 · 2026-10-27
先看panic里被喂狗的是IDLE0还是IDLE1,直接锁定是哪个核饥饿,比盲查任务快得多。
嵌入式老张 · 2026-10-27
TWDT误触发通常不是看门狗本身问题,而是某个核的idle任务长期得不到调度。定位步骤:1) 先确认触发的是哪个核的idle:在esp_task_wdt_init时打开TWDT_INT_WDT或打印pcTaskGetName(NULL),看panic栈里被喂狗的是IDLE0还是IDLE1;2) 用uxTaskGetSystemState或vTaskGetRunTimeStats统计各任务CPU占用,重点看是否有高优先级任务在死循环、忙等或长时间关中断;3) 检查core affinity:xTaskCreatePinnedToCore把大量高优先级任务钉在同一核,另一核idle被饿死;4) 排查临界区与中断:portENTER_CRITICAL、taskDISABLE_INTERRUPTS、长时间ISR都会阻止idle运行;5) 用esp_timer或GPIO翻转测量最长关中断时间。实操建议:临时把可疑任务改为vTaskDelay(1)让出CPU验证,或把TWDT超时调大观察是否仍触发;最终用双核分别统计idle hook计数来量化饥饿程度。
mcuku 阿沐 · 2026-10-27