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 目标机库 集成说明及核心设计文档》——集成步骤、缓冲区估算、编译时配置
  • 《目标机集成》——目标机工程接入总览