在ECU开发过程中,使用标定工具进行标定或变量监控,通常会使用基于ASAP2标准的A2L文件,目前的Embedded Coder也是支持A2L文件的生成。
如下图选项勾选后,代码生成时也生成相应的A2L文件。
例如我们在模型中定义了Var_A,Var_B,Var_C,Var_X,Var_Y,Var_Z全局变量(监测量),以及Rate变量(标定量),在代码生成后,会自动生成一个A2L文件(A2L具体格式这里不进行细说,可自行度娘了解一下),部分文件内容截图如下:
我们可以看到Embedded Coder生成的A2L文件中变量地址是虚拟的,都用了0x0000替代,要想使用这个A2L文件,还需要将0x0000替换成变量的实际地址。
实际应用中,我们通常会对MCU 的Flash、RAM、EEPROM等内存区域按照不同类型、不同用途进行分段划分,将变量定义在指定的内存分段内(示例中没有进行分段,变量都默认定义在RAM中,分段名默认为'common')。
我们将上述模型生成的代码在CodeWarrior进行集成,编译成功后.map文件部分截图如下:
如上图,模型中涉及的每个变量都有实际的地址,我们要做的就是利用m脚本将这个.map文件与A2L进行匹配,将指定的变量地址用实际的地址进行替换(示例中仅对Var_A...这些变量的地址进行替换)。
脚本中主要涉及以下两个函数:
- regexp 正则表达式
- strrep 字符串替换
脚本设计思路:
1.在map文件中使用正则表达式获取所需变量的信息
对.map文件使用正则表达式,匹配查找到所需变量的分配情况,例如上述.map中,监测变量的地址分配有6段内容,可利用这6段内容进行精确匹配,获得变量的信息,包括变量名称、变量地址、变量大小等,示例代码如下:
2.在A2L文件中查找变量,替换地址
A2L文件中,每个变量都有如下一个固定格式:
(代码显示不全可左右滑动)
ECU_ADDRESS 0x0000 /* @ECU_Address@Var_A@ */
根据上述在.map中获取的变量信息,在A2L中查找对应变量,然后将上述固定格式中的虚拟地址替换成实际地址即可。(代码显示不全可左右滑动)
addrPrefix = '0x0000 /* @ECU_Address@';
addrSuffix = '@ */';
expr = [addrPrefix,match_name,addrSuffix];
repr = ['0x',replace_addr,' /* @ECU_Address@',match_name,addrSuffix];
ASAP2FileString = strrep(ASAP2FileString,expr,repr);
3.重写A2L
这里用fprintf函数,直接对原A2L文件进行重写。
完整代码如下:(代码显示不全可左右滑动)
ASAP2File