王 民 劉龍龍
(上海汽車集團股份有限公司技術中心 上海 201804)
在整車V模型的開發流程中,軟件測試和標定是非常重要的一環,軟件的功能是否滿足需求需要測試和標定進行驗證。當前,軟件標定功能是基于XCP協議,利用不同的標定測量工具(如INCA、CANape等)開展的,通過將不同的參數進行標定驗證,得出軟件最優化的功能,最終將標定好的參數固化到FLASH中,完成整個標定的過程。傳統的標定方式是這樣實現的:在軟件初始化過程中,定義在FLASH中的參數(標定量)會被全部拷貝到RAM中進行重映射,在請求更改標定量時,通過更改RAM中的數據更改FLASH中的數據,進而影響參數的變化。此過程中,要將FLASH中的所有標定量拷貝到RAM中,需要有足夠大的RAM空間,工程上通常這需要定制有超大RAM的開發芯片。當RAM空間小于所要映射的FLASH空間時,由于部分標定量不能被拷貝到RAM中實現映射,進而導致此部分標定量不能被標定[1]。
由于有超大RAM的芯片只在開發階段使用,其使用量不多,價格通常是量產芯片的一百倍左右。同時能做在線標定的這種ECU控制器也非常昂貴,是常規量產控制器的幾十倍,所以如果在量產小RAM芯片上實現通常的標定功能就能顯而易見地節省一大筆開銷。因此,針對RAM空間小于標定FLASH空間的情況下,如何利用有限的RAM資源實現在線標定功能成為本文的研究目的。
本文基于英飛凌AURIX芯片的Overlay模塊實現ECU在線標定功能開發[2],其他芯片也具有類似的模塊來實現此功能[3-4]。英飛凌AURIX芯片提供了Data Overlay功能以實現FLASH和RAM之間的映射,其目的是實現更改RAM中的內容達到最終更改FLASH中的內容。在程序設計的時候,所有的標定量都會被定義在FLASH中,實現標定FLASH和RAM之間的映射,使得更改RAM中的數據也能更改映射之后的FLASH中的數據,以達到在線標定的目的,Data Overlay功能示意如圖1所示。

圖1 Data Overlay功能示意
針對Data Overlay功能的實現,AURIX芯片定義了32個Overlay塊,每個Overlay塊可通過如下三個參數實現目標地址(FLASH)和映射地址(RAM)之間的映射。
Overlay塊目標地址:被映射的FLASH起始地址。
Overlay塊大小:被映射的FLASH的大小,大小范圍是32~128 KB。
Overlay塊映射地址:映射到的RAM起始地址。
每個Overlay塊有3個寄存器來實現上述三個參數的配置:Overlay塊目標地址通過寄存器OTAR配置。Overlay塊大小通過寄存器OMASK配置。Overlay塊映射地址通過寄存器RABR來配置,其中:RABR.OMEM用于選擇重映射的RAM類型,共有LMU、DSPR、EMEM和EBU四種RAM可用;RABR.OBASE用于選擇映射的RAM起始地址;RABR.OVEN用于使能或不使能目標地址和映射地址之間的映射。Data Overlay的實現原理如圖2所示。

圖2 Data Overlay實現原理
由于XCP標準中已經詳細地描述了在線標定的流程[5],在此只簡單陳述標定的流程。當工程師利用標定工具(Master端,如INCA)與ECU連接的時候,主要包含了如表1所示的指令[6-8]。

表1 連接ECU時的XCP指令集
當Master端RAM空間的checksum數值與ECU端FLASH和RAM空間的checksum數值不一致時,Master會提示是否將Master端的數據下載到ECU RAM端,如果選擇下載,則會執行如表2所示的指令。

