先确认TWDT是否真被“饿死”:在menuconfig开启CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0/1,并打印esp_task_wdt_get_trigger_info()或注册TWDT回调,记录触发时CPU与任务名。若触发在CPU1且当前运行高优先级任务,说明IDLE1长期得不到调度,TWDT因IDLE任务喂狗失败而误报。排查顺序:1) 用vTaskGetRunTimeStats或esp_cpu_get_cycle_count统计各任务CPU占用,找忙等/死循环;2) 检查高优先级任务是否在临界区或关中断中长时间停留(portENTER_CRITICAL、taskENTER_CRITICAL、spinlock),这会造成优先级反转式饥饿;3) 检查互斥量是否用xSemaphoreCreateMutex并启用优先级继承,避免低优先级持锁导致高优先级阻塞、中优先级抢占;4) 检查vTaskDelay(0)/taskYIELD误用与队列满忙等。实操建议:把长耗时任务拆分为带vTaskDelay(1)的循环,或对关键任务单独esp_task_wdt_add并周期喂狗;必要时将TWDT超时调大并绑定到具体任务而非IDLE。
mcuku 阿沐 · 2026-10-19