郭帥 孫曉鵬 李苑瑋
(濰柴動(dòng)力股份有限公司 山東省濰坊市 261000)
Bootloader 作為引導(dǎo)加載程序,是變速箱控制器(TCU)應(yīng)用程序在線(xiàn)升級(jí)不可或缺的一部分,然而大多數(shù)研究中是將Bootloader 程序與用戶(hù)程序分開(kāi)寫(xiě)入變速箱控制器芯片內(nèi),這使得變速箱控制系統(tǒng)的開(kāi)發(fā)便捷性降低,而在工程實(shí)際應(yīng)用中,往往需要簡(jiǎn)化控制系統(tǒng)的開(kāi)發(fā)流程,減少軟件的開(kāi)發(fā)時(shí)間。
開(kāi)發(fā)人員對(duì)Bootloader 進(jìn)行了大量基礎(chǔ)研究,發(fā)現(xiàn)Bootloader與芯片內(nèi)存結(jié)構(gòu)是強(qiáng)相關(guān)的,不同控制器芯片對(duì)應(yīng)的Bootloader內(nèi)存及協(xié)議是完全不同的。樂(lè)志國(guó)等[1]設(shè)計(jì)了基于恩智浦MC9S12XDP512 控制器芯片的Bootloader 系統(tǒng),并設(shè)計(jì)了上位機(jī)操作系統(tǒng),實(shí)現(xiàn)了軟件在線(xiàn)編程;劉矗等[2]使用自定義的CAN總線(xiàn)傳輸協(xié)議,設(shè)計(jì)了基于恩智浦16 位微控制器的通用CAN Bootloader,實(shí)現(xiàn)該類(lèi)控制器芯片的通用化設(shè)計(jì);戚長(zhǎng)城等[3]設(shè)計(jì)了基于恩智浦MC9S12G128 的Bootloader 系統(tǒng),仿照電腦U 啟動(dòng)的模式,將Bootloader 目標(biāo)代碼存儲(chǔ)于U 盤(pán)中,節(jié)省了控制器的內(nèi)存空間。雖然這些研究從不同角度,闡述了基于各類(lèi)控制器芯片的研究方法,但這僅將Bootloader 程序作為個(gè)體進(jìn)行研究,沒(méi)有將用戶(hù)程序和Bootloader 進(jìn)行融合考慮,不能體現(xiàn)Bootloader 技術(shù)在變速箱控制系統(tǒng)開(kāi)發(fā)中的優(yōu)勢(shì),不能滿(mǎn)足變速箱控制器應(yīng)用程序的開(kāi)發(fā)效率。
本文采用自定義的CAN 數(shù)據(jù)傳輸協(xié)議,設(shè)計(jì)一套融合用戶(hù)程序和Bootloader 程序的Bootloader 系統(tǒng),使用Flash 加載執(zhí)行的方法對(duì)TCU 的Bootloader 進(jìn)行設(shè)計(jì),將周立功USBCAN-II 智能CAN 接口卡作為連接硬件,通過(guò)VB6.0 開(kāi)發(fā)上位機(jī)系統(tǒng),同時(shí)搭建一個(gè)基于恩智浦MC9S12XEP100 單片機(jī)的硬件平臺(tái),并對(duì)所設(shè)計(jì)的Bootloader 系統(tǒng)進(jìn)行功能測(cè)試。
Bootloader 是嵌入式控制器上電后運(yùn)行的第一段程序,它根據(jù)指令對(duì)數(shù)據(jù)升級(jí)和應(yīng)用程序執(zhí)行兩個(gè)功能進(jìn)行選擇[4,17]。所設(shè)計(jì)的變速箱控制系統(tǒng)Bootloader 以CAN 總線(xiàn)技術(shù)為基礎(chǔ),分為變速箱控制器Bootloader 程序和上位機(jī)Bootloader 程序兩部分。
通常,Bootloader 嚴(yán)重依賴(lài)硬件,不同控制器之間Bootloader無(wú)法做到完全移植,所以對(duì)于嵌入式系統(tǒng)而言,不同主控芯片的硬件平臺(tái)Bootloader 的實(shí)現(xiàn)也各不相同,但是其思路和框架是基本一樣的[6]。本文設(shè)計(jì)的變速箱控制系統(tǒng)的Bootloader 主要有:Bootloader 初始化流程、CAN 通信模塊設(shè)置、FLASH 擦寫(xiě)模塊設(shè)計(jì)、重建用戶(hù)程序中斷向量、融合Bootloader 程序和用戶(hù)程序。

