编译过程的PreCompile,LinkTime和PostBuild

2021年5月5日汽车技术评论5,1222阅读模式
这篇文章讲解PreCompile,LinkTime和PostBuild,写得很详细,是对编译过程的补充,非常不错,分享给大家。
编译过程的PreCompile,LinkTime和PostBuild
在Autosar中定义了三种配置参数方法:
从名字就可以看出,这三种方法是在编译的三个不同阶段对软件进行参数配置在不同阶段进行配置,对软件会产生不同的影响。

 Pre-Compile

在预编译阶段,我们知道C语言主要负责处理“”,对其进行替换或者展开。通过预编译,我们可以对功能进行开关选择,减少软件的代码量。但缺点也是明显的,预编译阶段的任何更改,我们都需要重新把软件编译一次。

Spi_Cfg.h
#define SPI_DEV_ERROR_DETECT ON
Spi.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 LoadablePost-build Selectable,其中Loadable与Link time非常类似,不同点在于Loadable的数据位于允许重新加载的特定内存段。Post-build配置通常在模块的*_PBcfg.c和*_PBcfg.h中实现。

  • Loadable:只可以使用一个配置结构,并且可以修改该结构的各个成员,但是不能选择完全不同的结构。使用此方法,OEM可以自己生成相应代码参与编译或者规定好固定的地址段用刷新的方式来进行更改。

  • Selectable:共有 N个配置集可用,并且在ECU初始化期间可以选择其中一组进行配置。

编译过程的PreCompile,LinkTime和PostBuild

我们来重点介绍下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中。

Post-build Selectable给了我们多种想象空间,比如只需要通过UDS配置就可以更改两款车型配置,两套完全不同的通信矩阵,或者将两个不同供应商的配置集成在一个软件中!

总结

配置类
代码量 生效条件
PreCompile
最小
编译+刷新
LinkTime
中等 刷新

PostBuild(Loadable)

中等
部分刷新
PostBuild(Selectable) 最大 UDS/Pin/其他

 

weinxin
扫码关注公众号
关注公众号领精彩彩蛋!
汽车HMI设计原则 汽车技术

汽车HMI设计原则

汽车制造商必须为汽车显示屏选择正确的设计原则,否则分心驾驶将达到新的水平 近几年,车载大屏设计越来越受到车企的青睐,比如,梅赛德斯-奔驰)凭借其全新的全宽仪表盘显示器MBUX超屏吸引了大量关注。几乎所...
AutoSar模式管理总揽 汽车技术

AutoSar模式管理总揽

介绍下AUTOSAR中的模式管理(Mode Manager)的机理。了解模式管理之前,先解释下三个重要的概念:模式、状态和阶段。 Mode(模式) 模式是运行在车辆中的各种状态机(不仅仅是ECU状态管...

发表评论