emXCP 目标机资源占用参考
本文档提供 emXCP 目标机库的资源占用参考数据与预算评估方法,用于在选型与集成阶段评估目标机(MCU)资源是否满足部署要求。
数据口径:以下数据来自参考工程(STM32F407IGHx + mtrDrv 电机驱动示例)的实际编译产物,emXCP 库标准档(默认配置)。不同工具链代码密度有差异,最终请以目标工程的实测为准(方法见 §六)。
一、快速结论
| 评估项 | 典型值 | 说明 |
|---|---|---|
| Flash 占用 | ≈ 37 KB | 按实际引用链接时更低,见 §三 |
| 静态 RAM 占用 | ≈ 4.4 KB | 随集成恒定驻留,见 §三 |
| 运行时缓冲区 | 由集成者配置 | 库不内部分配内存,全部由 emeye_xcp_init 传入,见 §四 |
经验判断:RAM ≥ 16 KB、Flash ≥ 64 KB 的 Cortex-M3/M4 及以上 MCU,运行 emXCP 标准档 + 中等规模录波配置没有压力。
二、占用构成概览
库的 Flash 消耗主要来自三块:录波引擎(Recorder 与 Power-on 预录波)、协议框架与数据传输、触发引擎。粗粒度分布如下:
| 功能 | Flash(约) |
|---|---|
| 协议框架与数据传输 | 9.6 KB |
| 录波与预录波引擎 | 9.4 KB |
| 标准 XCP 命令处理 | 6.8 KB |
| 触发引擎 | 4.3 KB |
| 校验、存储与适配层 | 4.0 KB |
| 私有扩展命令 | 2.9 KB |
| 合计 | ≈ 37.1 KB |
静态 RAM 的大头同样明确:DAQ 配置池约 1 KB、收发缓冲约 1.3 KB、触发配置约 0.8 KB,其余为协议状态。若仅使用 Scope/Watch(不开录波与触发),这些占用依然存在;RAM 紧张时主要通过缩小运行时缓冲区(§四)与选择标准档(§五)来削减。
三、对目标机资源的占用
将库集成进应用后,按以下公式评估资源预算:
RAM 需求 = 库静态占用(≈ 4.4 KB)+ 集成者配置的运行时缓冲区(见 §四)
Flash 需求 = ≤ 37 KB(按实际引用链接时更低)
- 库的静态 RAM 占用在链接后全额驻留,无法被链接工具缩减
- Flash 侧,启用链接器按需回收(如 GCC
--gc-sections)时,应用未使用的库功能会被自动剔除,实际尺寸低于上表合计 - RAM 紧张时的削减顺序:缩小录波缓冲(§四)→ 保持标准档(§五)→ 精简采样通道数
四、运行时缓冲区(由集成者配置)
emXCP 库采用静态内存架构,库本身不调用任何内存分配函数,所有运行时缓冲区在初始化时由应用程序传入:
emeye_xcp_init(pBuffer, size); /* 传入一段连续内存,库内部分割使用 */
缓冲区用量取决于录波/预录波配置,估算公式与典型配置见《emXCP 目标机库 集成说明及核心设计文档》"缓冲区大小估算"一节。要点:
- 采样缓冲 ≈ 通道数 × 采样点数 × 单样本大小(4 B float)
- 预录波(Power-on Recorder)需要额外的环形缓冲,按预录波点数单独估算
- RAM 紧张的单板可缩小采样点数/通道数,或关闭录波仅使用 DAQ(Scope/Watch)
五、尺寸与功能开关
| 开关 | 默认 | 作用 |
|---|---|---|
EMXCP_PROFILE(xcpCfg.h) |
1(标准档) | 0 = 完整档(RAM +4 KB 量级);1 = 标准档(本文档所有数据的基准) |
EMXCP_STORAGE_FLASH_ENABLE(emxcp_storage.c) |
0 | 1 = 编入 flash 存储后端(录波掉电保存);默认关闭节省约 1 KB 代码 |
EMXCP_CRC_KEEP_ALL(Crc.c / CrcTbl.c) |
0 | 1 = 保留全部 CRC 变体;默认仅保留 CRC32 |
所有开关均可在编译选项中用 -D 覆盖;Keil 工程在 "Options → C/C++ → Define" 中填写同名宏即可,无需改动源码。
发布 SDK(emxdemo-src/sdk/lib)已随包附带按上述开关预编译的三档库(标准档
libemxcp.a/ 含 flash 存储libemxcp_std_flash.a/ 完整档libemxcp_full.a),直接选用即可,无需自行设置开关。
三档预编译库的资源占用对比
参考工程(ARM GCC Release,启用按需链接回收)实测三档整板占用:
| 库 | 整板 Flash | 整板 RAM | 相对标准档的差异 |
|---|---|---|---|
libemxcp.a(标准档) |
119.4 KB | 56.7 KB | 基准(库本身 ≈37 KB / ≈4.4 KB) |
libemxcp_std_flash.a |
119.4 KB | 56.7 KB | 未启用 flash 存储时与标准档相同;实际启用后 Flash 约 +1 KB,RAM 不变 |
libemxcp_full.a |
119.5 KB | 61.4 KB | RAM 恒定 +4.6 KB(触发配置池放大);Flash 恒 +数 KB(取决于工具链) |
选型要点:
- RAM 差异是硬差异:完整档比标准档多占的 4.6 KB 是被代码直接引用的静态数据,任何工具链、任何用法下都会占用。RAM 紧张的单板选标准档
- Flash 差异按需发生:支持按需链接回收的工具链(GCC
--gc-sections)下,库内未被使用的功能(如 flash 存储后端、冗余校验表)不会进入最终固件;Keil 等无等效回收的工具链下,所选档位编入的功能会全额占用 Flash(完整档约多 3~4 KB) - 不需要录波掉电保存时,标准档与 flash 存储档资源占用完全一致,选任一即可;未来可能启用时选 flash 存储档,避免重新出库
六、测量目标工程的实际占用
GCC / CMake 构建:链接产物直接给出各区段大小
arm-none-eabi-size mtrDrv.elf
text data bss dec
120252 2044 56032 178328
- Flash = text + data;RAM = data + bss
- CMake 构建末尾的
Memory region Used Size输出给出各存储区百分比
Keil MDK 构建:查看链接生成的 .map 文件
Grand Totals行:各区段总大小Image component sizes表:逐目标文件的占用明细
增量对照法(最直接):注释掉 emeye_xcp_init(...) 调用后重新编译链接,两次产物之差即 emXCP 库在当前工程配置下的实际链接占用。
七、参考基准
STM32F407IGHx(Flash 1 MB / RAM 192 KB)+ mtrDrv 电机驱动示例工程实测:
| 项目 | 数值 |
|---|---|
| 整板 Flash | ≈ 119.4 KB(占 1 MB 的 11.7%) |
| 整板 RAM | ≈ 56.7 KB(占 192 KB 的 29.5%) |
| 其中 emXCP 库静态 RAM | ≈ 4.4 KB |
该参考工程随 Pro 版 emxdemo-src 源码包提供,可直接复现测量。
相关文档
- 《emXCP 目标机库 集成说明及核心设计文档》——集成步骤、缓冲区估算、编译时配置
- 《目标机集成》——目标机工程接入总览