ESP32-S3 双核下 FreeRTOS 任务被长期饿死:从 tick、优先级到核心绑定的排查路径

· 1 浏览

回答(4)

用esp_timer或GPIO翻转测任务实际执行间隔,比看日志更直观,能快速区分是没调度还是调度了但执行慢。
深夜调板人 · 2026-09-21
双核下建议把WiFi/BT协议栈任务和用户任务分核绑定,协议栈任务优先级通常很高,绑同核会直接压死应用任务。
乐鑫搬砖工 · 2026-09-21
别忘了看configUSE_TIME_SLICING,若为0,同优先级任务不会轮转,一个跑完才轮到下一个,很容易误判为饿死。
嵌入式老张 · 2026-09-21
先确认饿死的是哪个任务、在哪个核上运行。排查顺序: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