圖1:Bootloader 初始化流程

圖2:MSCAN 初始化流程

圖3:程序融合流程

圖4:升級(jí)程序成功界面

圖5:Bootloader 硬件平臺(tái)

圖6:用戶(hù)程序的S19 文件
一般在沒(méi)有Bootloader 的系統(tǒng)中,程序上電后,經(jīng)過(guò)底層初始化,會(huì)直接跳轉(zhuǎn)到用戶(hù)程序的main 函數(shù)內(nèi)執(zhí)行,而有Bootloader的系統(tǒng)上電后,首先要根據(jù)指令狀態(tài),在用戶(hù)程序和Bootloader 之間進(jìn)行選擇。通常,進(jìn)入Bootloader 程序的情況一般有三種:在復(fù)位時(shí),對(duì)特定通信口的關(guān)鍵字檢測(cè);在復(fù)位時(shí),對(duì)特定硬件IO 檢測(cè);在運(yùn)行時(shí),對(duì)特定通信口的關(guān)鍵字檢測(cè)。由于第一種方法屬于超時(shí)機(jī)制,需要編寫(xiě)代碼實(shí)現(xiàn),比較復(fù)雜,第三種方法需要特定的協(xié)議棧做支持,所以選擇第二種簡(jiǎn)便有效的方式。
Bootloader 初始化流程如圖1所示。單片機(jī)的P 端口第0 引腳(PP0)接按鍵,系統(tǒng)復(fù)位后,獲取復(fù)位中斷地址處引導(dǎo)加載程序首地址,檢測(cè)到指令按鍵按下,則執(zhí)行Bootloader 程序;否則,檢測(cè)用戶(hù)程序復(fù)位中斷地址,防止控制器內(nèi)只有Bootloader 程序而沒(méi)有用戶(hù)程序的情況發(fā)生。
通信模塊負(fù)責(zé)變速箱控制器與上位機(jī)間的指令交互,以及數(shù)據(jù)升級(jí)過(guò)程中數(shù)據(jù)文件的傳輸。本文通訊程序采用CAN 通信的方式,通過(guò)對(duì)MC9S12XEP100 單片機(jī)CAN 通訊模塊的寄存器進(jìn)行配置[7,8],實(shí)現(xiàn)正常的指令交互和數(shù)據(jù)傳輸。
MSCAN 初始化流程如圖2所示。為了提高數(shù)據(jù)傳輸?shù)男剩鶕?jù)CAN 通信協(xié)議,選取合適的時(shí)鐘源,本文設(shè)計(jì)的TCU 選取振蕩器作為時(shí)鐘源,經(jīng)過(guò)預(yù)分頻器分頻處理得到的CAN 通信波特率為250Kbps;為了保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性,設(shè)置CAN 通信濾波的代碼和掩碼,選取擴(kuò)展幀并設(shè)置相應(yīng)濾波器,使TCU 僅接收上位機(jī)發(fā)送的CAN 報(bào)文。
MC9S12XEP100 單片機(jī)在Flash 擦寫(xiě)過(guò)程中,對(duì)時(shí)鐘和晶振有嚴(yán)格的要求。節(jié)點(diǎn)使用的晶振必須足夠高,才能保證對(duì)Flash 扇區(qū)的正常操作。FLASH 總線(xiàn)時(shí)鐘是外部振蕩器時(shí)鐘經(jīng)過(guò)時(shí)鐘分頻寄存器(FDIV)分頻得到的,晶振時(shí)鐘的分頻寄存器需要合理設(shè)置,太高太低,都會(huì)導(dǎo)致對(duì)內(nèi)存的操作產(chǎn)生問(wèn)題。所以對(duì)于恩智浦EP100 微控制器來(lái)說(shuō),將外部晶振設(shè)為16MHz,F(xiàn)DIV 設(shè)為0x0F。
MC9S12XEP100 單片機(jī)的寫(xiě)入操作以8 個(gè)字節(jié)為基礎(chǔ),并且只能以8 個(gè)字節(jié)對(duì)齊的方式進(jìn)行寫(xiě)入;在擦除時(shí),最小單位為扇區(qū),每個(gè)扇區(qū)大小為256 字節(jié),不能擦除一個(gè)字節(jié)或者小于一個(gè)扇區(qū)的內(nèi)容[9]。
為了實(shí)現(xiàn)程序在Bootloader 模式和用戶(hù)程序模式之間轉(zhuǎn)換,Bootloader 程序內(nèi)需重建復(fù)位中斷向量。對(duì)于恩智浦MC9S12XEP100 單片機(jī)來(lái)說(shuō),在芯片末尾地址的這兩個(gè)字節(jié)的內(nèi)存空間處存放的是用戶(hù)程序的復(fù)位中斷向量的地址[10-13]。在沒(méi)有Bootloader 的程序內(nèi),上電復(fù)位后,芯片會(huì)從該地址處讀取用戶(hù)程序的首地址開(kāi)始運(yùn)行;在有Bootloader 的程序內(nèi),該地址里存放的不再是用戶(hù)程序的首地址,而是引導(dǎo)加載程序的首地址,為了防止與Bootloader 中斷地址產(chǎn)生沖突,用戶(hù)程序的復(fù)位向量被放在了單獨(dú)開(kāi)辟的一塊內(nèi)存中,使單片機(jī)上電復(fù)位后先判斷引導(dǎo)加載程序。
企業(yè)存在對(duì)HSE管理體系運(yùn)行監(jiān)督不嚴(yán)格、不系統(tǒng)、不全面的實(shí)際問(wèn)題,難以實(shí)現(xiàn)對(duì)HSE管理體系運(yùn)行的有效調(diào)控,出現(xiàn)了監(jiān)督缺位、工作缺失等一系列問(wèn)題。代表性的問(wèn)題有:一是,企業(yè)沒(méi)有對(duì)HSE管理體系運(yùn)行的重點(diǎn)監(jiān)督體系,出現(xiàn)對(duì)HSE管理體系實(shí)際運(yùn)行的控制不良、監(jiān)督不系統(tǒng)等問(wèn)題,特別是對(duì)于HSE管理體系運(yùn)行的細(xì)節(jié)難以達(dá)到全面控制,被表面性的日常工作所困擾而造成監(jiān)督效果和功能不良等問(wèn)題。二是,監(jiān)督體系中沒(méi)有將預(yù)防思想作為監(jiān)督工作的第一原則,“以罰代管”、“以查代管”的問(wèn)題頻繁出現(xiàn),難以確保HSE管理體系全面、系統(tǒng)地運(yùn)行,產(chǎn)生了HSE管理體系運(yùn)行的危害性和危險(xiǎn)性。
復(fù)雜的Bootloader 程序自身會(huì)用到定時(shí)器中斷、CAN 的接收和發(fā)送中斷等,因而B(niǎo)ootloader 程序內(nèi)需要重建中斷向量表,與用戶(hù)程序的中斷進(jìn)行區(qū)分,使兩個(gè)程序的中斷不至于產(chǎn)生沖突,即重新設(shè)置中斷向量表基址寄存器(IVBR)。本文設(shè)計(jì)的Bootloader程序采用在線(xiàn)編程的方法改變中斷函數(shù)的入口地址,將用戶(hù)程序中斷函數(shù)的入口地址改為所分扇區(qū)首地址,使用戶(hù)程序與Bootloader程序使用不同F(xiàn)LASH 區(qū)間來(lái)定義中斷向量表,使兩段程序的中斷互不影響[14,15]。這種方式雖然要在Bootloader 程序內(nèi)對(duì)用戶(hù)程序的中斷向量表進(jìn)行搬移,但是不需要更改用戶(hù)程序內(nèi)中斷向量表的存儲(chǔ)區(qū)間,使用戶(hù)程序和Bootloader 程序的中斷可以完美的融合。

