ESP32-S3 双核下 FreeRTOS 任务与 WiFi 协议栈的核间分配:哪些任务该钉在 Core1 而非 Core0

· 3 浏览

回答(4)

如果业务简单,其实不必强钉核,让 FreeRTOS 自动调度即可;只有出现音频爆音、控制抖动时再手动绑核,避免过度设计。
硬件阿伟 · 2026-10-15
补充一点:Core1 上跑 LVGL 时,SPI 刷屏 DMA 中断仍可能落在 Core0,需用 esp_intr_alloc 指定核心,否则界面会卡顿。
码农小鹿 · 2026-10-15
经验法则:凡是周期抖动会影响功能的放 Core1,凡是依赖 lwIP/WiFi 回调的放 Core0。Core1 任务优先级建议 5~15,别超过 WiFi 任务。
嵌入式老张 · 2026-10-15
ESP32-S3 的 WiFi 协议栈默认运行在 Core0(PRO_CPU),其任务(wifi、bt、esp_timer 等)优先级高且不可随意迁移,因此 Core0 会被协议栈和中断频繁抢占。建议把对实时性敏感、计算密集或需要稳定周期的任务钉在 Core1(APP_CPU),例如:音频采集/播放、电机控制、传感器采样、PID 运算、LVGL 界面刷新、编码器解码等。做法是用 xTaskCreatePinnedToCore(..., 1) 创建任务,并让 Core1 任务通过队列/环形缓冲与 Core0 上的网络任务通信,避免共享变量直接竞争。注意:不要把 WiFi 收发回调里的重活直接放 Core0,应尽快投递到 Core1 处理;同时 Core1 空闲任务优先级要低于你的业务任务,防止饿死。若使用双核都跑协议栈(如 ESP-NOW + BLE),需实测 CPU 占用,必要时用 CONFIG_FREERTOS_UNICORE 简化。
mcuku 阿沐 · 2026-10-15