按:本文作者为泛亚技术中心的模型开发工程师,文章实例很长,公众号文章中没有完全刊出,需要的网友可以通过文末左下角的
一. 先导知识
CCP https://mp.weixin.qq.com/s/D3-iHC63BcIL4YK7c0P7vA?
XCP https://blog.csdn.net/nibiewuxuanze/article/details/78856714
A2L的作用:观测或更改CHARACTERISTIC(标定)、MEASUREMENT(观测量)、AXIS(查表)等标定或信号的信息。
1. CHARACTERISTIC生成方法: ,在Workspace中添加同名Simulink.Parameter(aa),选择ConstVolatile、Datatype、Value、头文件calib.h、定义文件calib.c。
2. MEASUREMENT生成方法:任一信号(名称长度<32)选择
,在Workspace中添加同名Simulink.Signal,选择SimulinkGlobal、Datatype、Inital Value,名称过长会导致无法生成A2L(缩短至<=31位,Autosar4.0要求)。
3. AXIS生成方法:
,在Workspace中添加同名Simulink.Parameter(aaa,bbb),选择ConstVolatile、Datatype、Value、头文件calib.h、定义文件calib.c。
A2L包含scalar(单值标定)、Lookup1D(curve)、Lookup2D(mapping)、Measurable可测量但不可调 applicable可调。
Simulink在生成A2L时使用如下文件:
文件夹:matlabroot\toolbox\rtw\targets\asap2\asap2
getCompuMethodName.m用于获取Compu_Method的名称,CM_DataType_DocUnits,其中Units将数字和字母以外的符号变成’_’;
asap2userlib.tlc定义了生成A2L的形式,可以对标定/信号之类的加A2L属性
向标定或者信号中加上MemoryAddress_ASAP2
属性即可生成A2L时加上地址;
asap2post.m可以对A2L进行地址map,与编译器的Linker map/ELF文件进行关联使用,规则可以在该.m中修改;
asap2post_targets.m函数可以把a2l文件中的虚拟地址根据map文件中的地址改掉;
asap2post(ASAP2File, MAPFile)可以替换a2l文件里的地址,但是系统自带的一般无法直接使用,需要修改里面部分匹配规则,具体参考正则匹配。以适合你的map文件格式。然后直接运行ok了。
Help提示:可以根据asap2post.pl文件和asap2post_targets.m文件推出来工作工程,需要学一点很简单的perl语言,只改一两行就可以了。
二. 哪些参数对象可生成到A2L
Simulink.Parameter选择不同Storage Class对代码中定义形式和A2L的影响:
SimulinkGlobal: 不能生成A2L(若是MEASUREMENT则可以生成)
struct P_micr_DEMO_Changed_AllPrmIsI_T_ {int32_T aa; };
ExportedGlobal: 可以生成A2L,int32_T aa = 0; (且在头文件中加extern);
ImportedExtern: 可以生成A2L,无定义直接使用aa;
ImportedExternPointed: 可以生成A2L,无定义直接使用*aa;
Default(Custom):可以生成A2L,int32_T aa = 0; (且在头文件中加extern);
BitField(Custom):不能生成A2L,rt_Simulink_BitField_type rt_Simulink_BitField = {0};
typedef struct rt_Simulink_BitField_tag {
int32_T aa;
} rt_Simulink_BitField_type;
Const(Custom): 可以生成A2L,const int32_Taa = 0; (且在头文件中加extern);
Volatile(Custom): 可以生成A2L,volatile int32_Taa = 0; (且在头文件中加extern);
ConstVolatile: 可以生成A2L,const volatile int32_Taa = 0;(且在头文件中加extern);
Define(Custom): 不能生成A2L,#define aa 0;
ImportedDefine: 不能生成A2L必须定义头文件:无定义直接使用(int32_T)aa(可能在规定头文件定义);
ExportToFile(Custom): 可以生成A2L,在规定的.c中定义int32_Taa = 0;
ImportFrom File(Custom): 可以生成A2L,无定义直接使用aa;
FileScope(Custom): 不能生成A2L,staticint32_Taa = 0;
Struct(Custom): 不能生成A2L,rt_Simulink_BitField_typert_Simulink_BitField = {0};
typedef struct rt_Simulink_BitField_tag {int32_T aa;} rt_Simulink_BitField_type;
GetSet(Custom): 不能生成A2L,get_aa();
CompilerFlag(Custom): 不能生成A2L,无定义直接使用aa。
三. 生成A2L所需TLC
关键点:
matlabroot\rtw\c\tlc\mw目录下的asap2grouplib.tlc、asap2lib.tlc、asap2main.tlc;
matlabroot\toolbox\rtw\targets\asap2\asap2\user目录下asap2userlib.tlc和templates文件夹下的内容;
修改这些tlc可以修改A2L的生成格式
上述A2L包含了ASAP2_VERSION1、PROJECT1、HEADER2、MODULE1、MOD_PAR2、MOD_COMMON2、RECORD_LAYOUT3、CHARACTERISTIC3、MEASUREMENT3、COMPU_METHOD3、COMPU_TAB3、FUNCTION、GROUP2等环节(角标编号为下列tlc简介编号,标蓝为常用函数,标绿为引用标量,标黄为TLC函数调用);
生成A2L 过程,列出全部相关tlc:
1. asap2main.tlc中定义了开头和全局结构,分为VERSION、PROJECT、Header、MODULE、Interface、DynamicContents、Groups:
%
%assignASAP2FullFileName = ASAP2FileName %%Model.tlc
%openfileModelASAP2File = ASAP2FullFileName
%openfile ASAP2List ="asap2.lis"
%selectfileModelASAP2File
%
%assign asap2Version= ASAP2UserFcnASAP2Version()
%assign VersionNo =asap2Version[0]
%assign UpgradeNo =asap2Version[1]
ASAP2_VERSION % % /* Version %.% */
/begin PROJECT %"%"
%<ASAP2UserFcnWriteHeader()> /* asap2userlib.tlc*/
/begin MODULE % "%"
%<ASAP2UserFcnWriteHardwareInterface()>\ /* asap2userlib.tlc*/
%<SLibASAP2WriteDynamicContents()>\ /* asap2lib.tlc*/
%<SLibOutputGroups()> /*asap2grouplib.tlc*/
/end MODULE
/end PROJECT
%\ /*结尾,加点注释什么的*/
2. asap2userlib.tlc中定义了大量函数供其它A2L的TLC调用,如ASAP2UserFcnWriteHead、ASAP2UserFcnWriteHeader、ASAP2UserFcnWriteHardwareInterface、ASAP2UserFcnWriteFileTail、ASAP2UserFcnASAP2Version、ASAP2UserFcnDataTypeAlias、ASAP2UserFcnRecordLayoutAlias_Common、ASAP2UserFcnWriteMeasurement、ASAP2UserFcnWriteCompuVTab、ASAP2UserFcnWriteCompuMethods、ASAP2UserFcnWriteComAxis、ASAP2UserFcnWriteStdAxis、ASAP2UserFcnWriteFixAxis、ASAP2UserFcnWriteFixAxisList:
%function ASAP2UserFcnASAP2Version()void
%assign VersionNo = "1"
%assign UpgradeNo = "31"
%return [%,%]
%endfunction
%function ASAP2UserFcnWriteHeader()Output
/begin HEADER "Header Comments go here"
/end HEADER
%endfunction
%function ASAP2UserFcnWriteHardwareInterface()Output
/begin MOD_PAR "%"
/end MOD_PAR
/begin MOD_COMMON "%"
BYTE_ORDER %
/end MOD_COMMON
%endfunction
3. asap2lib.tlc包含了定义RECORD_LAYOUTS、CHARACTERISTICS、MEASUREMENTS、COMPU_METHODS格式的函数,(前两个调用scalar、1D、2D中的内容,后两个调用userlib中的内容)
该tlc的主函数为SLibASAP2WriteDynamicContents(),其调用的函数均为asap2lib.tlc中自定义的函数,
%functionSLibASAP2WriteDynamicContents() Output
%with ::CompiledModel
%<FcnOutputRecordLayouts()> \ /*RECORD_LAYOUT所有内容,该函数调用scalar、1D、2D的ASAP2UserFcnWriteRecordLayout_XXX函数*/
%<FcnLoopThruParamGroups()> \ /*1D和2D的xyz标定和轴AXIS_DESCR/PTS,调用先1D后2D的ASAP2UserFcnWriteCharacteristic函数*/
%<FcnLoopThruModelParameters()> \ /*写scalar标定,调用ASAP2UserFcnWriteCharacteristic_Scalar函数*/
%if IsModelReferenceTarget()
% \
%endif
%if !IsModelReferenceTarget()
%<FcnLoopThruExternalInputs()> \ /*ExternalInputs外部输入信号参数,调用ASAP2UserFcnWriteMeasurement函数*/
%<FcnLoopThruExternalOutputs()> \ /*ExternalOutputs外部输出信号参数,调用ASAP2UserFcnWriteMeasurement函数*/
%endif
%<FcnLoopThruBlockOutputs()> \ /*ExternalOutputs内部信号参数,调用ASAP2UserFcnWriteMeasurement函数*/
% \ /*Dwork中的离散状态变量,调用ASAP2UserFcnWriteMeasurement函数*/
%<FcnOutputCompuMethods()> \ /*写整型-物理转换关系的COMPU_METHODS的参数,调用ASAP2UserFcnWriteCompuMethods*/
% \/*写标准表格调用1D、2D中的ASAP2UserFcnWriteSTDAxisRecordLayout函数*/
%endwith
%endfunction
4. asap2grouplib.tlc包含了GROUP的格式定义函数
主函数为SLibOutputGroups
5. asap2setup.tlc供main和userlib使用,中定义了上面的ASAP2FileName、ASAP2ProjectName/Comment、ASAP2ModuleName/Comment、ASAP2MOD_COMMON_Comment、ASAP2ModParComment、ASAP2BYTE_ORDER:
%assign ASAP2FileName ="%.a2l"
%assign ASAP2ProjectName = "ProjectName"
%assign ASAP2ProjectComment = "Project Comment GoesHere"
%assign ASAP2ModuleName = "ModuleName"
%assign ASAP2ModuleComment = "Module Comment GoesHere"
%assign ASAP2MOD_COMMON_Comment = "Mod Common Comment Here"
%assignASAP2NumberFormat ="%0.6"
%assign ASAP2HeaderName = "Header Name GoesHere"
%assign ASAP2ModParComment = "MOD PAR Comment GoesHere"
%assignASAP2CompuMethodName_Prefix = "%_"
%assignASAP2GenNoCompuMethod = TLC_FALSE
%assignASAP2EnableTestPoints = TLC_TRUE
%assignASAP2EnableRootLevelIO = TLC_FALSE
%if CompiledModel.ConfigSet.TargetEndianess =="LittleEndian"
%assign ASAP2BYTE_ORDER = "MSB_LAST"
%else
%% other cases: Unspecified, BigEndian 一般默认设置为小端
%% The default
%assign ASAP2BYTE_ORDER ="MSB_FIRST"
%endif
6. 2D.tlc(与scalar、1D类似)中的函数:(XXX表示scalar、1D、2D都有)
1) ASAP2UserFcnRecordLayoutAlias_XXX 写标定DT,scalar、1D、2D都有;
2) ASAP2UserFcnRecordLayoutAlias_X_AXIS_LookupXD 写坐标轴DT,查表专用;
3) ASAP2UserFcnWriteRecordLayout_XXX 轮流调用第1、2个函数,scalar只调用第一个;
4) ASAP2UserFcnWriteSTDAxisRecordLayout_LookupXD 写查表的recordlayout以符合某种标准,但一般没用到;
5) ASAP2UserFcnWriteCharacteristic_XXX 写标定属性,若是查表还写轴的属性;
6) ASAP2UserFcnWriteStructCharacteristic_Scalar scalar专属,写结构体标定属性(写scalar标定,暂没使用到);
总结A2L各部分内容所处的tlc,想修改A2L生成内容只需要修改对应tlc就行了,新加元素可直接在asap2main.tlc或者其他tlc的对应位置中添加内容。
ASAP2_VERSION1:asap2userlib.tlc
PROJECT1:asap2setup.tlc
HEADER2:asap2userlib.tlc
MODULE1:asap2setup.tlc
MOD_PAR2:asap2setup.tlc
MOD_COMMON2:asap2userlib.tlc
RECORD_LAYOUT3:scalar、1D、2D.tlc
CHARACTERISTIC3:scalar、1D、2D.tlc(包含标定和轴)
MEASUREMENT3:asap2userlib.tlc
COMPU_METHOD3:asap2userlib.tlc
GROUP4:asap2grouplib.tlc
TLC调用依赖关系:
另有tlc文件修改的实例,请通过
推荐阅读
Automotive SPICE和Automotive SPICE评估的那些事
什么样的模型算正确的模型?
雕虫小技 | Simulink模型开发中的一些自动化方法
结构体变量建模之终极解决方案(续)
ISO26262软件部分的测试: (1) 软件单元测试