表1:Bootloader 上位機(jī)協(xié)議

圖7:芯片內(nèi)存數(shù)據(jù)
Bootloader 和用戶(hù)程序融合的過(guò)程如圖3所示。
圖3 中,程序融合需要將用戶(hù)程序作為基程序,程序融合過(guò)程中,會(huì)屏蔽用戶(hù)程序中的復(fù)位中斷向量,同時(shí)定位復(fù)位向量到用戶(hù)程序中的內(nèi)存地址的末尾,使芯片上電復(fù)位后進(jìn)入模式選擇狀態(tài),同時(shí)用戶(hù)程序的鏈接庫(kù)文件需要鏈接Bootloader 程序的S19 文件,并且要解除FLASH 保護(hù),以便對(duì)芯片的FLASH 進(jìn)行編程,最后通過(guò)BDM 下載融合程序。
Bootloader 上位機(jī)主要作用是將編譯生成的S19 文件以數(shù)據(jù)形式發(fā)送給TCU,實(shí)現(xiàn)變速箱控制器對(duì)內(nèi)存的擦除和寫(xiě)入的功能。
Bootloader 是基于通信方式開(kāi)發(fā)實(shí)現(xiàn)的,因而需要有一套專(zhuān)屬的數(shù)據(jù)傳輸協(xié)議。上位機(jī)與變速箱控制器的通訊協(xié)議見(jiàn)表1,主要功能指令有:開(kāi)始Flash 擦除,F(xiàn)lash 擦除結(jié)束、開(kāi)始Flash 編程、Flash 編程結(jié)束等。
報(bào)文ID 參考1939 協(xié)議進(jìn)行自定義開(kāi)發(fā),0x1000EFD0 和0x1000EFD1 是上位機(jī)發(fā)送的命令指令和S19 數(shù)據(jù),0x1000EFD2是TCU 反饋給上位機(jī)的刷寫(xiě)狀態(tài),使用戶(hù)可以直觀了解程序升級(jí)過(guò)程。
上位機(jī)升級(jí)程序界面如圖4所示。上位機(jī)與控制器連接成功后,在升級(jí)程序過(guò)程中,通過(guò)左面的人機(jī)界面的Message 窗口,可以實(shí)時(shí)更新當(dāng)前上位機(jī)與控制器的運(yùn)行狀態(tài);通過(guò)右面人機(jī)界面的Data窗口,可以觀測(cè)當(dāng)前上位機(jī)給控制器發(fā)送的程序數(shù)據(jù);期間出現(xiàn)故障時(shí),也可以方便的定位問(wèn)題原因。
為驗(yàn)證設(shè)計(jì)的Bootloader 的可靠性,搭建Bootloader 硬件平臺(tái),如圖5所示,該平臺(tái)以某變速箱控制系統(tǒng)硬件為基礎(chǔ),主芯片為MC9S12XEP100。將融合后程序通過(guò)BDM 寫(xiě)入變速箱控制器硬件平臺(tái)內(nèi),上電復(fù)位之后可以正常選擇進(jìn)入用戶(hù)程序或是Bootloader程序,無(wú)需再進(jìn)行用戶(hù)程序升級(jí),實(shí)現(xiàn)通過(guò)一次刷寫(xiě),該控制器同時(shí)含有Bootloader 程序和用戶(hù)程序,圖5 即為用戶(hù)程序正常運(yùn)行的界面。
為驗(yàn)證融合了用戶(hù)程序的Bootloader 在程序升級(jí)方面的功能可靠性,單獨(dú)選取一版用戶(hù)程序,通過(guò)該Bootloader 下載進(jìn)單片機(jī)內(nèi)。編譯后用戶(hù)程序的S19 文件如圖6所示,Bootloader 程序下載到控制器芯片內(nèi)存中的數(shù)據(jù)如圖7所示。通過(guò)將圖6 和圖7 內(nèi)存中的數(shù)據(jù)進(jìn)行對(duì)比,二者數(shù)據(jù)完全一致。
本文基于Bootloader 程序和用戶(hù)程序的融合設(shè)計(jì)了Bootloader 上位機(jī)和變速箱控制器端Bootloader,并搭建了基于MC9S12XEP100 的變速箱控制器硬件平臺(tái)。通過(guò)實(shí)測(cè)試驗(yàn)進(jìn)行了變速箱控制器融合程序功能驗(yàn)證,結(jié)果表明所設(shè)計(jì)的融合的Bootloader 能夠快速、準(zhǔn)確、方便地實(shí)現(xiàn)變速箱控制器應(yīng)用程序的在線(xiàn)升級(jí),可以顯著提高軟件開(kāi)發(fā)效率,為變速箱控制器應(yīng)用程序的數(shù)據(jù)更新提供有效參考。