说明¶
RT Processing — 三种实时处理架构,编译期选择
提供三种采集与处理的并发架构,通过编译期宏 RT_PROCESS_ARCH_TYPE 切换。每种架构在吞吐量、实时性和复杂度间做了不同的权衡。
算法直觉¶
为什么需要实时处理架构?¶
在线/离线采集只管"拿数据",不管"处理数据"。实时处理架构在采集的同时,立即对数据做分析(如阈值检测、特征提取),并在采集到异常时马上响应。
核心挑战:采集速度 > 处理速度时,数据会堆积、丢失。架构的设计目标就是解决这个问题。
架构选择指南¶
| 架构 | 宏 | 核心思想 | 最大吞吐 | 适用场景 |
|---|---|---|---|---|
| Producer-Consumer | RT_ARCH_PRODUCER_CONSUMER | 环形缓冲区解耦采和处理 | 中等 | 默认,通用 |
| DMA + Double Buffer | RT_ARCH_DMA_DOUBLE_BUFFER | DMA 搬数据,CPU 专注于处理 | 高 | 高速采集 |
| DMA + Dual Core | RT_ARCH_DMA_DUAL_CORE | 两核分工 | 最高 | 最苛刻的实时需求 |
统一接口¶
三种架构使用完全相同的 API,切换只需改一个宏:
// 在编译前定义:
#define RT_PROCESS_ARCH_TYPE RT_ARCH_DMA_DUAL_CORE
// 代码不变:
rt_process_init(&config);
rt_process_start();
统一 API¶
// 初始化(传入配置,NULL = 默认)
esp_err_t rt_process_init(const rt_process_config_t *config);
// 设置传感器句柄
esp_err_t rt_process_set_sensor_handle(adxl355_handle_t *handle);
// 启动 / 停止
esp_err_t rt_process_start(void);
esp_err_t rt_process_stop(void);
// 反初始化
esp_err_t rt_process_deinit(void);
// 获取状态 / 统计
esp_err_t rt_process_get_status(rt_process_status_t *status);
esp_err_t rt_process_get_stats(rt_process_stats_t *stats);
数据类型¶
// 采集的原始样本
typedef struct {
float x, y, z; // 三轴加速度 (g)
float temp; // 温度 (°C)
uint64_t timestamp_us; // 微秒时间戳
} rt_process_sample_t;
// 处理结果
typedef struct {
float processed_x, y, z; // 处理后的加速度
float features[8]; // 提取的特征
uint64_t process_time_us;
} rt_process_result_t;
三种架构详解¶
注意事项¶
阈值检测
启用后 (enable_accel_detection = true),当任一轴加速度超过设定阈值 (TINY_MEASUREMENT_RT_ACCEL_THRESHOLD_X/Y/Z) 时触发事件。
统计信息监控
rt_process_stats_t 中的 dropped_samples 可以告诉你架构是否跟不上采集速度。如果丢样率持续上升,需要换更快的架构或降低采样率。