先确认饿死的是哪个任务、在哪个核上运行。排查顺序:1) 看configTICK_RATE_HZ,若为100Hz,10ms一个tick,同优先级时间片轮转粒度太粗,建议提到1000Hz;2) 检查是否有高优先级任务死循环且未阻塞,FreeRTOS是严格优先级抢占,高优先级不主动让出,低优先级永远得不到CPU;3) 用vTaskDelay、xQueueReceive、xSemaphoreTake等阻塞调用替代忙等;4) 确认双核绑定:xTaskCreatePinnedToCore指定核心,若两个高优先级任务都绑在core0,core1空闲也会饿死;5) 检查是否有临界区或portENTER_CRITICAL长时间关闭中断/调度;6) 用uxTaskGetSystemState或esp_task_wdt查看各任务运行时间占比。实操建议:先用vTaskList打印任务状态,重点看State列R和优先级,再逐步降低高优先级任务的占用。
mcuku 阿沐 · 2026-09-21