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