王 琦,黃悅鵬,邢正陽,蘇駿凱,倪孟雄(.南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 0000;.上海奉天電子有限公司,上海 0800)
基于CAN總線的Bootloader設(shè)計(jì)與實(shí)現(xiàn)
王 琦1,黃悅鵬1,邢正陽1,蘇駿凱1,倪孟雄2
(1.南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210000;2.上海奉天電子有限公司,上海 201800)
使用BDM工具下載或升級應(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ā)和測試過程中能夠極大地提高工作效率,而且Bootloader的穩(wěn)定性也很高。還能將網(wǎng)絡(luò)層和UDS診斷服務(wù)部分方便地移植到其他芯片上,為后序的軟件開發(fā)與測試提供了方便。
引導(dǎo)裝載程序;在線更新;診斷服務(wù);CAN總線
為了避免在更新程序的過程中拆除ECU,通過串行總線、SD卡或USB口以及相應(yīng)的通信協(xié)議,將應(yīng)用程序更新到單片機(jī)中[1]。在更新過程中,系統(tǒng)不免受到外界干擾和軟件故障等影響,因此可靠性成為Bootloader開發(fā)工作中首要考慮的因素。同時,Bootloader也存在軟件升級的問題,現(xiàn)行的方案并不完善。為此,本文提出最小Bootloader以保證程序的靈活性,為了應(yīng)對程序更新出錯的意外狀況,提出Stay-In-Boot的概念,增強(qiáng)程序的穩(wěn)定性。
1.1 Bootloader原理
Bootloader的主要工作是初始化硬件設(shè)備、分配內(nèi)存映射等,構(gòu)建良好的軟硬件程序,并決定升級應(yīng)用程序還是繼續(xù)運(yùn)行原有的應(yīng)用程序[2]。如果升級應(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(僅針對 S12G192而言)處運(yùn)行。
1.2 S12G192單片機(jī)的內(nèi)存空間
S12系列單片機(jī)支持兩種尋址方式:局部地址尋址和全局地址尋址。只有在對Flash進(jìn)行操作時才會有全局地址的概念,對RAM和EEPROM進(jìn)行操作時使用局部地址就可以了。
Bootloader應(yīng)該放在受保護(hù)的Flash中,但不是所有Flash都可以設(shè)置保護(hù),所以一般放置在0xc000~0xfeff區(qū)間內(nèi)。
按協(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)識符(SID)及后面所攜帶的參數(shù)格式與內(nèi)容。應(yīng)用層數(shù)據(jù)經(jīng)過網(wǎng)絡(luò)層實(shí)現(xiàn)數(shù)據(jù)的傳輸、打包、解包,數(shù)據(jù)傳輸時以單幀和多幀的方式按ISO15765-2進(jìn)行傳輸。數(shù)據(jù)經(jīng)數(shù)據(jù)鏈路層時應(yīng)按ISO11898-1轉(zhuǎn)化為有效的CAN數(shù)據(jù)幀,最后經(jīng)物理層實(shí)現(xiàn)與另一節(jié)點(diǎn)的通信。被診斷電子控制單元(Electronic Control Unit,ECU)收到請求報(bào)文后,再按協(xié)議體系結(jié)構(gòu)進(jìn)行逐層解析。
單片機(jī)中的Bootloader程序必須設(shè)計(jì)得盡量小,因?yàn)镋CU中有限的Flash容量是由應(yīng)用程序和Bootloader程序共同占用的。本文將Bootloader分為8大部分,如圖1所示。下面詳細(xì)介紹框圖內(nèi)各個組件的設(shè)計(jì)與實(shí)現(xiàn)。
圖1 Bootloader設(shè)計(jì)框圖
3.1 CAN Driver的設(shè)計(jì)與實(shí)現(xiàn)
CAN驅(qū)動完成CAN的底層配置,包括CAN初始化,CAN的發(fā)送和接收函數(shù)。CAN初始化又分為關(guān)看門狗、屏蔽所有中斷、初始化PLL和時鐘等[4]。
3.2 ISO15765協(xié)議的實(shí)現(xiàn)
ISO15765協(xié)議的實(shí)現(xiàn)主要包括udsDiag.c、udsDiag.h、udsNWL.c和udsNWL.h4個文件的配制。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ū)動的實(shí)現(xiàn)
在Flash寫入或擦除數(shù)據(jù)之前,必須驗(yàn)證操作的合法性[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)存空間,因?yàn)樵诖蠖鄶?shù)微控制器平臺中Flash存儲的代碼不能對Flash擦除或編程[7],至少是對與代碼在同一頁的Flash不能這樣操作。
3.4 安全模式的實(shí)現(xiàn)
安全模式提供安全訪問和下載驗(yàn)證,本文通過實(shí)現(xiàn)ISO15765[3]中的安全訪問服務(wù)(服務(wù)號為0x27)來提供下載驗(yàn)證[8],具體流程是上位機(jī)向ECU發(fā)送requestSeed來申請一個Seed;得到ECU返回Seed后,上位機(jī)將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ī)寫進(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 上電啟動流程
ECU上電或者復(fù)位后,程序從0xfffe處開始運(yùn)行[10],先進(jìn)行一些基本初始化操作,再根據(jù)有無外部編程請求來決定進(jìn)入Bootloader還是應(yīng)用程序。但是如果升級過程中出現(xiàn)意外導(dǎo)致升級失敗,則再次上電時可能無法進(jìn)入Bootloader。為了避免此類情況的發(fā)生,提出Stay-In-Boot的概念,也就是在上電復(fù)位后即使存在應(yīng)用程序,也強(qiáng)制單片機(jī)進(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è)計(jì)將waitTime設(shè)置得很大,設(shè)置為5 000。
3.7 測試及結(jié)果分析
用BDM編程工具[11]將實(shí)現(xiàn)的Bootloader燒錄到S12G192[12]單片機(jī)中,隨后移除BDM,將外部開關(guān)設(shè)為啟動加載模式,并上電。通過上位機(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ī)的診斷請求。
Bootloader的性能指標(biāo)主要在穩(wěn)定性,另外本文也提出靈活性給開發(fā)工作帶來的好處。在板子已燒寫了最小Bootloader的前提下,通過上位機(jī)傳送Flash驅(qū)動程序和應(yīng)用程序的s19到單片機(jī)(如圖2所示),通過CANoe檢測到應(yīng)用程序發(fā)送的報(bào)文[13](如圖3所示),證明最小Bootloader能正確高效地運(yùn)行,在需要擴(kuò)展Flash時Bootloader將不需要改變,更改上位機(jī)發(fā)送的Flash配置文件即可。
圖2 上位機(jī)發(fā)送和Bootloader返回的數(shù)據(jù)
圖3 網(wǎng)絡(luò)層偵測的數(shù)據(jù)
另外,本文采用的是傳輸S-record文件,這有改進(jìn)之處,通過實(shí)驗(yàn)證明,直接傳輸hex文件比S-record快近一倍,因?yàn)锽ootloader不再進(jìn)行文件的解析,解析工作交給PC端上位機(jī)。這一改進(jìn)可有效提高量產(chǎn)效率。
本文設(shè)計(jì)并實(shí)現(xiàn)了基于ISO15765協(xié)議的Bootloader,提出使用最小Bootloader來優(yōu)化程序,增強(qiáng)程序的靈活性;開發(fā)過程中增加Stay-In-Boot狀態(tài),防止刷新出錯時出現(xiàn)死循環(huán),提高了程序的穩(wěn)定性。經(jīng)測試證明Bootloader能正確引導(dǎo)程序運(yùn)行,下載數(shù)據(jù)完整、無誤,沒有出現(xiàn)數(shù)據(jù)丟失、錯誤等現(xiàn)象,在高負(fù)載下也能準(zhǔn)確、高效地實(shí)現(xiàn)ECU端程序的在線下載和更新。
[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)場更新方法[J].計(jì)算機(jī)應(yīng)用,2010,30(08):2221-2231.
[7]李婉,李宏.單片機(jī)IAP升級方法在血液中分析儀中的應(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總線的井下視頻信號采集系統(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 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設(shè)計(jì)與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2015,34(18):14-16.
2015-03-30)
王琦(1991-),通信作者,男,碩士研究生,主要研究方向:嵌入式開發(fā)。E-mail:1244967796@qq.com。
黃悅鵬(1990-),男,碩士研究生,主要研究方向:嵌入式開發(fā)。
邢正陽(1991-),男,碩士研究生,主要研究方向:嵌入式開發(fā)。