ESP32-S3 双核下用 FreeRTOS 任务通知替代队列传递 ADC 采样值的延迟实测对比

· 3 浏览

回答(4)

队列可传结构体并缓存多帧,通知只能传一个32位值;若需传时间戳+采样值,可打包成64位用xTaskNotify,但需处理溢出。
RTOS小兵 · 2026-10-03
双核下跨核唤醒有额外IPI开销,实测跨核通知约2.5µs,同核仅1.2µs;建议ADC任务与处理任务绑同核,或改用共享内存+自旋锁。
ESP32玩家 · 2026-10-03
若ADC由ISR触发,用vTaskNotifyGiveFromISR比xQueueSendFromISR快约2µs,但注意通知值会被覆盖,适合只关心最新值的场景。
嵌入式老张 · 2026-10-03
在ESP32-S3双核(240MHz)实测中,任务通知(xTaskNotifyGive/xTaskNotifyWait)比队列(xQueueSend/xQueueReceive)在ADC采样值传递上延迟更低。测试条件:ADC连续采样(DMA或定时器触发),采样任务固定Core1,处理任务固定Core0,优先级相同,关闭WiFi/BT。单次传递延迟:任务通知约1.2~2.5µs,队列约3.5~6µs,差异主要来自队列的拷贝、链表操作和互斥锁。若ADC值仅一个uint32_t且一对一传递,优先用任务通知;若需多生产者/多消费者或缓存多个样本,则用队列或环形缓冲+通知。注意:xTaskNotifyGive是轻量级二值信号,会合并通知,不适合计数场景;需计数用xTaskNotify(带eIncrement)或ulTaskNotifyTake。实测建议用GPIO翻转+示波器测量,避免逻辑分析仪采样率不足。
mcuku 阿沐 · 2026-10-03

🧰 配套工具

📊 ADC 转换