表2 ECU Download數據時的XCP指令集
在下載完數據之后,ECU就被切換到RAM PAGE區域,此時定義在FLASH中的標定量就可以被修改。當用戶通過SET_CAL_PAGE ECU to FLASH的時候,ECU就被切換到FLASH PAGE區域,此時定義在FLASH區的標定量就不可以被修改,軟件以定義在FLASH中的標定量原始數值運行。在整個標定過程中,最重要的就是DOWNLOAD和SET_CAL_PAGE指令,本文主要進行的工作就是在ECU接收到Master請求的DOWNLOAD命令時,利用Overlay機制如何動態分配FLASH空間與RAM空間的映射,并將所請求更改的數據拷貝到已實現映射的RAM中去。
由于AURIX芯片支持通過RABR寄存器的OVEN位控制每個Overlay塊單獨的使能和非使能,這就為動態分配Overlay塊以實現FLASH和RAM之間的映射提供了可能。與傳統的標定方式不同的是,基于AURIX的Overlay機制的標定方式不需要FLASH全部與RAM之間進行映射,而只需要對于被標定的變量所在的FLASH進行映射即可,這就需要對FLASH和RAM進行空間上的劃分。由于AURIX芯片只提供了32個Overlay塊可供映射,且可用標定RAM資源只有32 KB,為了最大化地利用RAM資源,在劃分的時候以1 KB為基本單位。例如,標定FLASH空間大小為512 KB,用于標定的RAM資源為32 KB,則需要將FLASH空間劃分為512塊,每塊大小為1 KB,編號為0~511,即FLS0-FLS511,每塊FLASH的起始地址也固定;RAM空間也劃分為32塊,每塊大小也是1 KB,編號為0~31,即RAM0-RAM31,每塊RAM的起始地址也因此固定。這樣就能夠建立起FLASH塊和RAM塊之間的映射網,即FLS0-FLS511可與RAM0-RAM31實現映射,FLS0可以映射到RAM0,FLSn(n不等于0,且小于512)也可以映射到RAM0,但同一時刻,FLS0和FLSn不能同時映射到同一個RAM塊。由于受制于RAM空間大小,最大只能映射32 KB的RAM空間,即FLASH和RAM之間的映射比例為16∶1。FLASH塊和RAM塊之間的映射關系如圖3所示。

圖3 Overlay機制中FLASH和RAM之間的映射關系
Master發送DOWNLOAD指令到ECU,該指令包含了被標定量的地址、被標定量長度、被標定量的新數值信息。ECU解析到該指令時,實現流程如下:
1) 根據被標定量的地址信息,判斷被標定量所在的FLASH塊是否已經與某一RAM塊建立映射關系。若已經實現映射,則執行2);若沒有實現映射,則執行3)。
2) 該FLASH塊已經實現映射,只需要將被標定量的新數據拷貝到映射的RAM空間中即可,此時會出現兩種情況:若被標定量的新數據和FLASH中的數據一致,執行(1);若被標定量的新數據和FLASH中的數據不一致,執行(2)。
(1) 當被標定量的新數據和FLASH中的數據一致時,即軟件在運行時利用FLASH中的數據和RAM中的數據效果是一致的,為提高RAM的利用率,此RAM塊可以解除與FLASH的映射。在此過程中需要將寄存器OTAR設置為0,RABR寄存器的OBASE位設置為0,RABR寄存器的OVEN位設置為0,這樣此RAM塊就解除與FLASH的映射關系,可以為其他FLASH塊的映射提供資源。
(2) 當被標定量的新數據和FLASH中的數據不一致時,則原先的映射關系維持不變,只要將新的標定數據下載到對應的RAM空間中去即可。
3) 被標定量所在的FLASH塊沒有實現與RAM映射,則首先判斷RAM空間是否充足,判斷RAM空間是否充足的方法是掃描32個Overlay塊RABR寄存器的OVEN位是否為1,若所有的RAM塊都已實現映射關系,則表示空間不足,否則表示空間足夠。若空間足夠,則執行(1),若空間不足,則執行(2)。
(1) 當RAM空間充足時,則該FLASH在與RAM映射的時候,按照RAM編號從小到大的順序執行,搜尋到編號為n(n小于32)的RAM未被映射,則需將寄存器OTAR設置為該FLASH塊的起始地址,OMASK設置為代表1 KB大小的0xFE0,RABR寄存器的OBASE位設置為編號為RAMn的起始地址,RABR寄存器的OVEN位設置為1,表示映射已經使能。以上寄存器設置完畢之后,將該FLASH塊中的數據拷貝到映射之后的RAMn空間中,并將新標定數據下載到RAMn空間中的所對應的偏移地址中,這樣軟件在運行的時候利用的是RAMn中的新數據。
(2) 當RAM空間不足時,則不能使能新的映射關系,此時應該返回拒絕命令給Master,以此通知標定人員該標定請求被拒絕。在出現標定拒絕時,有兩種方案可以進行:第一種是將原先不需要的標定量更改回默認數值,根據1)中的(1)可知,此時可以騰出RAM空間為下一次新的標定請求做準備;第二種方案是將所有已經映射的標定量固化到FLASH中,這樣所有的RAM空間都會騰出,為下一次新的標定請求做準備。
上述整個軟件實現的流程如圖4所示。

