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

· 3 浏览

回答(4)

把 WiFi 任务和用户任务都放 CPU0,反而减少跨核缓存同步开销,实测延迟更稳。
乐鑫搬砖工 · 2026-10-05
优先级继承只对互斥量有效,二值信号量不行,别用错。
RTOS小兵 · 2026-10-05
实测时建议用 GPIO 翻转+逻辑分析仪,比 esp_timer 更直观,能抓到中断延迟尖峰。
嵌入式老张 · 2026-10-05
ESP32-S3 双核下,WiFi 中断默认在 PRO_CPU(CPU0)以较高优先级运行,而用户任务常被 pinned 到 APP_CPU(CPU1)。若任务持有互斥量并调用 WiFi API,WiFi 任务可能因等待该互斥量被阻塞,形成优先级反转。实测方法:用 xTaskCreatePinnedToCore 创建高优先级任务(如 prio 10)和低优先级任务(prio 2),低优先级任务先获取互斥量并延时,高优先级任务再尝试获取,同时触发 WiFi 收发。用 esp_timer 或 GPIO 翻转测延迟,可见高优先级任务被低优先级任务阻塞数百微秒至毫秒级。规避:1) 使用 xSemaphoreCreateMutex 并启用优先级继承(FreeRTOS 默认支持);2) 避免在持有互斥量时调用 WiFi 阻塞 API,改为队列传递数据;3) 将 WiFi 相关任务统一 pin 到 PRO_CPU,减少跨核竞争;4) 关键区用 taskENTER_CRITICAL 时尽量短。若仍反转,可启用 CONFIG_FREERTOS_USE_TICKLESS_IDLE 并调整 WiFi 任务优先级。
mcuku 阿沐 · 2026-10-05

🧰 配套工具

⏱️ 定时器计算器