摘 要: 使用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)用程序的下載和更新,在軟件開發(fā)和測(cè)試過程中能夠極大地提高工作效率,,而且Bootloader的穩(wěn)定性也很高,。還能將網(wǎng)絡(luò)層和UDS診斷服務(wù)部分方便地移植到其他芯片上,為后序的軟件開發(fā)與測(cè)試提供了方便,。
關(guān)鍵詞: 引導(dǎo)裝載程序,;在線更新;診斷服務(wù),;CAN總線
0 引言
為了避免在更新程序的過程中拆除ECU,通過串行總線,、SD卡或USB口以及相應(yīng)的通信協(xié)議,,將應(yīng)用程序更新到單片機(jī)中[1]。在更新過程中,,系統(tǒng)不免受到外界干擾和軟件故障等影響,,因此可靠性成為Bootloader開發(fā)工作中首要考慮的因素。同時(shí),,Bootloader也存在軟件升級(jí)的問題,,現(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ù)并通過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)來進(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)過網(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中通過配置FPROT寄存器來保護(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ì)與代碼在同一頁的Flash不能這樣操作。
3.4 安全模式的實(shí)現(xiàn)
安全模式提供安全訪問和下載驗(yàn)證,,本文通過實(shí)現(xiàn)ISO15765[3]中的安全訪問服務(wù)(服務(wù)號(hào)為0x27)來提供下載驗(yàn)證[8],,具體流程是上位機(jī)向ECU發(fā)送requestSeed來申請(qǐng)一個(gè)Seed;得到ECU返回Seed后,,上位機(jī)將Seed進(jìn)行處理得出結(jié)果Key發(fā)送給ECU,,如果Key正確,則得到訪問ECU的授權(quán),。
3.5 最小Bootloader
考慮到Bootloader后續(xù)升級(jí)和同一系列芯片移植的需求,,通過BDM或P&E燒寫進(jìn)芯片的Bootloader僅完成傳送和接收數(shù)據(jù)的這一基本需求,F(xiàn)lash擦寫,、部分診斷服務(wù)和加鎖等程序數(shù)據(jù)通過網(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處開始運(yùn)行[10],,先進(jìn)行一些基本初始化操作,,再根據(jù)有無外部編程請(qǐng)求來決定進(jìn)入Bootloader還是應(yīng)用程序。但是如果升級(jí)過程中出現(xiàn)意外導(dǎo)致升級(jí)失敗,,則再次上電時(shí)可能無法進(jìn)入Bootloader,。為了避免此類情況的發(fā)生,提出Stay-In-Boot的概念,,也就是在上電復(fù)位后即使存在應(yīng)用程序,,也強(qiáng)制單片機(jī)進(jìn)入Bootloader。設(shè)置一個(gè)wait timer,,在wait timer沒有超時(shí)的情況下,,如果收到一個(gè)Stay-In-Boot CAN Message,,則ECU停留在Bootloader中;如果wait timer過期了,,而且應(yīng)用程序有效,,則進(jìn)入應(yīng)用程序。這樣可以有效避免更新程序時(shí)出現(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)中不斷檢測(cè)waitTime的值,如果為零,,則跳轉(zhuǎn)到應(yīng)用程序啟動(dòng)地址,,否則繼續(xù)檢測(cè)CAN網(wǎng)絡(luò)上有無數(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,,將外部開關(guān)設(shè)為啟動(dòng)加載模式,并上電,。通過上位機(jī)發(fā)送編寫完成的“*.s19”文件,,通過CAN網(wǎng)絡(luò)把數(shù)據(jù)流發(fā)送到單片機(jī)中,并運(yùn)行,。多次燒錄均沒有出現(xiàn)數(shù)據(jù)丟失的情況,,能完整地解碼上位機(jī)發(fā)送的數(shù)據(jù)流,而且燒錄后也能成功下載應(yīng)用程序,,應(yīng)用程序能正常工作,,也能持續(xù)響應(yīng)PC端上位機(jī)的診斷請(qǐng)求。
Bootloader的性能指標(biāo)主要在穩(wěn)定性,,另外本文也提出靈活性給開發(fā)工作帶來的好處,。在板子已燒寫了最小Bootloader的前提下,通過上位機(jī)傳送Flash驅(qū)動(dòng)程序和應(yīng)用程序的s19到單片機(jī)(如圖2所示),,通過CANoe檢測(cè)到應(yīng)用程序發(fā)送的報(bào)文[13](如圖3所示),,證明最小Bootloader能正確高效地運(yùn)行,在需要擴(kuò)展Flash時(shí)Bootloader將不需要改變,,更改上位機(jī)發(fā)送的Flash配置文件即可,。
另外,本文采用的是傳輸S-record文件,這有改進(jìn)之處,,通過實(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來優(yōu)化程序,,增強(qiáng)程序的靈活性;開發(fā)過程中增加Stay-In-Boot狀態(tài),,防止刷新出錯(cuò)時(shí)出現(xiàn)死循環(huán),,提高了程序的穩(wěn)定性。經(jīng)測(cè)試證明Bootloader能正確引導(dǎo)程序運(yùn)行,,下載數(shù)據(jù)完整,、無誤,沒有出現(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.