王 琦,黃悅鵬,邢正陽,蘇駿凱,倪孟雄(.南京郵電大學 通信與信息工程學院,江蘇 南京 0000;.上海奉天電子有限公司,上海 0800)
基于CAN總線的Bootloader設計與實現(xiàn)
王 琦1,黃悅鵬1,邢正陽1,蘇駿凱1,倪孟雄2
(1.南京郵電大學 通信與信息工程學院,江蘇 南京 210000;2.上海奉天電子有限公司,上海 201800)
使用BDM工具下載或升級應用程序,不僅麻煩而且穩(wěn)定性也不高。采用在線更新的方法,設計并實現(xiàn)了一種基于CAN總線的Bootloader。介紹車載網(wǎng)絡通信與診斷服務的實現(xiàn)、Bootloader的設計以及其在車載控制單元的實現(xiàn),并在此基礎上,提出最小Bootloader的概念,可以有效提高程序的靈活性。實驗結(jié)果證明,Bootloader能正確引導加載程序的運行,準確方便地實現(xiàn)應用程序的下載和更新,在軟件開發(fā)和測試過程中能夠極大地提高工作效率,而且Bootloader的穩(wěn)定性也很高。還能將網(wǎng)絡層和UDS診斷服務部分方便地移植到其他芯片上,為后序的軟件開發(fā)與測試提供了方便。
引導裝載程序;在線更新;診斷服務;CAN總線
為了避免在更新程序的過程中拆除ECU,通過串行總線、SD卡或USB口以及相應的通信協(xié)議,將應用程序更新到單片機中[1]。在更新過程中,系統(tǒng)不免受到外界干擾和軟件故障等影響,因此可靠性成為Bootloader開發(fā)工作中首要考慮的因素。同時,Bootloader也存在軟件升級的問題,現(xiàn)行的方案并不完善。為此,本文提出最小Bootloader以保證程序的靈活性,為了應對程序更新出錯的意外狀況,提出Stay-In-Boot的概念,增強程序的穩(wěn)定性。
1.1 Bootloader原理
Bootloader的主要工作是初始化硬件設備、分配內(nèi)存映射等,構(gòu)建良好的軟硬件程序,并決定升級應用程序還是繼續(xù)運行原有的應用程序[2]。如果升級應用程序,則擦除原有程序數(shù)據(jù)并通過CAN網(wǎng)絡把更新的程序下載到 Flash中,再拷貝到RAM中運行;如果繼續(xù)運行原有的應用程序,則把Flash中的應用程序數(shù)據(jù)拷貝到RAM里,程序跳轉(zhuǎn)到地址 0x4000(僅針對 S12G192而言)處運行。
1.2 S12G192單片機的內(nèi)存空間
S12系列單片機支持兩種尋址方式:局部地址尋址和全局地址尋址。只有在對Flash進行操作時才會有全局地址的概念,對RAM和EEPROM進行操作時使用局部地址就可以了。
Bootloader應該放在受保護的Flash中,但不是所有Flash都可以設置保護,所以一般放置在0xc000~0xfeff區(qū)間內(nèi)。
按協(xié)議內(nèi)容和體系結(jié)構(gòu)實現(xiàn)來進行劃分,ISO15765協(xié)議共分為4層,分別是應用層、網(wǎng)絡層、數(shù)據(jù)鏈路層和物理層。應用層診斷協(xié)議設計應遵循ISO14229-1或ISO15765-3,應用層規(guī)定了具體診斷服務的服務標識符(SID)及后面所攜帶的參數(shù)格式與內(nèi)容。應用層數(shù)據(jù)經(jīng)過網(wǎng)絡層實現(xiàn)數(shù)據(jù)的傳輸、打包、解包,數(shù)據(jù)傳輸時以單幀和多幀的方式按ISO15765-2進行傳輸。數(shù)據(jù)經(jīng)數(shù)據(jù)鏈路層時應按ISO11898-1轉(zhuǎn)化為有效的CAN數(shù)據(jù)幀,最后經(jīng)物理層實現(xiàn)與另一節(jié)點的通信。被診斷電子控制單元(Electronic Control Unit,ECU)收到請求報文后,再按協(xié)議體系結(jié)構(gòu)進行逐層解析。
單片機中的Bootloader程序必須設計得盡量小,因為ECU中有限的Flash容量是由應用程序和Bootloader程序共同占用的。本文將Bootloader分為8大部分,如圖1所示。下面詳細介紹框圖內(nèi)各個組件的設計與實現(xiàn)。

