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

· 行业用户 · 7 浏览

回答(4)

flash擦写期间会关中断,若在任务里频繁nvs_commit,TWDT和中断延迟都会异常,建议挪到低优先级任务并加延时。
ESP32玩家 · 2026-10-31
用esp_timer回调翻转GPIO测中断延迟最直观,注意别在ISR里打印,串口本身就会拖长执行时间。
码农小李 · 2026-10-31
先看panic时打印的task名和core id,十有八九是某个高优先级任务死循环没让出CPU,别一上来就怀疑中断。
嵌入式老张 · 2026-10-31
先确认TWDT配置:menuconfig中Task Watchdog Timeout、Idle Task Watchdog使能情况,以及是否对特定任务调用esp_task_wdt_add。误触发常见根因是idle任务饥饿而非中断延迟。定位步骤:1) 在TWDT回调或panic前打印pcTaskGetName(NULL)与xPortGetCoreID,确认哪个核的idle被饿死;2) 用vTaskGetRunTimeStats或esp_timer统计各任务CPU占用,找出长时间不让出CPU的任务(常见为while(1)无vTaskDelay、高优先级任务忙等);3) 检查临界区:taskENTER_CRITICAL/portENTER_CRITICAL过长会同时屏蔽调度和中断,用GPIO翻转+示波器测量临界区时长;4) 中断延迟用高优先级定时器中断打时间戳,与预期周期比较,若延迟大则排查ISR过长、中断嵌套、flash操作(spi_flash写入会关中断);5) 双核场景确认任务绑定核:xTaskCreatePinnedToCore,避免两核高优先级任务同时挤压同一idle。修复优先给idle喂狗或降低忙等任务优先级,并缩短临界区。
mcuku 阿沐 · 2026-10-31

🧰 配套工具

⏱️ 定时器计算器