跳转至

TinyMeasurement · 实时采集处理 · DMA 双核架构 — 设计说明

应用层实际采集链

flowchart TB
    T[定时器回调] --> N[通知生产者]
    N --> S[读取 ADXL355]
    S --> B[加锁写入活动缓冲]
    B --> F{缓冲已满?}
    F -->|是| R[标记就绪并切换缓冲]
    R --> C[通知消费者处理与输出]
    F -->|否| N

实现由定时器回调通知生产者任务;生产者唤醒后读取 ADXL355 加速度与温度,将样本写入缓冲区,再通知消费者处理。缓冲切换与共享状态通过锁协调。应用层采样触发不是“DMA 完成中断”;底层 SPI 驱动是否使用 DMA 是另一个层次。

下方旧示意图保留为原设计记录。双缓冲和任务分工帮助重叠采集与处理,但任务仍共享内存、总线、锁和网络资源,不能据此保证无抖动或最高吞吐。验证时应记录实际采样间隔、丢样/覆盖数量、缓冲占用和网络发送耗时。

源码 / Source

DMA + Dual Core — 双核分工:Core0 采集,Core1 处理

ESP32-S3 有两个核心。此架构将采集任务固定在 Core0,处理任务固定在 Core1,通过双缓冲重叠采集与处理。

算法直觉

双核分工

展开历史 DMA 示意(不代表当前触发链)
Core 0 ─── DMA + 采集(中断驱动)
              ↓
        双缓冲切换
              ↓
Core 1 ─── 数据处理 + 阈值检测 + MQTT 输出

双核任务分工如下,仍需协调共享资源:

  • Core0 采集任务:等待定时器通知,读取传感器,填充并切换缓冲
  • Core1 只管算:读取 Core0 填好的缓冲,做特征提取、阈值判断、结果输出

为什么不都在一个核?

单核上采和处理是"串行"的——采一会、算一会、再采一会。如果处理计算量大,采集的间隔就会不均匀(jitter),影响采样定时精度。

双核把采和算**并行化**,但共享锁、总线与调度仍可能影响采集时序。

数据流

展开历史 DMA 示意(不代表当前触发链)
Core0 (采集):
    DMA 中断 → 缓冲切换 → 通知 Core1

Core1 (处理):
    等待通知 → 读取缓冲 → 特征提取 → 阈值检测 → 输出

配置

#define TINY_MEASUREMENT_RT_DMA_DC_BUFFER_SIZE 256       // 每缓冲样本数
#define TINY_MEASUREMENT_RT_DMA_DC_PRODUCER_CORE 0       // Core0 采集
#define TINY_MEASUREMENT_RT_DMA_DC_CONSUMER_CORE 1       // Core1 处理

注意事项

什么时候选 Dual Core?

当其他两种架构都丢样时,这是最后的武器。吞吐改善程度需要在目标负载下实测。

双核需谨慎分配资源

Core1 上如果有其他 WiFi/BLE 任务,可能与处理任务争抢 CPU。建议在 Core1 上只运行处理任务,其他网络任务留给 Core0。