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

· 行业用户 · 5 浏览

回答(4)

别忘了检查 menuconfig 中 CONFIG_FREERTOS_UNICORE 是否被误开,以及是否用了 esp_timer 回调在 PRO_CPU 上跑高优先级任务。
ESP32玩家 · 2026-11-03
提升优先级只能解决抢占,不能解决 WiFi 任务在 PRO_CPU 上周期性唤醒带来的抖动,关键时序建议放 APP_CPU 或改用中断+队列。
RTOS小兵 · 2026-11-03
用 vTaskGetInfo 或 uxTaskGetSystemState 导出所有任务的核心与优先级快照,能直接看到 WiFi 任务实际落在哪个核、优先级多少,比猜更可靠。
嵌入式老张 · 2026-11-03
先确认两点:1) xTaskCreatePinnedToCore 的 coreID 是否真的设为0(PRO_CPU),且创建后未被 tskNO_AFFINITY 覆盖;2) WiFi 任务(wifi、tiT、ppTask 等)默认优先级通常为 18~23,若你的任务优先级低于它们,即使绑定同核也会被抢占。排查步骤:用 uxTaskPriorityGet(NULL) 打印当前任务优先级,用 xPortGetCoreID() 确认运行核;再调用 vTaskPrioritySet(NULL, 目标优先级) 动态提升到高于 WiFi 任务(如 24),观察是否仍被抢占。若提升后正常,说明是优先级问题而非亲和性失效。注意 WiFi 协议栈任务由 ESP-IDF 内部创建,部分任务亲和性为 tskNO_AFFINITY,会迁移到任意核,无法完全屏蔽;高优先级任务长时间占用 PRO_CPU 还会导致 WiFi 看门狗超时,建议用临界区或事件驱动而非纯忙等。
mcuku 阿沐 · 2026-11-03