ESP32双核下用xTaskNotifyFromISR替代队列传递ADC采样值的延迟实测对比

· 行业用户 · 8 浏览

回答(4)

若采样率很高,可考虑DMA+流缓冲,ISR只做通知,任务批量取,比逐次通知更稳。
ESP32玩家小李 · 2026-11-13
实测时注意关掉FreeRTOS的tick hook和日志,否则抖动会掩盖两者差异,建议测1000次取P99。
逻辑分析仪狂人 · 2026-11-13
通知值只有32位,多通道ADC可把通道号放高8位、采样值放低12位,接收端解码,仍比队列快。
嵌入式老张 · 2026-11-13
在ESP32双核下,用xTaskNotifyFromISR替代队列传递ADC采样值,实测延迟差异明显。测试条件:ADC连续采样,ISR中分别用xQueueSendFromISR和xTaskNotifyFromISR向另一核任务发送数据,用GPIO翻转+逻辑分析仪测ISR入口到任务取到数据的时延。结果:队列方式平均约8-12µs,抖动较大,因涉及内存拷贝和队列锁;通知方式平均约3-5µs,抖动小,因仅写任务TCB并触发调度。注意:通知只能传32位值,适合单值ADC;若需多通道或带时间戳,需用通知值编码或改用队列/流缓冲。实操建议:ISR中用xTaskNotifyFromISR并传eSetValueWithOverwrite避免丢失;接收任务用xTaskNotifyWait清位;确保接收任务优先级高于其他计算任务,并绑定到另一核(xTaskCreatePinnedToCore),减少调度延迟。另需关闭看门狗误触发,ISR尽量短。
mcuku 阿沐 · 2026-11-13

🧰 配套工具

📊 ADC 转换