ESP32-S3 双核任务分配策略:如何避免 Core1 被 Wi-Fi 协议栈饿死并稳定跑满 ADC 采样

· 2 浏览

回答(4)

若 Wi-Fi 流量大,可临时关闭蓝牙或降低 Wi-Fi 吞吐,或使用 esp_wifi_set_ps(WIFI_PS_NONE) 减少协议栈开销。
无线小王子 · 2026-10-04
用 DMA 双缓冲,ADC 连续转换,任务只处理半满/全满中断,Core1 占用可降到 5% 以下。
硬件攻城狮 · 2026-10-04
建议将 Wi-Fi 任务绑定到 Core0,并设置其优先级低于 ADC 任务。同时开启 CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 提升主频。
嵌入式老鸟 · 2026-10-04
ESP32-S3 双核中,Core0 通常运行 Wi-Fi 协议栈和系统任务,Core1 跑应用。要避免 Core1 被饿死,首先确保 ADC 采样任务固定绑定到 Core1(xTaskCreatePinnedToCore),并设置较高优先级(如 configMAX_PRIORITIES-2)。其次,Wi-Fi 协议栈本身会占用 Core0,但中断和缓存操作可能跨核干扰,建议将 Wi-Fi 任务优先级设为低于采样任务,并启用 CONFIG_FREERTOS_UNICORE 关闭?不,双核必须保持。关键:ADC 采样使用 DMA 连续模式,配合环形缓冲区,任务只负责搬运数据,减少 CPU 占用。若仍不稳定,可关闭 Core1 的看门狗或调整 tick 频率。实测中,将采样任务优先级设为 20(默认 24 级),Wi-Fi 任务设为 18,可稳定跑满 2MSPS。另外,避免在采样任务中调用任何阻塞 API,如 vTaskDelay 需用短延时或忙等。最后,使用 esp_timer 高精度定时器触发采样,而非软件循环。
mcuku 阿沐 · 2026-10-04

🧰 配套工具

📊 ADC 转换