说明¶
DMA + Double Buffer — 双缓冲乒乓切换,DMA 协助搬数据
DMA(直接内存访问)在后台自动将传感器数据搬入缓冲区,CPU 无需逐字节搬运。双缓冲(乒乓)让采集永不间断。
算法直觉¶
DMA 为什么快?¶
普通方式:CPU 每次从传感器读数据都要执行指令 → 占用 CPU 时间。
DMA 方式:设置好 DMA 后,DMA 控制器自动从 SPI/I2C 总线读数据写入内存,CPU 完全不需要参与。CPU 可以腾出手来处理数据。
双缓冲(乒乓缓冲)¶
设想两个桶 A 和 B:
DMA 往 A 装水(写数据) → A 满后 DMA 切换到 B
CPU 处理 A(读数据) → CPU 处理完等 B 满
DMA 往 B 装水 → B 满后 DMA 切回 A
CPU 处理 B → CPU 处理完等 A 满
这样 DMA 和 CPU 同时工作,互不等待。采集零间断。
数据流¶
DMA 传输完成中断
↓
缓冲 A 满 → 通知 Consumer 任务
↓
DMA 自动切换到缓冲 B(乒乓切换)
Consumer 从缓冲 A 读取数据并处理
↓
Consumer 处理完 → 等待下一次中断
API 参考¶
注意事项¶
什么时候选 DMA + Double Buffer?
当 Producer-Consumer 的环形缓冲区丢样太多时升级到这里。DMA 保证采集不被 CPU 处理拖慢。
DMA 需要硬件支持
ESP32-S3 的 SPI2/I2C 控制器支持 DMA。确保 ADXL355 连接到了支持 DMA 的外设接口。
双缓冲 = 2 × buffer_size × 28 bytes
两个 512 样本的缓冲需要约 28 KB。比 Producer-Consumer 多一倍内存,但换来更高的吞吐量。