AUTOSAR架構中的配置檔案
注:本文首發於公眾號“嵌入式軟體實戰派”
你有沒有發覺AUTOSAR程式碼裡面有些檔名很是引起你注意,如xxx_PBcfg.c、xxx_Lcfg.c和xxx_Cfg.h。
看起來,這像是配置檔案,實際也證明跟AUTOSAR配置有關(更改配置工具如Davinci Configurator上的配置資訊)生成程式碼時,這些檔案會有相應的變化。
那麼,問題來了,一個xxx_cfg.h或者xxx_cfg.c就搞定了,為什麼會有三種配置檔案呢?
於是,我要刨根問底了。
cfg還好理解,就是configuration的意思,這個PB和L又是什麼意思?
翻了很多AUTOSAR官方文件,終於找到了,其實AUTOSAR Base Software支援以下幾種配置型別:
1. Pre-compile time
-
處理器指令
-
程式碼生成(選擇和合成)
2. Link time
-
module外的const資料;模組編譯後和配置資料
3. Post-build time
-
載入Module外部的const資料.載入資料到指定的memory段
獨立於配置類,可以通過變化點提供單個或多個配置集。如果提供了多個配置集,則在執行時繫結變數點的情況下,將在執行時選擇實際使用的配置集。
在許多情況下,一個模組的配置引數將具有不同的配置類別。
例如,提供構建後時間配置引數的模組仍將具有一些可進行預編譯時間配置的引數。
這樣看來,這個PB就是post-build time了,而L就是Link time了。那麼各個配置檔案有什麼作用和區別呢?
Pre-compile time
使用:
-
啟用/禁用可選功能。這樣可以排除不需要的部分原始碼。
-
優化效能和程式碼大小。在大多數情況下,使用#defines比訪問常量甚至通過指標訪問常量的程式碼效率更高。
生成的程式碼避免了程式碼和執行時開銷。
Pre-compile的配置要通過兩個配置檔案(xxx_Cfg.h,xxx_Cfg.c)實現:
-
xxx_Cfg.h包含如巨集定義和或者#defines
-
xxx_Cfg.c包含如const資料
Nm_cfg.c
#include"Nm_Cfg.h" /*lint-restore*/ CONST(Nm_NmFunctionTableType,NM_CONST)Nm_NmFunctionTable[1]={/*PRQAS1514,1533*//*MD_CSL_ObjectOnlyAccessedOnce*/ /*IndexGetLocalNodeIdentifierGetNodeIdentifierGetPduDataGetStateNetworkReleaseNetworkRequestPassiveStartUpReferableKeys*/ {/*0*/CanNm_GetLocalNodeIdentifier,CanNm_GetNodeIdentifier,CanNm_GetPduData,CanNm_GetState,CanNm_NetworkRelease,CanNm_NetworkRequest,CanNm_PassiveStartUp}/*[CanNm]*/ };
m_Cfg.h
/*GlobalProperties*/
#ifndefNM_DEV_ERROR_DETECT
#defineNM_DEV_ERROR_DETECTSTD_ON
#endif
#ifndefNM_DEV_ERROR_REPORT
#defineNM_DEV_ERROR_REPORTSTD_ON
#endif
#defineNM_VERSION_INFO_APISTD_OFF
Nm.c
/*NMInterfaceversionisdecimalcoded.*/
CONST(uint8,NM_CONST)Nm_MainVersion=NM_SW_MAJOR_VERSION;
CONST(uint8,NM_CONST)Nm_SubVersion=NM_SW_MINOR_VERSION;
CONST(uint8,NM_CONST)Nm_ReleaseVersion=NM_SW_PATCH_VERSION;
Link time
Link time配置用於:
-
模組配置僅僅對目的碼可用(例如IP Protection和warranty原因)
-
在編譯之後但在連結之前建立配置。
例如
Mcu_Lcfg.c
/*QACWarning:STARTMsg(2:3211)-2*/
/*DataStructureofRAMsettingConfiguration*/
CONST(Mcu_RamSetting,MCU_VAR)Mcu_GstRamSetting[1]=
{
/*Index:0-McuRamInitConfiguration*/
{
/*pRamStartAddress*/
/*MISRAViolation:STARTMsg(4:0306)-1*/
/*QACWarning:STARTMsg(2:0315)-3*/
/*QACWarning:STARTMsg(2:3892)-4*/
(P2VAR(uint8,TYPEDEF,MCU_CONFIG_DATA))0xFEBD0000UL,
/*ENDMsg(2:3892)-4*/
/*ENDMsg(2:0315)-3*/
/*ENDMsg(4:0306)-1*/
/*ulRamSectionSize*/
0x00000100UL,
/*ucRamInitValue*/
0xFFU,
/*enRamWriteSizeSel*/
MCU_8BIT_SIZE
}
};
Mcu.c
/*GetthepointertotheRAMstructure*/
LpRamSetting=&Mcu_GstRamSetting[RamSection];
Post-build time
Post-build time會用於
-
資料配置,其中僅定義結構,但在ECU生成期間未知內容
-
在ECU-build時之後(例如,生產end of line,測試和校準期間)可能會更改或必須修改的資料配置
-
跨不同汽車版本(相同應用,不同配置)的ECU的可重用性,例如 與豪華版轎車的ECU相比,低成本版轎車的ECU在總線上傳輸的訊號更少。
例如
關注“嵌入式軟體實戰派”,回覆“AUTOSAR”獲得更多實戰教程。