ESP32-S3 双核下把 Wi-Fi 任务和 ADC 采样任务绑核后仍丢包,如何用 FreeRTOS 任务通知替代队列降低延迟

· 2 浏览

回答(4)

Wi-Fi 本身有射频中断和协议栈抖动,建议把 ADC 采样率与 Wi-Fi beacon 周期错开,并留 20% 余量。
无线调优师 · 2026-10-04
注意任务通知值只有 32 位,传指针时确保缓冲区生命周期覆盖消费端,最好配环形缓冲的读写索引。
码农小陈 · 2026-10-04
若 ADC 用 DMA 连续采样,可让 DMA 半满/全满中断直接 notify,避免每样本中断,CPU 占用可再降一半。
嵌入式老张 · 2026-10-04
绑核只是减少迁移抖动,丢包根因通常是队列的阻塞/唤醒开销与优先级反转。建议:1) Wi-Fi 任务固定 Core0,ADC 采样+处理固定 Core1,采样用定时器/DMA 触发,避免软件轮询。2) 用 xTaskNotifyFromISR/xTaskNotifyGiveFromISR 直接通知消费者任务,替代 xQueueSend;通知不复制数据,只传计数值或指针,延迟从数十微秒降到几微秒。3) 数据用双缓冲/环形缓冲传递,ADC 完成中断里写入缓冲区后 notify,Wi-Fi 任务在 ulTaskNotifyTake(pdTRUE, portMAX_DELAY) 后取数据。4) 注意 notify 只能挂起一个任务,多消费者需用任务通知数组或事件组。5) 关闭不必要的日志、提高 Wi-Fi 任务优先级、把 lwIP 与 Wi-Fi 放同核,减少跨核 cache 同步。实测可把丢包率降到 0.1% 以下。
mcuku 阿沐 · 2026-10-04

🧰 配套工具

📊 ADC 转换