摘 要: 使用BDM工具下載或升級應(yīng)用程序,不僅麻煩而且穩(wěn)定性也不高。采用在線更新的方法,設(shè)計并實現(xiàn)了一種基于CAN總線的Bootloader。介紹車載網(wǎng)絡(luò)通信與診斷服務(wù)的實現(xiàn)、Bootloader的設(shè)計以及其在車載控制單元的實現(xiàn),并在此基礎(chǔ)上,提出最小Bootloader的概念,可以有效提高程序的靈活性。實驗結(jié)果證明,Bootloader能正確引導(dǎo)加載程序的運行,準(zhǔn)確方便地實現(xiàn)應(yīng)用程序的下載和更新,在軟件開發(fā)和測試過程中能夠極大地提高工作效率,而且Bootloader的穩(wěn)定性也很高。還能將網(wǎng)絡(luò)層和UDS診斷服務(wù)部分方便地移植到其他芯片上,為后序的軟件開發(fā)與測試提供了方便。
關(guān)鍵詞: 引導(dǎo)裝載程序;在線更新;診斷服務(wù);CAN總線
0 引言
為了避免在更新程序的過程中拆除ECU,通過串行總線、SD卡或USB口以及相應(yīng)的通信協(xié)議,將應(yīng)用程序更新到單片機中[1]。在更新過程中,系統(tǒng)不免受到外界干擾和軟件故障等影響,因此可靠性成為Bootloader開發(fā)工作中首要考慮的因素。同時,Bootloader也存在軟件升級的問題,現(xiàn)行的方案并不完善。為此,本文提出最小Bootloader以保證程序的靈活性,為了應(yīng)對程序更新出錯的意外狀況,提出Stay-In-Boot的概念,增強程序的穩(wěn)定性。
1 Bootloader部分
1.1 Bootloader原理
Bootloader的主要工作是初始化硬件設(shè)備、分配內(nèi)存映射等,構(gòu)建良好的軟硬件程序,并決定升級應(yīng)用程序還是繼續(xù)運行原有的應(yīng)用程序[2]。如果升級應(yīng)用程序,則擦除原有程序數(shù)據(jù)并通過CAN網(wǎng)絡(luò)把更新的程序下載到Flash中,再拷貝到RAM中運行;如果繼續(xù)運行原有的應(yīng)用程序,則把Flash中的應(yīng)用程序數(shù)據(jù)拷貝到RAM里,程序跳轉(zhuǎn)到地址0x4000(僅針對S12G192而言)處運行。
1.2 S12G192單片機的內(nèi)存空間
S12系列單片機支持兩種尋址方式:局部地址尋址和全局地址尋址。只有在對Flash進(jìn)行操作時才會有全局地址的概念,對RAM和EEPROM進(jìn)行操作時使用局部地址就可以了。
Bootloader應(yīng)該放在受保護(hù)的Flash中,但不是所有Flash都可以設(shè)置保護(hù),所以一般放置在0xc000~0xfeff區(qū)間內(nèi)。
2 ISO15765協(xié)議[3]
按協(xié)議內(nèi)容和體系結(jié)構(gòu)實現(xiàn)來進(jìn)行劃分,ISO15765協(xié)議共分為4層,分別是應(yīng)用層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層和物理層。應(yīng)用層診斷協(xié)議設(shè)計應(yīng)遵循ISO14229-1或ISO15765-3,應(yīng)用層規(guī)定了具體診斷服務(wù)的服務(wù)標(biāo)識符(SID)及后面所攜帶的參數(shù)格式與內(nèi)容。應(yīng)用層數(shù)據(jù)經(jīng)過網(wǎng)絡(luò)層實現(xiàn)數(shù)據(jù)的傳輸、打包、解包,數(shù)據(jù)傳輸時以單幀和多幀的方式按ISO15765-2進(jìn)行傳輸。數(shù)據(jù)經(jīng)數(shù)據(jù)鏈路層時應(yīng)按ISO 11898-1轉(zhuǎn)化為有效的CAN數(shù)據(jù)幀,最后經(jīng)物理層實現(xiàn)與另一節(jié)點的通信。被診斷電子控制單元(Electronic Control Unit,ECU)收到請求報文后,再按協(xié)議體系結(jié)構(gòu)進(jìn)行逐層解析。
3 基于ISO15765的Bootloader設(shè)計與實現(xiàn)
單片機中的Bootloader程序必須設(shè)計得盡量小,因為ECU中有限的Flash容量是由應(yīng)用程序和Bootloader程序共同占用的。本文將Bootloader分為8大部分,如圖1所示。下面詳細(xì)介紹框圖內(nèi)各個組件的設(shè)計與實現(xiàn)。
3.1 CAN Driver的設(shè)計與實現(xiàn)
CAN驅(qū)動完成CAN的底層配置,包括CAN初始化,CAN的發(fā)送和接收函數(shù)。CAN初始化又分為關(guān)看門狗、屏蔽所有中斷、初始化PLL和時鐘等[4]。
3.2 ISO15765協(xié)議的實現(xiàn)
ISO15765協(xié)議的實現(xiàn)主要包括udsDiag.c、udsDiag.h、udsNWL.c和udsNWL.h 4個文件的配制。udsDiag.c和udsDiag.h用于提供診斷服務(wù)[5],udsNWL.c和udsNWL.h用于提供網(wǎng)絡(luò)傳輸服務(wù)。udsNWL.c中最重要的是從網(wǎng)絡(luò)層發(fā)送和接收數(shù)據(jù)的兩個函數(shù)。udsDiag.c對每個服務(wù)進(jìn)行響應(yīng)。
3.3 Flash驅(qū)動的實現(xiàn)
在Flash寫入或擦除數(shù)據(jù)之前,必須驗證操作的合法性[6],在S12G192中通過配置FPROT寄存器來保護(hù)Flash不受非法的擦寫。在下載應(yīng)用程序時把Flash Driver下載到ECU的RAM中,應(yīng)用程序下載完成后再把RAM中的數(shù)據(jù)清除,ECU進(jìn)入正常操作模式。這樣不僅可以保護(hù)Bootloader,還能節(jié)省Flash內(nèi)存空間,因為在大多數(shù)微控制器平臺中Flash存儲的代碼不能對Flash擦除或編程[7],至少是對與代碼在同一頁的Flash不能這樣操作。
3.4 安全模式的實現(xiàn)
安全模式提供安全訪問和下載驗證,本文通過實現(xiàn)ISO15765[3]中的安全訪問服務(wù)(服務(wù)號為0x27)來提供下載驗證[8],具體流程是上位機向ECU發(fā)送requestSeed來申請一個Seed;得到ECU返回Seed后,上位機將Seed進(jìn)行處理得出結(jié)果Key發(fā)送給ECU,如果Key正確,則得到訪問ECU的授權(quán)。
3.5 最小Bootloader
考慮到Bootloader后續(xù)升級和同一系列芯片移植的需求,通過BDM或P&E燒寫進(jìn)芯片的Bootloader僅完成傳送和接收數(shù)據(jù)的這一基本需求,F(xiàn)lash擦寫、部分診斷服務(wù)和加鎖等程序數(shù)據(jù)通過網(wǎng)絡(luò)層傳送到單片機寫進(jìn)指定的內(nèi)存空間,這一舉措不僅方便Bootloader實現(xiàn)增量更新,還能提高Bootloader的可移植性。
3.6 Bootloader主程序
3.6.1 初始化流程
單片機復(fù)位后,在調(diào)用主程序之前,進(jìn)入Start12.c源文件。執(zhí)行Init(void)函數(shù),完成的操作有清空RAM空間,把初始化數(shù)據(jù)從ROM拷貝到RAM等[9]。
3.6.2 上電啟動流程
ECU上電或者復(fù)位后,程序從0xfffe處開始運行[10],先進(jìn)行一些基本初始化操作,再根據(jù)有無外部編程請求來決定進(jìn)入Bootloader還是應(yīng)用程序。但是如果升級過程中出現(xiàn)意外導(dǎo)致升級失敗,則再次上電時可能無法進(jìn)入Bootloader。為了避免此類情況的發(fā)生,提出Stay-In-Boot的概念,也就是在上電復(fù)位后即使存在應(yīng)用程序,也強制單片機進(jìn)入Bootloader。設(shè)置一個wait timer,在wait timer沒有超時的情況下,如果收到一個Stay-In-Boot CAN Message,則ECU停留在Bootloader中;如果wait timer過期了,而且應(yīng)用程序有效,則進(jìn)入應(yīng)用程序。這樣可以有效避免更新程序時出現(xiàn)意外導(dǎo)致無法重新刷新的情況,保證了程序的穩(wěn)定性。
3.6.3 主循環(huán)流程
ECU進(jìn)入Bootloader后,設(shè)置全局變量waitTime,每次進(jìn)入收發(fā)中斷將waitTime減1,在主程序的for循環(huán)中不斷檢測waitTime的值,如果為零,則跳轉(zhuǎn)到應(yīng)用程序啟動地址,否則繼續(xù)檢測CAN網(wǎng)絡(luò)上有無數(shù)據(jù)可接收。為了保證CAN網(wǎng)絡(luò)上的數(shù)據(jù)能夠完整接收,本設(shè)計將waitTime設(shè)置得很大,設(shè)置為5 000。
3.7 測試及結(jié)果分析
用BDM編程工具[11]將實現(xiàn)的Bootloader燒錄到S12G192[12]單片機中,隨后移除BDM,將外部開關(guān)設(shè)為啟動加載模式,并上電。通過上位機發(fā)送編寫完成的“*.s19”文件,通過CAN網(wǎng)絡(luò)把數(shù)據(jù)流發(fā)送到單片機中,并運行。多次燒錄均沒有出現(xiàn)數(shù)據(jù)丟失的情況,能完整地解碼上位機發(fā)送的數(shù)據(jù)流,而且燒錄后也能成功下載應(yīng)用程序,應(yīng)用程序能正常工作,也能持續(xù)響應(yīng)PC端上位機的診斷請求。
Bootloader的性能指標(biāo)主要在穩(wěn)定性,另外本文也提出靈活性給開發(fā)工作帶來的好處。在板子已燒寫了最小Bootloader的前提下,通過上位機傳送Flash驅(qū)動程序和應(yīng)用程序的s19到單片機(如圖2所示),通過CANoe檢測到應(yīng)用程序發(fā)送的報文[13](如圖3所示),證明最小Bootloader能正確高效地運行,在需要擴展Flash時Bootloader將不需要改變,更改上位機發(fā)送的Flash配置文件即可。
另外,本文采用的是傳輸S-record文件,這有改進(jìn)之處,通過實驗證明,直接傳輸hex文件比S-record快近一倍,因為Bootloader不再進(jìn)行文件的解析,解析工作交給PC端上位機。這一改進(jìn)可有效提高量產(chǎn)效率。
4 結(jié)論
本文設(shè)計并實現(xiàn)了基于ISO15765協(xié)議的Bootloader,提出使用最小Bootloader來優(yōu)化程序,增強程序的靈活性;開發(fā)過程中增加Stay-In-Boot狀態(tài),防止刷新出錯時出現(xiàn)死循環(huán),提高了程序的穩(wěn)定性。經(jīng)測試證明Bootloader能正確引導(dǎo)程序運行,下載數(shù)據(jù)完整、無誤,沒有出現(xiàn)數(shù)據(jù)丟失、錯誤等現(xiàn)象,在高負(fù)載下也能準(zhǔn)確、高效地實現(xiàn)ECU端程序的在線下載和更新。
參考文獻(xiàn)
[1] 王亞剛.嵌入式Bootloader機制的分析與移植[J].計算機工程,2010,36(06):267-269.
[2] Cheng Anyu, Yao Yan, Duan Zhihui, et al. ECU loader design of in-vehicle CAN network based on ISO15765[C].International Conference on Information Science and Technology, 2011:1215-1217.
[3] International Organization for Standardization. ISO 15765-2004 road vehicles-diagnostic on controller area network(CAN)[S]. 2004.
[4] 張艷,鮑可進(jìn).整車控制器Bootloader的設(shè)計與實現(xiàn)[J].計算機工程,2011,37(12):233-235.
[5] 李銳,王晶瑩,姚燕,等.基于ISO15765的車載CAN網(wǎng)絡(luò)診斷設(shè)計[J].計算機工程,2012,38(4):35-36.
[6] 李權(quán),鄢萍,賀曉輝.高可靠性的嵌入式軟件現(xiàn)場更新方法[J].計算機應(yīng)用,2010,30(08):2221-2231.
[7] 李婉,李宏.單片機IAP升級方法在血液中分析儀中的應(yīng)用[J].微型機與應(yīng)用,2014,33(21):16-18.
[8] 王冬良.基于CAN總線的轉(zhuǎn)向角傳感器采集電路設(shè)計[J].微型機與應(yīng)用,2014,33(22):77-79.
[9] 張家田,王金成,嚴(yán)正娟,等.基于CAN總線的井下視頻信號采集系統(tǒng)設(shè)計[J].電子應(yīng)用技術(shù),2013,39(12):15-21.
[10] 何海波.基于XC2287M的工程機械ECU設(shè)計[J].電子應(yīng)用技術(shù),2014,40(12):27-29.
[11] 羅峰,孫澤昌.汽車CAN總線系統(tǒng)原理、設(shè)計與應(yīng)用[M].北京:電子工業(yè)出版社,2011.
[12] Freescale.MC9S12G family reference manual and data sheet[Z]. 2013.
[13] International Organization for Standardization. ISO 14229-2006 road vehicles——unified diagnostics services(UDS) specification and requirements(v2)[S]. 2006.