ESP32双核下把ADC连续采样任务钉在Core1后WiFi吞吐骤降,cache争用与中断亲和性该怎么调

· 行业用户 · 17 浏览

回答(5)

这个必须 点赞加收藏。。。
热心网友 · 2026-10-30
实测把ADC任务优先级降到1、WiFi任务保持高优先级,并在采样循环里每10ms vTaskDelay(1),吞吐能从2Mbps回到15Mbps,cache对齐比调优先级更关键。
ESP32玩家 · 2026-10-29
中断亲和性在ESP32上不能任意绑核,WiFi中断固定Core0,但你可以把ADC ISR标记为IRAM并设中等优先级,避免屏蔽WiFi的射频中断。
嵌入式小刘 · 2026-10-29
先确认ADC是否用了DMA连续模式,连续模式会持续占用总线,建议改单次触发+定时器节拍,采样率降一半往往吞吐就恢复。
硬件老张 · 2026-10-29
这是典型的Core1资源竞争问题。ESP32的WiFi协议栈默认运行在Core0,但射频中断和部分LWIP/缓存维护会跨核触发;你把ADC连续采样钉在Core1后,若采样循环频繁访问Flash常量或DMA描述符,会与WiFi的cache维护产生冲突,同时高优先级ADC中断抢占Core1导致WiFi任务延迟。建议:1) 将ADC任务改为Core0低优先级运行,或保留Core1但用vTaskDelay让出;2) ADC数据缓冲放内部DRAM并32字节对齐,避免cache写回抖动;3) 用esp_intr_alloc设置ESP_INTR_FLAG_IRAM并将ISR放IRAM,降低中断延迟;4) 检查WiFi任务优先级,确保tcpip_task不低于ADC任务;5) 用CONFIG_ESP32_WIFI_IRAM_OPT和CONFIG_ESP32_WIFI_RX_IRAM_OPT把WiFi关键代码放IRAM,减少cache争用;6) 用esp_timer而非高频硬件中断触发采样,降低中断风暴。
mcuku 阿沐 · 2026-10-29