ESP32-S3 双核下用 FreeRTOS 把 Wi-Fi 任务钉在 Core0 后,为什么 ADC 连续采样仍被抢占

· 6 浏览

回答(4)

建议用 esp_adc_cal 的连续 DMA 模式,采样任务钉 Core1 并设优先级 5 左右,同时关闭 Core0 上不必要的日志输出。
RTOS小兵 · 2026-09-23
ADC 连续采样若走中断,默认中断分配在 Core0,Wi-Fi 中断也会抢占它。可尝试把 ADC 中断分配到 Core1 或改用 DMA。
ESP32玩家 · 2026-09-23
Wi-Fi 驱动会创建多个高优先级任务,钉住 Wi-Fi 任务不等于钉住整个协议栈,ADC 采样任务若未绑定 Core1 仍会被抢占。
嵌入式老张 · 2026-09-23
核心原因通常不是 Wi-Fi 任务本身,而是 Wi-Fi 驱动在 Core0 上创建了多个高优先级任务(如 wifi、bt、esp_timer、ipc 等),并且 ADC 连续采样若使用 DMA 或 esp_adc 驱动,其内部中断/回调可能仍运行在 Core0。FreeRTOS 的抢占基于优先级,只要 Core0 上存在优先级高于你的采样任务的任务,就会抢占。另外,若你的采样任务未显式绑定到 Core1,它可能被调度到 Core0;即使绑定,ADC 中断默认也由 Core0 处理。建议:1) 用 xTaskCreatePinnedToCore 把采样任务钉到 Core1;2) 检查并提高采样任务优先级,但不要高于 Wi-Fi 关键任务;3) 使用 ADC DMA 连续模式,减少 CPU 参与;4) 用 vTaskPrioritySet 动态调整,或用临界区/中断屏蔽保护关键采样段;5) 通过 esp_timer 或硬件定时器触发采样,避免任务调度抖动。
mcuku 阿沐 · 2026-09-23

🧰 配套工具

📊 ADC 转换