PreCompile ~ LinkTime ~ PostBuild

在Autosar中定义了三种配置参数方法:
PreCompile
LinkTime
PostBuild
从名字就可以看出,这三种方法是在编译的三个不同阶段对软件进行参数配置(忘记了?赶紧来复习一下 编译与链接)。在不同阶段进行配置,对软件会产生不同的影响。
Pre-Compile
在预编译阶段,我们知道C语言主要负责处理“宏”,对其进行替换或者展开。通过预编译,我们可以对功能进行开关选择,减少软件的代码量。但缺点也是明显的,预编译阶段的任何更改,我们都需要重新把软件编译一次。
Spi_Cfg.h
1 #define SPI_DEV_ERROR_DETECT ON
Spi.c
1 #include "Spi_Cfg.h"
2 #if (SPI_DEV_ERROR_DETECT == ON)
3 Det_ReportError(Spi_ModuleId, 0U, 3U, SPI_E_PARAM_LENGTH);
4 #endif
上述代码是打开SPI调试功能,是软件工程师在开发阶段使用的调试代码,而量产产品中是不需要的,所以只需要把该宏由ON改成OFF即可,从而减少代码量,提高运行速度。
Pre-Compile配置通常在模块的*_Cfg.h、_Cfg.c中实现,其中_Cfg.h存储宏定义#defines,*_Cfg.c存储常量。
Link-Time
在Link阶段就是把编译出来的*.o文件,链接成为一个整体。我们知道在软件中有许许多多的常量,宏定义中的常量或者内部定义的“const常量”。
由于宏定义是不会分配内存地址的,每次更改都需要重新编译。而const变量是会被分配地址的,这就意味着在link阶段我们可以进行配置的修改。Link time配置通常在模块的*_Lcfg.h、*_Lcfg.c中实现。
Fls_Lcfg.c
1 const Dem_EventIdType Fls_WriteFailed[2] = {DemConf_DemEventParameter_FL
Fls.c
1 Dem_SetEventStatus(Fls_WriteFailed[instance], DEM_EVENT_STATUS_FAILED);
对于这种const的参数,一般都有配套的A2L生成,使用常规的标定工具就可以进行更改,但最终生效还需要进行刷新操作。
Post-Build
Post-build存在两种类型,分别是Post-build Loadable和Post-build Selectable,其中Loadable与Link time非常类似,不同点在于Loadable的数据位于允许重新加载的特定内存段。Post-build配置通常在模块的*_PBcfg.c和*_PBcfg.h中实现。
Loadable:只可以使用一个配置结构,并且可以修改该结构的各个成员,但是不能选择完全不同的结构。使用此方法,OEM可以自己生成相应代码参与编译或者规定好固定的地址段用刷新的方式来进行更改。Selectable:共有 N个配置集可用,并且在ECU初始化期间可以选择其中一组进行配置。

我们来重点介绍下Post-build Selectable。在ECU上电初始化阶段EcuM会配置各个模块中的PostBuild指针。
EcuM_PBcfg.c
1 STATIC CONST(EcuMModuleConfigurationRefType, ECUM_CONST) EcuMModuleConf
2 &Com_PBcfg,
3 &PduR_PBcfg,
4 &CanIf_PBcfg,
5 &CanTp_PBcfg,
6 &LinIf_PBcfg,
7 &FrIf_PBcfg,
8 &FrTp_PBcfg,
9 &Fr_PBcfg, };
所以,如果我们配置了多个不同的EcuMModuleConfig,就可以实现如下的功能,例如根据ECU安装的位置实现不同配置:
1 FUNC(P2CONST(EcuM_ConfigType_t, ECUM_VAR, ECUM_APPL_CONST), ECUM_CODE)
2 /* Integrator code - start */
3 EcuM_CpnfigType* myPB = 0;
4 if (ECU_is_Left_Door) {
5 myPB = &myLeftPBConfiguration;
6 } else {
7 myPB = &myRightPBConfiguration;
8 }
9 /* Integration code - end */
10 } /* EcuM_DeterminePbConfiguration() */
而更改配置的方法就更多种多样了,可以通过UDS在下线配置的时候,或者通过关键pin的输入电平高低(Ps:要保证Dio模块的初始化比EcuM更早)又或者在CAN上发一个信号后存入NVM中。
Post-build Selectable给了我们多种想象空间,比如只需要通过UDS配置就可以更改两款车型配置,两套完全不同的通信矩阵,或者将两个不同供应商的配置集成在一个软件中!
总结
配置类 代码量 生效条件
PreCompile 最小 编译+刷新
LinkTime 中等 刷新
PostBuild(Loadable) 中等 部分刷新
PostBuild(Selectable) 最大 UDS/Pin/其他
参考文献:【1】汽车软件攻城狮:AUTOSAR配置中的PostBuild、Precompile、Linktime
【2】Sgnes:基于Vector的Autosar Postbuild【3】Sandeep’s Blog:Basics Of AUTOSAR – Part 2汽车ECU设计

一个菜鸟程序猿的成长之路。116篇原创内容
公众号
⭐编译与连接⭐
第28期:编译与链接
第89期:HEX BIN ELF 你能分得清吗?
⭐近期爆款⭐
第118期:什么是 E2E 保护 ?
第117期:【学习心得】我的单片机学习之路
第113期:SPI 通讯协议
========================
↙戳链接一秒找到我有观点分享,请留言↘

氨气“ 携手进步 共同成长 ”
Autosar · 目录
上一篇 下一篇
Autosar CanNm 网络管理 Autosar IPduM 功能介绍
阅读原文