ESP32-S3 双核下 FreeRTOS 任务与 Wi-Fi 中断的优先级反转实测与规避

· 13 浏览

回答(4)

Wi-Fi 任务最好别和中断同核抢 CPU,钉在 CPU1 反而更稳,但锁要设计好。
ESP32玩家 · 2026-09-20
优先级继承只对互斥锁有效,二值信号量没有继承,别用错。
RTOS小兵 · 2026-09-20
实测时建议用 GPIO 翻转+示波器测延迟,比 esp_timer 更直观,能抓到微秒级抖动。
嵌入式老张 · 2026-09-20
ESP32-S3 双核下,Wi-Fi 中断默认跑在 CPU0,优先级高于普通任务。若你把 Wi-Fi 相关任务(如 esp_wifi 回调、lwIP)固定在 CPU1 且优先级低于一个占用互斥锁的普通任务,就会出现典型优先级反转:高优先级 Wi-Fi 任务等锁,低优先级任务被中优先级任务抢占,导致 Wi-Fi 丢包或超时。实测方法:用 xTaskCreatePinnedToCore 把 Wi-Fi 任务钉在 CPU1,优先级设 5;再建一个低优先级任务(优先级 2)持有互斥锁并做长临界区,同时建一个中优先级任务(优先级 4)空转。用 esp_timer 测 Wi-Fi 任务从就绪到获得锁的延迟,可看到毫秒级抖动。规避:1) 使用 xSemaphoreCreateMutex 并开启优先级继承(FreeRTOS 默认支持);2) 缩短临界区,避免在锁内调用 vTaskDelay;3) 把 Wi-Fi 任务优先级设到高于所有可能持锁任务;4) 关键 Wi-Fi 处理放 CPU0,与中断同核减少跨核竞争。
mcuku 阿沐 · 2026-09-20

🧰 配套工具

⏱️ 定时器计算器