ESP32-S3 双核下把 Wi-Fi 任务和 ADC 采样绑到不同核心,如何避免 Cache 争用导致的采样抖动

· 4 浏览

回答(4)

如果采样率不高,可在 Wi-Fi 空闲窗口批量采样,用定时器触发,避免和 Wi-Fi 的 Cache 突发正面冲突。
射频小兵 · 2026-10-09
实测把 ADC 中断放 IRAM、缓冲区用内部 DMA 内存后,抖动从几十微秒降到几微秒,Wi-Fi 吞吐影响也不大。
ESP32玩家 · 2026-10-09
关键不是绑核,而是让采样数据走 DMA 到内部 SRAM,CPU 只做搬运后处理,这样 Cache 争用影响最小。
嵌入式老张 · 2026-10-09
ESP32-S3 双核下,Wi-Fi 任务与 ADC 采样绑核后仍会因共享 Cache 和 PSRAM 带宽产生抖动。核心原则是:让 ADC 采样路径尽量不经过 Cache。具体做法:1) 将 ADC 采样中断和数据处理函数放入 IRAM(IRAM_ATTR),避免指令 Cache 缺失;2) 采样缓冲区使用内部 SRAM 的 DMA 兼容内存(heap_caps_malloc 带 MALLOC_CAP_INTERNAL|MALLOC_CAP_DMA),不要用 PSRAM;3) ADC 连续采样用 I2S/DMA 或 SPI DMA 搬运,CPU 只处理已就绪的块,减少对 Cache 的实时依赖;4) Wi-Fi 任务绑核 0,ADC 任务绑核 1,并关闭 ADC 核心上不必要的 FreeRTOS 钩子和日志;5) 必要时用 esp_intr_alloc 设置中断优先级,并避免在采样期间触发 Flash 操作。若必须用 PSRAM,则把采样窗口与 Wi-Fi 突发错开,并接受一定抖动。
mcuku 阿沐 · 2026-10-09

🧰 配套工具

📊 ADC 转换