圖1 Bootloader設計框圖
3.1 CAN Driver的設計與實現(xiàn)
CAN驅(qū)動完成CAN的底層配置,包括CAN初始化,CAN的發(fā)送和接收函數(shù)。CAN初始化又分為關看門狗、屏蔽所有中斷、初始化PLL和時鐘等[4]。
3.2 ISO15765協(xié)議的實現(xiàn)
ISO15765協(xié)議的實現(xiàn)主要包括udsDiag.c、udsDiag.h、udsNWL.c和udsNWL.h4個文件的配制。udsDiag.c和udsDiag.h用于提供診斷服務[5],udsNWL.c和udsNWL.h用于提供網(wǎng)絡傳輸服務。udsNWL.c中最重要的是從網(wǎng)絡層發(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的授權。
3.5 最小Bootloader
考慮到Bootloader后續(xù)升級和同一系列芯片移植的需求,通過BDM或P&E燒寫進芯片的Bootloader僅完成傳送和接收數(shù)據(jù)的這一基本需求,F(xiàn)lash擦寫、部分診斷服務和加鎖等程序數(shù)據(jù)通過網(wǎng)絡層傳送到單片機寫進指定的內(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。設置一個wait timer,在wait timer沒有超時的情況下,如果收到一個Stay-In-Boot CAN Message,則ECU停留在Bootloader中;如果wait timer過期了,而且應用程序有效,則進入應用程序。這樣可以有效避免更新程序時出現(xiàn)意外導致無法重新刷新的情況,保證了程序的穩(wěn)定性。
3.6.3 主循環(huán)流程
ECU進入Bootloader后,設置全局變量waitTime,每次進入收發(fā)中斷將waitTime減1,在主程序的for循環(huán)中不斷檢測waitTime的值,如果為零,則跳轉(zhuǎn)到應用程序啟動地址,否則繼續(xù)檢測CAN網(wǎng)絡上有無數(shù)據(jù)可接收。為了保證CAN網(wǎng)絡上的數(shù)據(jù)能夠完整接收,本設計將waitTime設置得很大,設置為5 000。
3.7 測試及結(jié)果分析
用BDM編程工具[11]將實現(xiàn)的Bootloader燒錄到S12G192[12]單片機中,隨后移除BDM,將外部開關設為啟動加載模式,并上電。通過上位機發(fā)送編寫完成的“*.s19”文件,通過CAN網(wǎng)絡把數(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配置文件即可。

圖2 上位機發(fā)送和Bootloader返回的數(shù)據(jù)

圖3 網(wǎng)絡層偵測的數(shù)據(jù)
另外,本文采用的是傳輸S-record文件,這有改進之處,通過實驗證明,直接傳輸hex文件比S-record快近一倍,因為Bootloader不再進行文件的解析,解析工作交給PC端上位機。這一改進可有效提高量產(chǎn)效率。
本文設計并實現(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的設計與實現(xiàn)[J].計算機工程,2011,37(12):233-235.
[5]李銳,王晶瑩,姚燕,等.基于 ISO15765的車載 CAN網(wǎng)絡診斷設計[J].計算機工程,2012,38(4):35-36.
[6]李權,鄢萍,賀曉輝.高可靠性的嵌入式軟件現(xiàn)場更新方法[J].計算機應用,2010,30(08):2221-2231.
[7]李婉,李宏.單片機IAP升級方法在血液中分析儀中的應用[J].微型機與應用,2014,33(21):16-18.
[8]王冬良.基于CAN總線的轉(zhuǎn)向角傳感器采集電路設計[J].微型機與應用,2014,33(22):77-79.
[9]張家田,王金成,嚴正娟,等.基于CAN總線的井下視頻信號采集系統(tǒng)設計[J].電子應用技術,2013,39(12):15-21.
[10]何海波.基于XC2287M的工程機械ECU設計[J].電子應用技術,2014,40(12):27-29.
[11]羅峰,孫澤昌.汽車CAN總線系統(tǒng)原理、設計與應用[M].北京:電子工業(yè)出版社,2011.
[12]Freescale.MC9S12G family reference manualand data sheet[Z].2013.
[13]International Organization for Standardization.ISO 14229-2006 road vehicles——unified diagnostics services(UDS)specification and requirements(v2)[S].2006.
Design and implement of Bootloader based on CAN bus
Wang Qi1,Huang Yuepeng1,Xing Zhengyang1,Su Junkai1,Ni Mengxiong2
(1.School of Telecommunication and Information Engineering,Nanjing University of Posts and Telecommunications,Nanjing 210000,China;2.Shanghai Fengtian Electronic Co.,Ltd.,Shanghai 201800,China)
Using BDM tools to download or upgrade the application brings not only inconvenience but also low reliability.This paper designs and implements a Bootloader based on CAN bus to download or update application online.It introduces implements of network communication and diagnostic services,design of Bootloader and its implements in vehicle control unit.And on this basis,it puts forward minimum Bootloader,which can improve flexibility efficiently.Test proves that Bootloader can boot and load correctly,download and update applications accurately and conveniently,which can improve efficiency in software development and test greatly. Also,stability of this Bootloader is very high.Moreover,network layer and UDS diagnostic services of this Bootloader can be transplanted to other chips,providing convenience for following software development and test.
Bootloader;online update;diagnostic services;CAN bus
TP391
A
1674-7720(2015)18-0014-03
王琦,黃悅鵬,邢正陽,等.基于CAN總線的Bootloader設計與實現(xiàn)[J].微型機與應用,2015,34(18):14-16.
2015-03-30)
王琦(1991-),通信作者,男,碩士研究生,主要研究方向:嵌入式開發(fā)。E-mail:1244967796@qq.com。
黃悅鵬(1990-),男,碩士研究生,主要研究方向:嵌入式開發(fā)。
邢正陽(1991-),男,碩士研究生,主要研究方向:嵌入式開發(fā)。