跳转至

说明

Producer-Consumer — 环形缓冲区解耦采集与处理

默认架构。采集任务(Producer)往环形缓冲区写数据,处理任务(Consumer)周期性从缓冲区读数据。采得快、处理得慢时,数据在缓冲区排队。

算法直觉

环形缓冲区 = 自行车链条

想象你(Producer)在一边不停地往链条上挂货,另一个人(Consumer)从链条上取货处理。链条就是环形缓冲区。

关键点:

  • Producer 永远不停——即使 Consumer 还没处理完上一批
  • Consumer 每隔一段时间(默认 50 ms)取最近 N 个样本做一次处理
  • 如果 Consumer 处理不过来,新数据覆盖旧数据(而不是阻塞 Producer)

缓冲区大小的权衡

缓冲区大 → 能存更多历史数据 → 抗突发能力更强
         → 占用更多内存

缓冲区小 → 省内存
         → Consumer 跟不上时丢数据更快

默认 CIRCULAR_BUFFER_SIZE = 512,每个样本 28 bytes → 总共 14 KB。在 ESP32-S3 上合理。

数据流

Producer 任务(高优先级)
    每个采样间隔:
        读取 ADXL355
        写入环形缓冲区
        ─────────────────
Consumer 任务(每 50 ms 唤醒一次)
        从缓冲区读最近 N 个样本
        做阈值检测 / 特征提取
        输出结果

API 参考

// 配置(通过 rt_process_config_t 传入)
#define TINY_MEASUREMENT_RT_PC_CIRCULAR_BUFFER_SIZE 512      // 缓冲区大小
#define TINY_MEASUREMENT_RT_PC_CONSUMER_PROCESS_INTERVAL_MS 50  // 处理间隔
#define TINY_MEASUREMENT_RT_PC_CONSUMER_PROCESS_SAMPLE_COUNT 10 // 每次处理最近 N 个样本

注意事项

什么时候选 Producer-Consumer?

默认值就是安全值。除非你有特殊的实时性要求(Consumer 处理间隔需要 < 50 ms),否则保持默认。

Consumer 处理时间不能超过采样间隔

如果 Consumer 处理一次的时间比 Producer 填满缓冲区的时间还长,系统会持续丢数据。此时应: - 减少 CONSUMER_PROCESS_SAMPLE_COUNT(每次少处理几个样本) - 换 DMA + Dual Core 架构