圖4 基于Overlay動態分配的在線標定流程
為了驗證該軟件是否能夠在RAM空間小于FLASK空間的情況下實現在線標定功能,測試代碼中增加66個標定變量CAL_0-CAL_65和66個觀測變量MEA_0-MEA_65,MEA_0-MEA_65分別被相應的標定變量賦值,66個標定量在編譯時被分配到33個不同的FLASH塊中,其中CAL_0和CAL_1被分配到FLASH0,CAL_2和CAL_3被分配到FLASH1,以此類推。通過在線標定CAL_0-CAL_65為不同的數值,觀測變量MEA_0-MEA_65是否為相應的數值。測試結果如下:
1) 更改標定變量CAL_0為1,觀測變量MEA_0也為1,并且此時只有一個Overlay塊實現FLASH0映射到RAM0,其他Overlay塊不會被設置,如圖5所示。

圖5 只有一個Overlay塊使能
2) 更改標定變量CAL_1為2,觀測變量MEA_1也為2,由于CAL_1和CAL_0被分配在同一個FLASH空間中,因此此時還是只有一個Overlay塊使能,其他Overlay塊不會被設置。
3) 更改標定量CAL_2-CAL_63的數值,觀測變量MEA_2-MEA_63也會隨之更改,此時所有的Overlay塊實現了RAM和FLASH的映射。
4) 更改標定量CAL_64的數值,由于無RAM資源可用,此時會拒絕標定人員的請求。
5) 更改標定變量CAL_0和CAL_1為默認數值,觀測變量MEA_0和MEA_1也回到默認數值,此時FLASH0所映射的RAM0資源已經釋放。再次請求更改標定量CAL_64的數值為65,則觀測變量MEA_64也變為65,標定請求實現,如圖6所示。

圖6 Overlay塊釋放并被重新使能
綜上測試結果,滿足設計要求,即在FLASH空間大于RAM空間的情況下,能夠實現標定量的標定請求,而在標定RAM空間不足的情況下,可提示標定人員釋放不需要的標定RAM空間以為后續標定請求做準備。
針對傳統的標定實現方式,本文分析了其利弊,提出了基于Overlay動態分配管理的在線標定解決方案,其在標定FLASH需求大于RAM空間的情況下,仍能實現所請求的標定變量的標定功能,而不需要與FLASH空間等大的RAM資源,這在開發階段對于節省控制器的成本是非常有利的。
同時,在FLASH和RAM空間比例較大的時候,極端情況下如果標定人員的標定請求非常大,可能會頻繁出現標定量不可被標定的情況。針對這種情況,可有兩種方案解決:一種方案是將使用頻率高的標定量集中定義在相同的幾個FLASH空間中,這樣在映射的時候,就不會占用新的RAM空間,保證每一個映射的RAM區域利用率非常高;另一種方案是增加其他可用的RAM映射區域,如每個核的DSPPR存儲區域,在軟件集成完畢之后,整個軟件運行的RAM使用情況已經明確,可以將暫未利用的RAM區域用來做映射,這也是后期研究的目標。