《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于CAN總線的Bootloader設(shè)計(jì)與實(shí)現(xiàn)
基于CAN總線的Bootloader設(shè)計(jì)與實(shí)現(xiàn)
2015年微型機(jī)與應(yīng)用第18期
王 琦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ā)與測試提供了方便。
Abstract:
Key words :

  摘  要: 使用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ā)與測試提供了方便。

  關(guān)鍵詞引導(dǎo)裝載程序;在線更新;診斷服務(wù);CAN總線

0 引言

  為了避免在更新程序的過程中拆除ECU,通過串行總線、SD卡或USB口以及相應(yīng)的通信協(xié)議,將應(yīng)用程序更新到單片機(jī)中[1]。在更新過程中,系統(tǒng)不免受到外界干擾和軟件故障等影響,因此可靠性成為Bootloader開發(fā)工作中首要考慮的因素。同時(shí),Bootloader也存在軟件升級的問題,現(xiàn)行的方案并不完善。為此,本文提出最小Bootloader以保證程序的靈活性,為了應(yīng)對程序更新出錯(cuò)的意外狀況,提出Stay-In-Boot的概念,增強(qiáng)程序的穩(wěn)定性。

1 Bootloader部分

  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)行操作時(shí)才會(huì)有全局地址的概念,對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)收到請求報(bào)文后,再按協(xié)議體系結(jié)構(gòu)進(jìn)行逐層解析。

3 基于ISO15765的Bootloader設(shè)計(jì)與實(shí)現(xiàn)

001.jpg


  單片機(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對每個(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ǔ)的代碼不能對Flash擦除或編程[7],至少是對與代碼在同一頁的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來申請一個(gè)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 上電啟動(dòng)流程

  ECU上電或者復(fù)位后,程序從0xfffe處開始運(yùn)行[10],先進(jìn)行一些基本初始化操作,再根據(jù)有無外部編程請求來決定進(jìn)入Bootloader還是應(yīng)用程序。但是如果升級過程中出現(xiàn)意外導(dǎo)致升級失敗,則再次上電時(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)中不斷檢測waitTime的值,如果為零,則跳轉(zhuǎn)到應(yīng)用程序啟動(dò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è)為啟動(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ī)的診斷請求。

002.jpg

  Bootloader的性能指標(biāo)主要在穩(wěn)定性,另外本文也提出靈活性給開發(fā)工作帶來的好處。在板子已燒寫了最小Bootloader的前提下,通過上位機(jī)傳送Flash驅(qū)動(dòng)程序和應(yīng)用程序的s19到單片機(jī)(如圖2所示),通過CANoe檢測到應(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)測試證明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)場更新方法[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總線的井下視頻信號(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.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。