李 會,王宜懷,王 磊
(蘇州大學(xué) 計算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇 蘇州215000)
基于CAN的數(shù)據(jù)無損代碼更新方法設(shè)計與應(yīng)用*
李會,王宜懷,王磊
(蘇州大學(xué) 計算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇 蘇州215000)
為了提高車載設(shè)備在復(fù)雜工作環(huán)境下固件升級的穩(wěn)定性及可靠性,深入分析并研究 bootloader機(jī)制,以汽車無刷直流電機(jī)控制器為載體,提出了一種基于CAN總線通信方式的數(shù)據(jù)無損代碼更新方法。將上位機(jī)解析后的用戶應(yīng)用程序以鏈表隊列的方式存儲并根據(jù)數(shù)據(jù)無損的BLC通信協(xié)議通過CAN總線發(fā)送給控制器,控制器結(jié)合數(shù)據(jù)無損的代碼備份和Flash加密機(jī)制實現(xiàn)用戶代碼的更新和錯誤回退等功能。實驗結(jié)果表明,本設(shè)計方法具有很強(qiáng)的容錯能力,可實現(xiàn)20 Hz以下的數(shù)據(jù)無損代碼更新,并為其他復(fù)雜工作環(huán)境下的產(chǎn)品提供了一種固件升級的新思路。
CAN總線;bootloader技術(shù);數(shù)據(jù)無損;代碼更新
針對汽車電子在復(fù)雜工作環(huán)境下更新固件過程繁瑣、穩(wěn)定性不高、數(shù)據(jù)易丟失、實時性欠佳等情況[1],以電磁環(huán)境較復(fù)雜的無刷直流電機(jī)控制器為例,深入剖析Bootloader機(jī)制[2-4],使用自定義的 BLC通信協(xié)議,基于面向汽車電子的CAN總線通信方式[5],結(jié)合用戶程序運行區(qū)與備份區(qū)交替使用的方式,設(shè)計了數(shù)據(jù)無損的代碼更新方法,實現(xiàn)了數(shù)據(jù)穩(wěn)定傳輸、快速下載更新等功能。同時還對Bootloader代碼區(qū)進(jìn)行保護(hù),并采用 MCU加密與后門密鑰驗證機(jī)制防止外界對用戶應(yīng)用程序區(qū)的意外修改,從而增強(qiáng)系統(tǒng)的穩(wěn)定性和可靠性。
1.1CAN節(jié)點硬件構(gòu)成
CAN模塊用來進(jìn)行數(shù)據(jù)通信,是CAN Bootloader系統(tǒng)的核心模塊之一。KEA128微控制器[6]有一路 CAN通道與 CAN收發(fā)器 MC33901[7]相連,其中,MC33901是面向汽車電子應(yīng)用的高速CAN收發(fā)器,可提供物理接口。CAN節(jié)點硬件組成如圖1所示。
圖1 CAN節(jié)點硬件組成
KEA128芯片的 MSCAN模塊的時鐘源為總線時鐘,大小為24 MHz,波特率為1 000 Kb/s。并采用32位接收過濾器過濾目標(biāo)ID,PC端軟件可以根據(jù)此目標(biāo)ID通過USB-CAN卡將數(shù)據(jù)正確地發(fā)送給目標(biāo)CAN節(jié)點——無刷直流電機(jī)控制器KEA128芯片。本文設(shè)置控制器的ID為0x64。
為防止數(shù)據(jù)在導(dǎo)線終端被反射導(dǎo)致數(shù)據(jù)丟失,每個CAN總線需要兩個終端電阻,分別在主干線的兩個端點,一般為 120Ω,由于 USB-CAN卡中已內(nèi)置 120Ω電阻,此處不需要外接。
1.2系統(tǒng)構(gòu)成
為了向KEA128微控制器直接編程,本文提出了一種基于汽車CAN總線的數(shù)據(jù)無損的用戶程序備份加密與數(shù)據(jù)無損的BLC通信協(xié)議設(shè)計方法,實現(xiàn)了對無刷直流電機(jī)控制器快捷、穩(wěn)定的代碼更新功能。本文搭建的系統(tǒng)包括無刷直流電機(jī)控制器內(nèi)置的Bootloader、用戶應(yīng)用程序以及PC機(jī)端上位機(jī)軟件。在硬件連接上,采用廣成科技研發(fā)的USB-CAN卡實現(xiàn)PC機(jī)端與控制器KEA128之間的CAN通信。圖2為各個硬件之間的數(shù)據(jù)傳輸示意圖。
圖2 各個硬件之間的數(shù)據(jù)傳輸示意圖
PC機(jī)端上位機(jī)軟件采用C#語言編程實現(xiàn),通過對用戶程序的機(jī)器碼文件逐行遍歷并進(jìn)行解析,去除無效數(shù)據(jù)(例如前綴等),將有效數(shù)據(jù)組成符合 CAN總線協(xié)議的數(shù)據(jù)幀發(fā)送給無刷直流電機(jī)控制器內(nèi)置的Bootloader,Bootloader將數(shù)據(jù)幀解析并放在指定的用戶代碼區(qū),等待PC指針跳轉(zhuǎn)執(zhí)行。PC機(jī)與控制器之間通過數(shù)據(jù)無損的BLC通信協(xié)議進(jìn)行數(shù)據(jù)傳輸。
本設(shè)計方法在鏈接文件中對 Bootloader和用戶應(yīng)用程序的內(nèi)存進(jìn)行劃分,共劃分出了2個用戶應(yīng)用程序區(qū),兩者根據(jù)實際情況分別作為代碼運行區(qū)和備份區(qū)而存在,實現(xiàn)了數(shù)據(jù)無損的用戶程序備份機(jī)制。
此外,為了防止 Bootloader代碼區(qū)和用戶程序區(qū)被意外修改,本設(shè)計方法設(shè)置了保護(hù) Flash配置域,將整個Bootloader代碼區(qū)進(jìn)行保護(hù),同時還采用 MCU加密機(jī)制將用戶程序區(qū)加密,只允許用戶通過 Bootloader進(jìn)行后臺密鑰驗證的方式進(jìn)行固件更新。
2.1上位機(jī)端與控制芯片端通信幀格式定義
上位機(jī)通信軟件可逐行遍歷.HEX格式的MCU機(jī)器碼文件。對于每一條HEX記錄,通信軟件解析出有效數(shù)據(jù)并進(jìn)行組幀,幀格式符合CAN總線協(xié)議的標(biāo)準(zhǔn)數(shù)據(jù)幀。
由于CAN協(xié)議標(biāo)準(zhǔn)數(shù)據(jù)幀的數(shù)據(jù)段最大長度為8 B,所以一條HEX記錄可能需要幾個數(shù)據(jù)幀才能發(fā)送完畢。對于超過8 B的數(shù)據(jù),在仲裁段添加1 B的協(xié)議信息,以表示該條記錄的幀數(shù)和待發(fā)送幀的序號,其高4位表示幀數(shù),低4位表示幀的序號。具體通信幀格式如表1所示。幀類型值為0x00~0x07,分別代表發(fā)送的幀為命令幀、應(yīng)答幀、地址幀、代碼幀、校驗幀、更新幀和結(jié)束幀。只有代碼幀中的幀數(shù)和幀序號有效,其他幀的幀數(shù)和幀序號的內(nèi)容無效且均為0xFF。
表1 通信幀格式
2.2數(shù)據(jù)幀鏈表隊列生成方法
為降低代碼更新的復(fù)雜性,并提高 Bootloader對HEX文件有效數(shù)據(jù)重組的可靠性,上位機(jī)軟件設(shè)計并實現(xiàn)一種能夠生成更新代碼管理鏈表隊列,用于存儲待發(fā)送的數(shù)據(jù)幀。上位機(jī)軟件首先完成解析HEX文件,并將數(shù)據(jù)進(jìn)行組幀,快速建立一個數(shù)據(jù)幀管理鏈表隊列,如圖3所示。
圖3 上位機(jī)更新代碼管理鏈表隊列
上位機(jī)軟件通過CAN總線向無刷直流電機(jī)控制器發(fā)送數(shù)據(jù)幀,直到一條記錄發(fā)送完畢。在控制芯片端將接收的數(shù)據(jù)幀進(jìn)行解析,解析出待存的數(shù)據(jù)和存放Flash的地址。在一條記錄接收完畢后,將此記錄寫入用戶Flash相應(yīng)的地址中,從而簡化Bootloader的邏輯。
3.1鏈接文件中的內(nèi)存設(shè)計
無刷直流電機(jī)控制器采用的KEA128微控制器的RAM大小為 16 KB,F(xiàn)lash大小為 128 KB,在 intflash.ld文件中對Bootloader和用戶應(yīng)用程序的存儲空間進(jìn)行劃分。
圖4為KEA128無刷直流電機(jī)控制器內(nèi)存劃分示意圖。最左邊為KEA128微控制器的存儲映射表,其中Flash區(qū)又劃分為 Bootloader代碼區(qū)、1號用戶代碼區(qū)和2號用戶代碼區(qū)。Bootloader代碼區(qū)包括中斷向量表和Bootloader代碼。同樣的,1號用戶代碼區(qū)和 2號用戶代碼區(qū)包括中斷向量表和用戶代碼。本文利用內(nèi)存中劃分的2個用戶代碼區(qū)設(shè)計了一套良好的用戶代碼備份機(jī)制。該機(jī)制輪流采用兩個用戶代碼區(qū)分別用來備份當(dāng)前運行的用戶代碼和準(zhǔn)備更新的用戶代碼。配置信息段用于標(biāo)識當(dāng)前運行的用戶程序處于哪個用戶代碼區(qū)。假設(shè)當(dāng)前運行的用戶程序處于1號用戶代碼區(qū),當(dāng)用戶準(zhǔn)備更新代碼時,Bootloader自動讀取配置信息段,并將待更新的用戶代碼放在2號用戶代碼區(qū)。此時1號用戶代碼區(qū)作為備份存在,2號用戶代碼區(qū)作為運行區(qū)存在。當(dāng)下一次更新代碼時,2號用戶代碼區(qū)將自動作為備份存在,1號用戶代碼區(qū)數(shù)據(jù)被擦除并存儲待更新的用戶代碼。該機(jī)制減少了Bootloader對Flash區(qū)的操作,縮短了代碼更新時間,同時也保證當(dāng)更新失敗,系統(tǒng)還可以盡快恢復(fù)到之前的功能。
圖4 KEA128無刷直流電機(jī)控制器內(nèi)存劃分示意圖
3.2中斷向量表重映射
中斷向量表是存放中斷服務(wù)程序入口地址或跳轉(zhuǎn)到中斷服務(wù)程序入口地址的一段存儲區(qū)域。由于程序執(zhí)行的第一條指令地址是以中斷向量的形式給出,因此重映射中斷向量表是設(shè)計 Bootloader的第一步。圖 4對控制器的內(nèi)存進(jìn)行了劃分,默認(rèn)情況下,Bootloader的中斷向量表處于0x0000_0000~0x0000_000C地址。KEA128微控制器上電啟動后,將運行 Bootloader代碼并檢測是否需要進(jìn)行代碼更新操作。若檢測到代碼更新命令,Bootloader將接收新的應(yīng)用程序代碼寫入相應(yīng)的用戶代碼區(qū),禁止中斷;然后初始化用戶程序區(qū)堆棧指針,將中斷向量表重新定位到用戶應(yīng)用程序區(qū)中的中斷向量表所在位置,并將此地址值賦給中斷向量表起始地址寄存器SCB->VTOR;最后PC指針跳轉(zhuǎn)到相應(yīng)用戶代碼區(qū)的入口地址處。整個執(zhí)行流程如圖5所示。
3.3Bootloader代碼區(qū)保護(hù)與MCU加密機(jī)制設(shè)計
為了防止用戶應(yīng)用程序?qū)?Bootloader代碼區(qū)的意外修改,通過保護(hù)Flash配置域?qū)⒄麄€ Bootloader代碼區(qū)進(jìn)行保護(hù)。在 Bootloader代碼區(qū)中,F(xiàn)lash配置域地址位于0x00000400~0x00000410。Flash保護(hù)分為低地址域和高地址域,而Bootloader代碼區(qū)中的 Flash配置域位于低地址保護(hù)域內(nèi)。配置 FPLS[1:0]=11,就可以將整個 16 KB大小的Bootloader代碼區(qū)保護(hù)起來。
同時,為了保護(hù)無刷直流電機(jī)控制器能夠正常運行,應(yīng)禁止用戶通過寫入器對MCU進(jìn)行二次寫入,只允許用戶通過控制器內(nèi)置 Bootloader來更新程序。通過設(shè)置KEA128后門秘鑰(BackdoorKey)對KEA128整個芯片進(jìn)行加密。而Bootloader會內(nèi)置密鑰,可以完成對用戶代碼區(qū)的下載及更新。
圖5 Bootloader執(zhí)行流程
Bootloader借助內(nèi)置的后門密鑰與存儲在 Flash配置域的8 B后門密鑰的內(nèi)容進(jìn)行比較并匹配,從而獲得對KEA128的訪問權(quán)限并臨時解鎖芯片。
BLC通信協(xié)議是為了保證上位機(jī)下發(fā)的.HEX文件的有效數(shù)據(jù)可被無刷電機(jī)控制器無損地接收和可靠處理。主要通過握手機(jī)制來實現(xiàn),具體的通訊鏈路機(jī)制如圖6所示。
圖6 BLC通訊鏈路機(jī)制
首先,上位機(jī)軟件取得HEX有效數(shù)據(jù)后,循環(huán)向控制器發(fā)送命令幀請求開始發(fā)送數(shù)據(jù),直到控制器向上位機(jī)反饋“同意接收”的應(yīng)答幀時才停止下發(fā)請求命令幀;上位機(jī)在收到應(yīng)答幀后,通過CAN總線將數(shù)據(jù)幀發(fā)送給下位機(jī),在發(fā)送完HEX數(shù)據(jù)后,上位機(jī)將發(fā)送結(jié)束幀通知控制器HEX數(shù)據(jù)已發(fā)送完畢,無刷電機(jī)控制器將回發(fā)應(yīng)答幀通知上位機(jī)數(shù)據(jù)“接收成功”,到此上位機(jī)可以停止HEX數(shù)據(jù)的傳輸。之后控制器通過執(zhí)行Flash寫操作將接收到的HEX數(shù)據(jù)寫到相應(yīng)用戶代碼區(qū)的指定地址,完成寫入后再次向上位機(jī)發(fā)送應(yīng)答幀命令表示已“完成HEX數(shù)據(jù)的寫入”,上位機(jī)收到后將下發(fā)結(jié)束幀請求結(jié)束此次傳輸過程,最后控制器將回發(fā)應(yīng)答幀“關(guān)閉此次通信過程”。
此外,本文還在BLC協(xié)議中設(shè)計了超時重傳機(jī)制,BLC協(xié)議的發(fā)送方在0.5 s內(nèi)沒有收到確認(rèn)就要重傳已發(fā)送的數(shù)據(jù)。在整個傳輸過程中,凡是已經(jīng)發(fā)送過的數(shù)據(jù),在未收到確認(rèn)之前都必須暫時保留,以便超時重傳時使用。如果發(fā)送方一連重傳3次仍無響應(yīng),發(fā)送方就認(rèn)為接收方出了故障,關(guān)閉整個連接。
對本文設(shè)計的數(shù)據(jù)無損的代碼更新方法進(jìn)行了時間開銷的測試實驗。在控制器端指定引腳PTI2為高電平,當(dāng)Bootloader開始時將其拉低,結(jié)束時再次將其改為高電平,用示波器觀察PTI2引腳低電平持續(xù)的時間即為所需要的時間。以16 KB的HEX文件為例。在一天不同的時間段測試的數(shù)據(jù)如表2所示。每個數(shù)據(jù)均為當(dāng)前時間測試的10次數(shù)據(jù)的平均值。
表2 數(shù)據(jù)無損的代碼更新方法的時間開銷(ms)
同時,也對系統(tǒng)的可靠性進(jìn)行了測試,部分測試結(jié)果如表3所示。
表3 系統(tǒng)的可靠性測試
綜上所述,所設(shè)計的數(shù)據(jù)無損代碼更新方法運行穩(wěn)定,時間開銷短、通信可靠且能夠有效改善代碼更新過程中下載失敗的問題。
本文設(shè)計的數(shù)據(jù)無損代碼更新方法提供了高可靠性的代碼更新機(jī)制,極大地方便了研發(fā)人員對設(shè)備的測試及產(chǎn)品升級。目前,此系統(tǒng)已成功應(yīng)用于蘇州華祥信息科技有限公司的無刷直流電機(jī)控制系統(tǒng)中,經(jīng)實際生產(chǎn)測試表明,本系統(tǒng)穩(wěn)定可靠,可成功實現(xiàn) 20 Hz以下數(shù)據(jù)無損的代碼更新。同時,本設(shè)計方法也為圖2中其他CAN節(jié)點的代碼更新提供了一種新的思路。
[1]蔣建春,王正樹.基于軟件觸發(fā)的在應(yīng)用編程在線升級技術(shù)的設(shè)計與實現(xiàn)[J].計算機(jī)應(yīng)用,2012,32(3):121-123.
[2]王亞剛.嵌入式Bootloader機(jī)制的分析與移植[J].計算機(jī)工程,2010,36(6):267-269.
[3]陳曦,鄭貴林.基于自編程功能的MCU Bootloader設(shè)計[J].電子設(shè)計工程,2010(18):65-68.
[4]劉矗,羅峰.基于飛思卡爾微控制器的 CAN Bootloader的實現(xiàn)與應(yīng)用[J].蘇州大學(xué)學(xué)報:工學(xué)版,2010,30(2):57-61.
[5]司寶豐,孟鵬花.基于CAN總線的Bootloader設(shè)計[J].儀表技術(shù),2010(3):30-33.
[6]Freescale.KEA128 Sub-Family Reference Manual Rev 2 [DB/OL].2014.http://www.freescale.com.
[7]Freescale.MC33901:High Speed CAN Transceiver Rev 1 [DB/OL].2013.http://www.freescale.com.
The design and application of CAN-based code updation with data lossless
Li Hui,Wang Yihuai,Wang Lei
(School of Computer Science and Technology,Soochow University,Suzhou 215000,China)
In order to improve the stability and reliability of the vehicle device while firmware upgrading in a complex working environment,a data lossless code updating scheme through CAN bus communication is proposed,based on in-depth analysis and research of the bootloader mechanisms and took automotive brushless DC motor controller as the carrier.This scheme sends the user application,which is parsed by the host machine and stored in the queue list,to the controller through CAN bus using BLC lossless data communication protocol.The controller combines a data lossless code backup with Flash encryption mechanisms to realize code updating and bug rollback.Experimental results show that this scheme has a high fault-tolerant capability,could achieve code updation without data loss at below 20 Hz.Thus,this scheme may provides a new idea for other products'firmware updation in complex working environment.
CAN Bus;bootloader technology;data lossless;code updation
TP393
A
10.16157/j.issn.0258-7998.2016.01.010
國家自然科學(xué)基金資助項目(61070169)
(2015-08-26)
李會(1989-),通信作者,女,碩士研究生,主要研究方向:嵌入式系統(tǒng),E-mail:1045195764@qq.com。
王宜懷(1962-),男,博士,教授,主要研究方向:嵌入式系統(tǒng)、傳感網(wǎng)與智能控制技術(shù)。
王磊(1987-),男,碩士研究生,主要研究方向:嵌入式系統(tǒng)。
中文引用格式:李會,王宜懷,王磊.基于CAN的數(shù)據(jù)無損代碼更新方法設(shè)計與應(yīng)用[J].電子技術(shù)應(yīng)用,2016,42(1):40-43.
英文引用格式:Li Hui,Wang Yihuai,Wang Lei.The design and application of CAN-based code updation with data lossless[J]. Application of Electronic Technique,2016,42(1):40-43.