之前Boot是無法再次更新的,也就是說出廠后,Boot的軟件版本就是固定的,除非是拆件。不過現(xiàn)在越來越多的主機(jī)廠要求Boot也要支持刷寫,即使發(fā)生潛在錯(cuò)誤時(shí),Boot也可以更新修復(fù)。另外現(xiàn)在越來越多的ECU實(shí)施AB區(qū)的刷寫方案。下面主要從Boot啟動(dòng)流程、ECU刷寫流程、升級(jí)測(cè)試、Boot自更新方案三方面來梳理。
01. Boot的啟動(dòng)流程
ECU上電后,首先執(zhí)行Boot。Boot首先完成一些基本的初始化,例如CAN驅(qū)動(dòng),IO模塊,初始化完成后,開始檢查刷新請(qǐng)求標(biāo)志位是否為有效,如果刷新請(qǐng)求標(biāo)志位有效,則等待刷寫指令。如果刷新請(qǐng)求標(biāo)志位無效,則檢查應(yīng)用軟件的狀態(tài),如果應(yīng)用軟件是有效的,則應(yīng)用軟件代碼將被執(zhí)行,如果應(yīng)用軟件是無效的,則繼續(xù)執(zhí)行Bootloader代碼。當(dāng)ECU運(yùn)行在應(yīng)用軟件,當(dāng)收到進(jìn)入編程會(huì)話指令,ECU將外部刷新請(qǐng)求標(biāo)志位設(shè)置為有效,并執(zhí)行ECU重啟,如下圖所示。重啟后則按照之前上述的流程檢查。
▲圖 Bootloader啟動(dòng)時(shí)序[來源網(wǎng)絡(luò),侵刪]
02. 刷寫流程
刷新時(shí)序分為三個(gè)編程步驟:
- 預(yù)刷新步驟:刷新前的CAN網(wǎng)絡(luò)準(zhǔn)備;
- 主刷新步驟:下載應(yīng)用軟件或應(yīng)用數(shù)據(jù);
- 后刷新步驟:重同步CAN網(wǎng)絡(luò)。
1#. 預(yù)刷新步驟
預(yù)刷新步驟如下所示。
1、喚醒ECU,喚醒的方法和策略由汽車制造商制定;
2、為了關(guān)閉DTC存儲(chǔ)和運(yùn)行0x28服務(wù)關(guān)閉相關(guān)的通信,需運(yùn)行0x10服務(wù)跳轉(zhuǎn)至擴(kuò)展會(huì)話;
3、進(jìn)入擴(kuò)展會(huì)話后,汽車制造商可以進(jìn)一步進(jìn)行特定數(shù)據(jù)鏈路的初始化;
4、運(yùn)行0x31服務(wù)對(duì)刷寫條件進(jìn)行檢查,例如低壓電是否在正常范圍內(nèi)等。除了條件檢查之外,還會(huì)有一些安全機(jī)制,保證刷寫安全,避免以下幾種情況:
a. 來自非法源的下載動(dòng)作;
b. 當(dāng)前刷新條件不滿足;
c.下載錯(cuò)誤的應(yīng)用軟件或應(yīng)用數(shù)據(jù)到ECU;
d.軟件之間不兼容;措施主要包括以下幾種:
安全訪問:ECU通過診斷0x27服務(wù),SEED&KEY機(jī)制進(jìn)行安全訪問服務(wù)限制,保證ECU免遭未授權(quán)的編程動(dòng)作影響。
刷新預(yù)條件:ECU確保刷新時(shí)處于安全狀態(tài),條件不滿足(如高壓上電、低壓異?;蜍囁俨粸榱悖r(shí),刷新服務(wù)請(qǐng)求將被拒絕。
完整性校驗(yàn):ECU對(duì)即將下載到flash的程序或數(shù)據(jù)進(jìn)行完整性檢查,當(dāng)一個(gè)邏輯模塊下載后,使用CRC32算法驗(yàn)證當(dāng)前邏輯塊的所有數(shù)據(jù)字節(jié)是否被正確傳輸和寫入。
通過“檢查編程完整性”例程控制激活ECU完整性校驗(yàn)。當(dāng)ECU接收到此服務(wù)請(qǐng)求時(shí),Bootloader將計(jì)算下載數(shù)據(jù)字節(jié)的CRC32值,并將計(jì)算結(jié)果與診斷儀請(qǐng)求報(bào)文中發(fā)送的校驗(yàn)值進(jìn)行比較。
一致性檢查:不兼容的軟件不能配合使用,如果配合使用可能會(huì)使功能異?;虍a(chǎn)生致命性錯(cuò)誤。為此,ECU通過驗(yàn)證軟件兼容性來檢查刷新程序的一致性,包括應(yīng)用軟件與Bootloader軟件、應(yīng)用數(shù)據(jù)
與應(yīng)用軟件檢驗(yàn)等。
5、為了防止刷寫過程中出現(xiàn)異常誤觸發(fā)DTC存儲(chǔ),運(yùn)行0x85服務(wù)關(guān)閉DTC的存儲(chǔ);
6、該步驟提供給汽車制造商一個(gè)接口,可以通過0x31服務(wù)啟動(dòng)或關(guān)閉ECU的故障安全響應(yīng)(failsafe reaction);
7、為了提高刷寫速度,降低刷寫程序時(shí)總線負(fù)載率,通過運(yùn)行0x28服務(wù)關(guān)閉無關(guān)報(bào)文,比如應(yīng)用報(bào)文和網(wǎng)絡(luò)管理報(bào)文;
8、在關(guān)閉部分通信之后,通過0x22服務(wù)讀取被刷ECU的狀態(tài)(應(yīng)用軟件和數(shù)據(jù))、軟件指紋信息等;
9、為了減少刷寫的時(shí)間,可以通過0x87服務(wù)提高CAN總線的波特率。
2#. 主刷新步驟
在預(yù)刷新步驟之后,是主刷新步驟。主刷新時(shí)序是單個(gè)ECU刷新事件的應(yīng)用,因此所有服務(wù)的請(qǐng)求都使用物理尋址。
其中:
1、運(yùn)行0x10服務(wù)進(jìn)入programmingSession;
2、運(yùn)行0x27服務(wù)進(jìn)入特定的安全等級(jí);
3、運(yùn)行0x2E服務(wù)將指紋信息寫入ECU;
4、運(yùn)行0x34、0x36、0x37服務(wù)將永久存儲(chǔ)區(qū)寫入默認(rèn)值;
5、運(yùn)行0x31服務(wù)檢查步驟4是否成功,另外一種方法是通過0x37的響應(yīng)確定是否成功;
6、運(yùn)行0x31服務(wù)對(duì)特定的Flash進(jìn)行擦除;
7、分別運(yùn)行0x34、0x36、0x37服務(wù)將Flash driver下載至內(nèi)存中;
8、運(yùn)行0x31服務(wù)檢查Flash driver下載是否成功;
9、分別運(yùn)行0x34、0x36、0x37服務(wù)將軟件和數(shù)據(jù)下載至ECU的flash中;
10、運(yùn)行0x31服務(wù)檢查步驟9是否下載成功;
11、運(yùn)行0x31服務(wù)驗(yàn)證程序是否能正常運(yùn)行,例如checksum、標(biāo)志位等;
12、在下載完軟件和數(shù)據(jù)后,汽車制造產(chǎn)商需要一些特定的操作,比如寫入VIN碼等。
3#. 后刷新步驟
該步驟主要通過0x11服務(wù)對(duì)ECU進(jìn)行復(fù)位或者通過0x10服務(wù)切換至默認(rèn)會(huì)話,如圖3所示,如果在預(yù)編程中中調(diào)整了波特率,須通過特定的操作將波特率調(diào)整至正常值。通常操作是運(yùn)行0x11服務(wù)使ECU復(fù)位,回到正常狀態(tài)。
03. 刷寫測(cè)試用例
刷寫功能開發(fā)完之后,通常都是要按照測(cè)試用例進(jìn)行測(cè)試的,那一般都要做哪些測(cè)試呢,才能證明刷寫功能是OK的呢?主要分為4部分測(cè)試。首先是模擬診斷儀正常刷寫,測(cè)試用例主要包括下圖所示,圖中測(cè)試用例還考慮了標(biāo)定數(shù)據(jù)的刷寫。
▲圖 正常刷寫用例
然后是錯(cuò)誤注入測(cè)試,其前提是錯(cuò)誤刷寫不損壞系統(tǒng)Boot,當(dāng)重新上電后,DUT可以正常更新應(yīng)用程序。用例如下所示。
▲圖 故障注入測(cè)試用例
再之后是刷寫完整性測(cè)試,測(cè)試用例如下所示。
▲圖 完整性測(cè)試用例
最后就是刷寫流程以及預(yù)條件測(cè)試,主要測(cè)試3E服務(wù),前置條件,刷寫失敗等,測(cè)試用例如下圖所示。
04. Boot自更新
Boot自更新的需求現(xiàn)在也是越來越多,主要為了修復(fù)Boot軟件中存在的Bug。以下有幾種Boot自更新的方案。
1#. Supplier Boot(SB) + Customer Boot(CB)
通常情況下,供應(yīng)商都有自己的平臺(tái)軟件,包括Boot和Appl。而各主機(jī)廠都有自己不同的軟件升級(jí)規(guī)范,為了適配主機(jī)廠的需求,通常的做法是加一層Customer Boot來實(shí)現(xiàn)客戶的需求。那軟件的運(yùn)行順序就是SB->CB->Appl,如圖1所示。這種做法可以簡(jiǎn)單、快速的滿足CB也可以更新。
▲圖 SB+CB的升級(jí)方式[來源網(wǎng)絡(luò),侵刪]
不過這種方式,通常情況下通過SB更新CB是通過供應(yīng)商自己定義的升級(jí)流程,并且通過自己的上位機(jī)來實(shí)現(xiàn)升級(jí)。也就意味著這種方式只適應(yīng)項(xiàng)目開發(fā)階段,因?yàn)楣?yīng)商的升級(jí)流程無法接入到整車的OTA流程。這種方式的優(yōu)點(diǎn)就是簡(jiǎn)單,能很快地適配客戶的需求,而且即使面向不同的客戶,只需要簡(jiǎn)單的更改CB就可以滿足需求,適應(yīng)性比較好。但是缺點(diǎn)就是會(huì)浪費(fèi)Flash空間。
2#. 將Boot先放到RAM中運(yùn)行,然后更新Boot的Flash區(qū)域
這種方式只需要一份Boot,其具體方案是,在Boot的鏈接文件中,將程序和數(shù)據(jù)映射到特性的RAM空間,然后在控制器上電時(shí),首先將Boot的代碼和數(shù)據(jù)搬運(yùn)到RAM中,程序運(yùn)行在RAM中,當(dāng)收到更新Boot的需求時(shí)(這里需要上位機(jī)在發(fā)送更新指令的時(shí)候,區(qū)別是更新Boot還是App,比如通過在0x31服務(wù)寫入不同的標(biāo)志位進(jìn)行區(qū)分),通過RAM中的程序以及上位機(jī)下載的Flash Driver,將Boot的Flash區(qū)域進(jìn)行更新。
▲圖 方案二
這種方式的優(yōu)點(diǎn)就是節(jié)省Flash空間,而且如果客戶想把Boot自更新的功能保留到量產(chǎn)之后,也是可以的,因此控制器的升級(jí)是完全遵循主機(jī)廠的要求的。不過這種方式有個(gè)缺點(diǎn),就是在更新過程中,不能斷電,一旦斷電,控制器就會(huì)變成板磚,需要換件。另外程序運(yùn)行在RAM中,對(duì)踩內(nèi)存這種行為更加敏感。不過在整車上,出現(xiàn)意外斷電的情況應(yīng)該很少。首先升級(jí)之前會(huì)檢查低壓蓄電池的電壓水平,甚至對(duì)新能源車來說,可以啟動(dòng)DCDC,來保證12V的穩(wěn)定供應(yīng)。
3#. 兩個(gè)CB+minBoot
這種方案下,有兩個(gè)CB和一個(gè)miniBoot,miniBoot的作用很簡(jiǎn)單,就是根據(jù)引導(dǎo)區(qū)的標(biāo)志位來決定切換到哪個(gè)Boot。
▲圖 2個(gè)CB+miniBoot方案
這種方案的優(yōu)勢(shì)就是可以保證刷新過程中斷電不會(huì)導(dǎo)致控制器變成板磚,而且也可以在SOP之后繼續(xù)使用。缺點(diǎn)也很明顯,空間占用率比較大,軟件復(fù)雜,需要三個(gè)Boot。
轉(zhuǎn)自汽車ECU開發(fā)


