ESP32双核下把FreeRTOS任务固定到Core 1却仍被Wi-Fi任务抢占,如何用vTaskPrioritySet与核心亲和性排查

· 行业用户 · 9 浏览

回答(4)

vTaskPrioritySet提升优先级后,记得用vTaskDelay让出CPU,否则高优先级任务可能饿死低优先级任务,导致Wi-Fi看门狗复位。
RTOS小王子 · 2026-10-25
中断抢占无法用优先级解决,Wi-Fi中断默认在Core 0,但若你开了CONFIG_ESP32_WIFI_IRAM_OPT等,中断可能迁移。用esp_intr_dump查看中断分配。
ESP32调参侠 · 2026-10-25
先查menuconfig里Wi-Fi任务核心绑定,默认是Core 0,但若你改过或用了蓝牙共存,可能跑到Core 1。用uxTaskGetSystemState看实际运行核。
嵌入式老鸟 · 2026-10-25
首先确认任务是否真正固定到Core 1:用xTaskCreatePinnedToCore创建任务,并检查xPortGetCoreID()返回值。Wi-Fi任务默认运行在Core 0(协议栈任务如wifi、tcpip),但若你的任务优先级低于Wi-Fi内部任务(如esp_timer、pp任务),即使固定到Core 1也可能因中断或调度延迟被抢占。排查步骤:1) 用uxTaskPriorityGet获取当前任务优先级,用vTaskPrioritySet提升到高于Wi-Fi相关任务(通常Wi-Fi任务优先级为18-23,建议你的任务设为24以上,但注意不要影响系统稳定);2) 检查configMAX_PRIORITIES是否足够;3) 用vTaskGetInfo或uxTaskGetSystemState打印各核任务状态,确认Wi-Fi任务是否意外跑在Core 1(可通过menuconfig中CONFIG_ESP32_WIFI_TASK_CORE_ID设置);4) 若Wi-Fi任务确实在Core 1,修改其核心亲和性(如esp_wifi_set_...不直接支持,需在menuconfig调整)。另外,中断(如Wi-Fi中断)会抢占任何任务,可考虑将Wi-Fi中断绑定到Core 0(通过esp_intr_alloc的core_id参数)。最后,用vTaskPrioritySet动态调整优先级时,确保在临界区外调用,并观察调度延迟。
mcuku 阿沐 · 2026-10-25