跳转至

说明

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;

三种架构详解

// 各架构详情:
// → Producer-Consumer:环形缓冲区
// → DMA + Double Buffer:双缓冲乒乓切换
// → DMA + Dual Core:双核分工

注意事项

阈值检测

启用后 (enable_accel_detection = true),当任一轴加速度超过设定阈值 (TINY_MEASUREMENT_RT_ACCEL_THRESHOLD_X/Y/Z) 时触发事件。

统计信息监控

rt_process_stats_t 中的 dropped_samples 可以告诉你架构是否跟不上采集速度。如果丢样率持续上升,需要换更快的架构或降低采样率。