01
緣由
在AUTOSAR的配置軟件中,經常可以見到PostBuild、Precompile、Linktime這三個的影子,所以想搞清楚它們的區別,以及知道大概是干什么的。
1)DaVinciCFG中
2)EB工具中
3)在買AUTOSAR模塊時
02
編譯基礎知識回顧
在研究之前,先復習一下編譯過程的基礎知識
注意:
靜態庫是經過編譯的二進制文件。在鏈接階段,引用庫一旦鏈接成功,將匯編生成的目標文件與引用的庫一起鏈接打包到可執行文件當中。
預處理Preprocessing :
1、處理一些#開頭的預處理指令,比如#if等
2、進行宏定義的替換
3、去除代碼注釋
編譯Compilation :把.C文件編譯生成匯編代碼.asm
匯編Assemble :把.asm會變成中間文件.o
鏈接Linking :鏈接.o,.a,.lib文件生成可執行文件
03
為什么需要配置?
AUTOSAR標準了很多東西,所以在考慮問題方面,需要做的更加 全面 ,以應付不同的使用軟件使用場景。那么代碼不可避免的就需要配置一些東西,比如使用宏定義來選擇哪些模塊不需要。再比如,傳統的ECU汽車軟件開發結束后,不修改代碼是無法更新DBC的,即使功能類似,也做不到,只能重新開發,改動比較大,重新開發還要重新測試。因此AUTOSAR提出了Post-build的方案,運行在開發結束后對ECU的參數進行修改,以便于節省維護和測試成本。
按照編譯過程的階段,把配置方法進行分類,分為三類,分別是 Pre-compile 、Link time和 Post-build ,下面三類AUTOSR都是支持的。
04
Pre-Compile
實現手段:
1、通過宏定義來Enable和disable一些不需要的模塊
2、使用宏定義來定義常量進行配置
在預編譯階段,就會把這些配置項進行宏替換,在實際使用當中,配置項放在單獨的.c和.h文件中(*_Cfg.h, *_Cfg.c),比如Spi.c的配置項,放在了Spi_Cfg.c和Spi.h中,并且被配置的文件(比如Spi.c必須有源文件)不能是.o,.a等庫文件或者中間文件,因為庫已經被預編譯過一次了,只能參與到鏈接。
優勢:
1)節省運行時的開銷,在預編譯階段就完成了配置
劣勢:
1)參數配置是通過宏來實現,要求被配置的C要以源碼形式提供,不能以庫或者中間文件的形式
2)參數類型更改需要重新編譯軟件
*_Cfg.h中放宏定義
*_Cfg.c中放const常量
一個示例
eg.使能和關閉一個功能
Spi_Cfg.h:
Spi_Cfg.c:
Spi.c(必須要有Spi.c的源文件,不能是庫)
05
Link-time
Link time在鏈接時進行配置,適合對沒有C源碼的庫(.a,.lib)或者中間文件(.o)進行配置。
eg.
Dem_Cfg.h
typedef uint16 Dem_EventIdType; /* total number of events = 380 = > uint16 required */
#define DemConf_DemEventParameter_FLS_E_ERASE_FAILED_0 1U
#define DemConf_DemEventParameter_FLS_E_ERASE_FAILED_1 2U
#define DemConf_DemEventParameter_FLS_E_WRITE_FAILED_0 3U
#define DemConf_DemEventParameter_FLS_E_WRITE_FAILED_1 4U
#define DemConf_DemEventParameter_NVM_E_REQ_FAILED 5U
#define DemConf_DemEventParameter_CANSM_E_BUS_OFF 6U
Fls_Lcfg.c
#include "Dem_Cfg.h" /* for providing access to event symbols */
const Dem_EventIdType Fls_WriteFailed[2] = {DemConf_DemEventParameter_FLS_E_WRITE_FAILED_1,
DemConf_DemEventParameter_FLS_E_WRITE_FAILED_2};
File Fls.c (available as object code):
#include "Dem.h" /* for reporting production errors */
extern const Dem_EventIdType Fls_WriteFailed[];
Dem_SetEventStatus(Fls_WriteFailed[instance], DEM_EVENT_STATUS_FAILED);
06
Post-build
適合的場景:
1)適合ECU適配ECU的數據配置,比如產線出產后的一些標定和校準參數(這些參數事先在開發期間,不知道這些參數,一般每一臺機器的因為硬件的微小差異導致每臺機器的參數都不一樣),或者每臺機器的序列號、版本配置,都是屬于Post-build time配置。
2)跨不同汽車版本(相同應用,不同配置)的ECU的可重用性,例如 與豪華版轎車的ECU相比,低配版轎車的ECU在總線上傳輸的信號更少,其他配置一樣。
Post-build概述
就是單獨把配置的參數放到一個 內存區域 ,這個區域可以 單獨被刷寫 (通過flash擦寫工具,通過UDS服務,通過Bootloader修改參數),這樣做的一個好處是,OEM不需要知道代碼邏輯,甚至不需要編譯器(有些符合功能安全的編譯器是要license才能使用的),也能修改BSW總的部分配置參數。
Post-build的工作流
如前面所說Post-build time是在鏈接得到二進制后,再進行修改的,下面是Vector給出的一個Post-build的工作流:
1)分為兩大塊,左邊是TIER 1(零部件廠商,一般只做單個ECU的公司)的工作流,右邊是OEM(整車廠,比如大眾等)的工作流。
2)TIER 1通過Vector的兩個工具Davinci Developer和Dabinci Configrator Pro配置完,開發后,再用編譯器,編譯鏈接,生成HEX文件。
3)OEM使用Dabinci Configrator可以更改軟件的部分配置(不是全部),然后通過Post Build Tool生成二進制文件,單獨更新配置到ECU
4)Tier1和OEM的主要區別是,OEM不需要編譯器,并且只能配置部分參數。
Post-build分為兩種
1) Post-Build Loadable :配置參數只有一份,單獨保存在flash的一個固定區域(特定地址),可以修改參數配置,可以單獨被更新。
2) Post-Build Selectable :配置參數預先配置好了幾份放在flash的一個固定區域(特定地址),不能修改參數配置,只能從預先放好的配置中選擇一份配置。
Post-build與Link time的區別
1)時間上的不同:Link time是鏈接時配置好,Post-build是編譯鏈接完成后,再需要修改參數
2)Link time完成后,不支持單獨修改參數,要想修改參數需要重新編譯鏈接,Post-build支持單獨修改參數(通過flash擦寫工具,通過UDS服務,通過Bootloader修改參數)
07
總結
注意事項:
1)如果需要使用Post-Build中的Loadable或者Selectable,在購買AUTOSAR時需要選擇,就是說要多給錢。
2)配置參數不是多有的BSW參數都可以配置,哪些參數可以配置,哪些不可以配置需要和OEM溝通好,在AUTOSAR標準中也有定義,比如《AUTOSAR_SWS_COM.pdf》第129頁。
X:表示支持
--:表示不支持
-
AUTOSAR
+關注
關注
10文章
363瀏覽量
21779 -
ecu
+關注
關注
14文章
892瀏覽量
54746 -
預處理器
+關注
關注
0文章
13瀏覽量
2244
發布評論請先 登錄
相關推薦
評論