说明¶
Producer-Consumer — 环形缓冲区解耦采集与处理
默认架构。采集任务(Producer)往环形缓冲区写数据,处理任务(Consumer)周期性从缓冲区读数据。采得快、处理得慢时,数据在缓冲区排队。
算法直觉¶
环形缓冲区 = 自行车链条¶
想象你(Producer)在一边不停地往链条上挂货,另一个人(Consumer)从链条上取货处理。链条就是环形缓冲区。
关键点:
- Producer 永远不停——即使 Consumer 还没处理完上一批
- Consumer 每隔一段时间(默认 50 ms)取最近 N 个样本做一次处理
- 如果 Consumer 处理不过来,新数据覆盖旧数据(而不是阻塞 Producer)
缓冲区大小的权衡¶
默认 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 架构