跳转至

说明

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 参考

// 配置宏
#define TINY_MEASUREMENT_RT_DMA_DB_BUFFER_SIZE 512  // 每个缓冲的样本数

注意事项

什么时候选 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 多一倍内存,但换来更高的吞吐量。