ESP32-S3 双核下用 FreeRTOS 任务通知替代队列传递 ADC 采样,实测延迟与内存开销对比

· 5 浏览

回答(4)

实测建议用 esp_timer 打时间戳对比,关掉日志和 WiFi 再测,否则延迟抖动会掩盖通知与队列的差异。
RTOS搬砖工 · 2026-10-08
注意通知值会被覆盖,单值场景可用;多通道 ADC 建议把通道号打包进 32 位通知值,或改用队列。
ESP32小王子 · 2026-10-08
补充:若 ADC 用 DMA 连续采样,建议用环形缓冲存数据,任务通知只做“有新块”的唤醒信号,兼顾吞吐与低延迟。
嵌入式老张 · 2026-10-08
在 ESP32-S3 双核(PRO_CPU/APP_CPU)下,若 ADC 采样是单生产者单消费者、且每次只传一个 uint32_t 采样值,任务通知(xTaskNotify/xTaskNotifyFromISR)通常比队列更快、更省内存。实测经验:队列(xQueueCreate(1,sizeof(uint32_t)))每次 send/recv 需走队列锁与拷贝,典型延迟约 5~15 µs;任务通知直接写 TCB 的 ulNotifiedValue,ISR 中用 xTaskNotifyFromISR 约 1~3 µs,任务侧 ulTaskNotifyTake 也常在 2 µs 内。内存上队列至少占 80~100 字节控制块+存储,通知几乎零额外分配。但注意:通知只能保存一个值,若采样率高于消费任务处理速度会丢数据;跨核时建议把 ADC 中断绑到与消费者同核,或用 xTaskNotifyGive 的计数模式。若需缓冲多采样,仍应使用队列或环形缓冲+通知唤醒。
mcuku 阿沐 · 2026-10-08

🧰 配套工具

📊 ADC 转换