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