XCP Slave Recorder 模式
XCP Slave Recorder 模式是一种触发式高速数据录制功能,支持预触发和后触发数据捕获,适用于需要记录特定事件前后数据的场景。
功能入口
Recorder 模式功能通过以下方式使用:
- Master 端调用:通过 XCP Master 软件发起录制命令
- API 接口调用:在嵌入式代码中直接调用 emXCP API
使用步骤
1. 初始化 Recorder
在使用 Recorder 功能前,需要初始化 emXCP 库并提供内存缓冲区:
#include "emXcp.h"
// 定义缓冲区
#define EMXCP_BUFFER_SIZE (16 * 1024) // 16KB
static char g_xcpBuffer[EMXCP_BUFFER_SIZE];
// 初始化
emeye_xcp_init(g_xcpBuffer, EMXCP_BUFFER_SIZE);
emeye_xcp_set_irq(1, 0); // 设置 1ms 中断周期
2. 配置录制参数
设置采样率、预触发点数和后触发点数:
TXcpRecorderConfig config;
config.sample_rate = 1000; // 1kHz 采样率
config.pre_trigger = 50; // 预触发 50 个采样点
config.post_trigger = 150; // 后触发 150 个采样点
config.triggerType = XCP_TRIG_TYPE_MANUAL; // 手动触发
emeye_xcp_recorder_config(&config);
3. 启动录制
配置完成后启动录制:
emeye_xcp_recorder_start();
4. 触发录制
根据配置的触发类型,选择触发方式:
| 触发类型 | 值 | 说明 |
|---|---|---|
| TRIG_TYPE_NONE | 0x00 | 无触发,立即开始录制 |
| TRIG_TYPE_MANUAL | 0x01 | 手动触发,由 Master 发送触发命令 |
| TRIG_TYPE_SINGLE | 0x02 | 单次触发,表达式触发后自动停止 |
| TRIG_TYPE_REPEAT | 0x03 | 重复触发,表达式触发后继续录制 |
手动触发示例:
emeye_xcp_recorder_trigger();
5. 停止录制
录制完成后停止:
emeye_xcp_recorder_stop();
6. 查询状态
可随时查询录制状态:
TXcpRecorderStatus status;
emeye_xcp_recorder_get_status(&status);
// status.state - 当前状态
// status.bufferUsage - 缓冲区使用量
// status.triggerStatus - 触发状态
核心概念
工作原理
时间轴 ──────────────────────────────────────────────────────>
|←── 预触发数据 ──→|← 触发点 →|←── 后触发数据 ──→|
┌──────────────────┬──────────┬──────────────────┐
│ Pre-Trigger │ Trigger │ Post-Trigger │
│ (环形缓冲) │ Point │ (线性缓冲) │
└──────────────────┴──────────┴──────────────────┘
预触发阶段:触发前持续采集数据到环形缓冲区,保留触发前的历史数据。
后触发阶段:触发后继续采集数据到线性缓冲区,记录触发后的数据。
状态流程
IDLE → ARMED → PRE_TRIGGER → POST_TRIGGER → UPLOAD → COMPLETE
│ │
└──────────────┴──→ 可随时停止 → IDLE
注意事项
内存需求
Recorder 功能需要用户提供内存缓冲区,最小 512 字节。可通过以下方式计算所需内存:
uint32_t requiredSize = emeye_xcp_get_required_mem_size(
50, // 预触发点数
150, // 后触发点数
8 // 变量条目数量
);
缓冲区大小建议
| 配置 | 内存需求 | 说明 |
|---|---|---|
| 最小配置 | 4KB | 2 变量,100ms 缓冲 |
| 标准配置 | 16KB | 8 变量,200ms 缓冲 |
| 最大配置 | 64KB | 16 变量,500ms 缓冲 |
状态限制
- SET_RECORDER_PARAMS:仅在 IDLE 状态下接受
- START_RECORDER:仅在 ARMED 状态下接受
- STOP_RECORDER:在 PRE_TRIGGER 或 POST_TRIGGER 状态下接受
- TRIGGER_RECORDER:仅在 PRE_TRIGGER 状态下接受
性能要求
| 操作 | 目标时间 | 说明 |
|---|---|---|
| 单次采样 | < 5μs | 8 个变量,32 位 |
| 批量发送 | < 20μs | 8 帧,64 字节数据 |