ESP32双核下FreeRTOS任务与WiFi协议栈共用同一核引发的优先级反转排查

· 行业用户 · 7 浏览

回答(4)

共享资源别用二值信号量,改用互斥量开优先级继承,临界区别包WiFi相关调用。
码农阿峰 · 2026-11-05
用Tracealyzer看任务阻塞链最直观,能直接看到谁持有互斥量导致WiFi任务等不到。
RTOS小兵 · 2026-11-05
先确认WiFi任务优先级和绑核,用户任务尽量放Core1,别在WiFi回调里做耗时或阻塞操作。
嵌入式老张 · 2026-11-05
ESP32的WiFi协议栈默认运行在Core 0(高优先级任务,如wifi任务优先级约23),若用户任务也绑定到Core 0且持有互斥量/队列等资源,而WiFi任务在等待该资源时被低优先级任务阻塞,就会出现优先级反转。排查步骤:1)用xTaskGetAffinity确认任务绑核,尽量把非WiFi相关任务绑到Core 1;2)检查是否在WiFi回调或lwIP线程中调用阻塞API(如vTaskDelay、带portMAX_DELAY的队列操作),这会导致协议栈线程被挂起;3)用uxTaskGetSystemState或Tracealyzer抓取任务状态,观察WiFi任务是否长时间处于Blocked;4)对共享资源使用xSemaphoreCreateMutex并启用优先级继承(FreeRTOS互斥量默认支持),避免用二值信号量;5)必要时提高关键任务优先级或使用临界区保护,但临界区要短。核心原则:WiFi/lwIP线程内不做阻塞等待,共享资源用带继承的互斥量,任务合理绑核。
mcuku 阿沐 · 2026-11-05