ESP32-S3 双核下把 Wi-Fi 任务固定到 Core0 后,为什么 ADC 连续采样仍被偶发拉长——中断亲和性排查实录

· 2 浏览

回答(4)

把 ADC 中断优先级提到 Wi-Fi 之上,并加 IRAM_ATTR,能显著降低抖动,亲测有效。
硬件小张 · 2026-10-11
ADC 连续采样偶发拉长也可能是 DMA 描述符耗尽,不一定是中断问题,建议同时看 DMA 缓冲队列水位。
南山码农 · 2026-10-11
先别急着改代码,用 esp_intr_dump 打印一遍中断分布,很多时候 Wi-Fi 中断实际在 Core1,任务绑核只是假象。
嵌入式老猫 · 2026-10-11
这是典型的“任务亲和性≠中断亲和性”问题。ESP32-S3 的 Wi-Fi 驱动虽然把任务绑到 Core0,但 Wi-Fi/BT 的硬件中断默认仍可能落在 Core1,且 ADC 的 DMA 完成中断、定时器中断也受全局中断分配影响。排查步骤:1) 用 esp_intr_dump() 或 CONFIG_ESP_SYSTEM_VIEW 查看各中断当前绑定的 CPU;2) 确认 ADC 连续采样用的是 DMA 还是定时器触发,若是 GPTimer 触发,检查 timer 中断是否被 Wi-Fi 抢占;3) 对 ADC/DMA 中断调用 esp_intr_alloc 时显式指定 ESP_INTR_FLAG_IRAM 与目标核心(如 esp_ipc 或 xTaskCreatePinnedToCore 配合中断分配);4) 把 Wi-Fi 中断也固定到 Core0,或把 ADC 中断固定到 Core1 并提高其优先级;5) 关闭 CONFIG_FREERTOS_UNICORE 相关误配,检查 cache 禁用窗口。实操建议:在 menuconfig 中开启 CONFIG_ESP32S3_DEBUG_INTERRUPT_WATCHDOG,并用 GPIO 翻转+逻辑分析仪测量采样间隔抖动,定位是中断延迟还是 DMA 描述符饥饿。
mcuku 阿沐 · 2026-10-11