-
PreCompile -
LinkTime -
PostBuild
Pre-Compile
在预编译阶段,我们知道C语言主要负责处理“宏”,对其进行替换或者展开。通过预编译,我们可以对功能进行开关选择,减少软件的代码量。但缺点也是明显的,预编译阶段的任何更改,我们都需要重新把软件编译一次。
#include "Spi_Cfg.h"
#if (SPI_DEV_ERROR_DETECT == ON)
Det_ReportError(Spi_ModuleId, 0U, 3U, SPI_E_PARAM_LENGTH);
#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
const Dem_EventIdType Fls_WriteFailed[2] = {DemConf_DemEventParameter_FLS_E_WRITE_FAILED_1, DemConf_DemEventParameter_FLS_E_WRITE_FAILED_1};
Fls.c
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
STATIC CONST(EcuMModuleConfigurationRefType, ECUM_CONST) EcuMModuleConfigValue = {
&Com_PBcfg,
&PduR_PBcfg,
&CanIf_PBcfg,
&CanTp_PBcfg,
&LinIf_PBcfg,
&FrIf_PBcfg,
&FrTp_PBcfg,
&Fr_PBcfg, };
所以,如果我们配置了多个不同的EcuMModuleConfig,就可以实现如下的功能,例如根据ECU安装的位置实现不同配置:
FUNC(P2CONST(EcuM_ConfigType_t, ECUM_VAR, ECUM_APPL_CONST), ECUM_CODE) EcuM_DeterminePbConfiguration( void ) {
/* Integrator code - start */
EcuM_CpnfigType* myPB = 0;
if (ECU_is_Left_Door) {
myPB = &myLeftPBConfiguration;
} else {
myPB = &myRightPBConfiguration;
}
/* Integration code - end */
} /* EcuM_DeterminePbConfiguration() */
而更改配置的方法就更多种多样了,可以通过UDS在下线配置的时候,或者通过关键pin的输入电平高低(Ps:要保证Dio模块的初始化比EcuM更早)又或者在CAN上发一个信号后存入NVM中。
总结
配置类 |
代码量 | 生效条件 |
PreCompile |
最小 |
编译+刷新 |
LinkTime |
中等 | 刷新 |
PostBuild(Loadable) |
中等 |
部分刷新 |
PostBuild(Selectable) | 最大 | UDS/Pin/其他 |