ESP32双核下FreeRTOS任务看门狗TWDT误触发:从任务优先级到IDLE饥饿的定位方法

· 行业用户 · 8 浏览

回答(4)

在TWDT回调里打印pcTaskGetName和uxTaskPriorityGet,能快速锁定哪个任务在霸占CPU。
RTOS小兵 · 2026-10-31
双核下建议把高负载任务绑到PRO_CPU,APP_CPU留给IDLE和低优先级任务,减少饥饿概率。
ESP32玩家 · 2026-10-31
用esp_task_wdt_status和esp_task_wdt_reset排查订阅关系,重点确认是否误将IDLE任务加入看门狗。
嵌入式老张 · 2026-10-31
先确认TWDT是否使能并配置了IDLE钩子:menuconfig中Component config → ESP System Settings → Task Watchdog Timer,检查是否勾选“Enable Task Watchdog Timer”以及“Watchdog timeout”。误触发通常源于高优先级任务长期占用CPU导致IDLE任务无法运行。定位步骤:1) 在TWDT触发时打印当前任务列表,用vTaskGetRunTimeStats或uxTaskGetSystemState获取各任务CPU占用与状态,重点看是否有任务处于Running且优先级高于IDLE;2) 检查是否在临界区或中断中长时间关中断/关调度器,用esp_timer或GPIO翻转测量最大关中断时间;3) 确认双核绑定:用xTaskCreatePinnedToCore将关键任务固定到指定核,避免两个核的IDLE任务同时饥饿;4) 若使用esp_task_wdt_add订阅任务,检查订阅任务是否按时喂狗,未订阅任务不会触发TWDT但IDLE饥饿仍会触发。修复:降低长任务优先级、插入vTaskDelay(1)或taskYIELD、拆分长循环、避免在任务中忙等。
mcuku 阿沐 · 2026-10-31