李浩, 張亞琳, 關(guān)冰
(1.中國運(yùn)載火箭技術(shù)研究院, 北京 100076;2.北京時代民芯科技有限公司, 北京 100076)
隨著物聯(lián)網(wǎng)和5G等技術(shù)的發(fā)展,嵌入式軟件的應(yīng)用場景也越來越廣泛,承擔(dān)的功能也越來越復(fù)雜,軟件交付后也可能需要進(jìn)行功能升級[1-2]。以DSP(digital signal processing)為代表的嵌入式軟件開發(fā),通常采用基于JTAG(joint test action group)的仿真器連接升級模式[3],這種方法在實(shí)驗(yàn)室環(huán)境下應(yīng)用比較方便,但是在軟件固化到嵌入式硬件平臺后維護(hù)比較復(fù)雜,操作非常不便,必須將硬件平臺進(jìn)行拆裝后再進(jìn)行升級,明顯增加了運(yùn)維的成本。
本文針對嵌入式軟件遠(yuǎn)程升級的需求,設(shè)計(jì)基于以太網(wǎng)總線的遠(yuǎn)程升級系統(tǒng),只需要1臺筆記本就可以在不拆裝硬件平臺的前提下實(shí)現(xiàn)軟件升級??紤]嵌入式軟件升級過程的可靠性與穩(wěn)定性,設(shè)計(jì)指令-回令確認(rèn)及三次重傳機(jī)制解決升級過程中可能出現(xiàn)的丟幀、錯幀和亂幀問題,設(shè)計(jì)有限狀態(tài)機(jī)及分區(qū)存儲機(jī)制保證升級失敗系統(tǒng)也可以正常啟動,在保證軟件升級速度的同時顯著提升可靠性。此外,設(shè)計(jì)上位機(jī)軟件對升級過程進(jìn)行可視化監(jiān)控,操作更加便捷。
基于以太網(wǎng)總線的嵌入式軟件遠(yuǎn)程升級系統(tǒng)由上位機(jī)、交換機(jī)和下位機(jī)3部分組成,拓?fù)浣Y(jié)構(gòu)見圖1。系統(tǒng)的通信中樞是交換機(jī),用于上位機(jī)與不同下位機(jī)之間指令、回令的傳輸。系統(tǒng)的發(fā)起方是上位機(jī),通過參數(shù)配置后開始嵌入式軟件的遠(yuǎn)程升級,并對升級的過程進(jìn)行實(shí)時監(jiān)控。系統(tǒng)的接收方是下位機(jī),接收到上位機(jī)的升級指令后進(jìn)行狀態(tài)遷移、指令校驗(yàn)和升級實(shí)現(xiàn)。
圖1 遠(yuǎn)程升級系統(tǒng)拓?fù)浣Y(jié)構(gòu)
需要說明的是下位機(jī)運(yùn)行的嵌入式硬件平臺中至少有一個版本的下位機(jī)軟件,遠(yuǎn)程升級系統(tǒng)才能正常運(yùn)行。當(dāng)某下位機(jī)嵌入式軟件需要升級時,上位機(jī)軟件選擇最新版本的軟件,通過交換機(jī)將軟件分包傳輸?shù)较挛粰C(jī),下位機(jī)校驗(yàn)通過后將軟件存儲到Flash中。升級后系統(tǒng)可以選擇將固化到Flash的軟件回讀到上位機(jī),用于進(jìn)一步的校核確認(rèn)。系統(tǒng)重啟后,如果升級成功,下位機(jī)將運(yùn)行最新版本的軟件,否則將運(yùn)行上一版本的軟件,基于以太網(wǎng)總線的遠(yuǎn)程升級過程如圖2所示。
圖2 基于以太網(wǎng)總線的遠(yuǎn)程升級過程
系統(tǒng)中上位機(jī)、交換機(jī)及每一個下位機(jī)都具有獨(dú)一無二的IP地址和端口,在系統(tǒng)中作為唯一的ID用于身份識別,本文設(shè)計(jì)的系統(tǒng)中有1個上位機(jī)、4個下位機(jī)及1個交換機(jī)。具體分配的IP地址及端口如表1。
表1 遠(yuǎn)程升級系統(tǒng)地址分配表
設(shè)計(jì)上位機(jī)與下位機(jī)之間的通信協(xié)議,采用實(shí)時性更高、基于無連接服務(wù)的UDP通信協(xié)議,除了幀內(nèi)容區(qū)中包含有效數(shù)據(jù)外,還增加了幀頭、幀尾、校驗(yàn)和等確認(rèn)位域以實(shí)現(xiàn)對總線通信鏈路錯誤的檢測,采取指令-回令的協(xié)議應(yīng)答機(jī)制作為超時重傳的通信協(xié)議基礎(chǔ),采用分包機(jī)制對大數(shù)據(jù)量的二進(jìn)制文件進(jìn)行傳輸。以太網(wǎng)協(xié)議的指令格式見表2,回令格式見表3。
(a) 幀頭:固定幀頭為0x5A5A5A5A,用于判斷幀的開始;
(b) 幀長度:本幀的數(shù)據(jù)長度;
(c) 幀類型:本幀的數(shù)據(jù)類型,其中0表示升級第一幀,1表示升級中間數(shù)據(jù)幀,2表示升級最后一幀,3以上標(biāo)識其他類型;
表2 以太網(wǎng)協(xié)議-指令
表3 以太網(wǎng)協(xié)議回令
(d) 二進(jìn)制文件的大?。捍壾浖拇笮?,單位是B,幀類型的值為0~2時有效;
(e) 二進(jìn)制文件的時間:待升級軟件的最后修改時間,比如2107151057表示2021年7月15日10點(diǎn)57分,幀類型的值為0~2時有效;
(f) 二進(jìn)制文件的類型:待升級軟件的類型,0表示Core0軟件,1表示Core1軟件,以此類推,幀類型的值為0~2時有效;
(g) 二進(jìn)制文件的CRC:待升級軟件的校驗(yàn)碼,本文采用CRC16的方式進(jìn)行校驗(yàn),幀類型的值為0~2時有效;
(h) 幀號:當(dāng)前幀的編號,幀類型的值為0~2時有效;
(i) 幀內(nèi)容區(qū):通信協(xié)議幀的具體內(nèi)容,幀類型的值為1時有效,固定長度1 200 B,采用分包傳輸?shù)姆绞絺鬏敹M(jìn)制文件,最后一幀不滿1 200 B的部分填充為0,回令的幀內(nèi)容區(qū)含義為對指令的內(nèi)容和升級的過程進(jìn)行判斷,固定長度是4 B,狀態(tài)碼的具體含義見表4;
(j) 幀校驗(yàn)和:對本幀數(shù)據(jù)前N-4個字節(jié)進(jìn)行CRC校驗(yàn),采用CRC16的方式進(jìn)行校驗(yàn);
(k) 幀尾:固定幀尾為0x6B6B6B6B,用于判斷幀的結(jié)束。
表4 狀態(tài)碼設(shè)計(jì)
利用LabWindows/CVI開發(fā)平臺設(shè)計(jì)上位機(jī)監(jiān)控軟件,該平臺的優(yōu)點(diǎn)是控件資源豐富,具備很好的虛擬儀器工具支持,支持C語言開發(fā),廣泛應(yīng)用于測控領(lǐng)域[4]。上位機(jī)界面主要由以下幾部分組成:初始化基本設(shè)置、XML配置、文件選擇、運(yùn)行狀態(tài)、接受內(nèi)容、發(fā)送內(nèi)容、數(shù)量統(tǒng)計(jì)、返回上級。上位機(jī)軟件界面如圖3所示。
圖3 上位機(jī)軟件界面示意圖
(a) 初始化基本設(shè)置主要完成上位機(jī)IP地址和端口、下位機(jī)IP地址和端口、Internet地址族和傳輸層協(xié)議棧的設(shè)置;
(b) XML配置用于遠(yuǎn)程升級總線協(xié)議的加載、修改和保存,通過配置XML文件可以在不改變軟件代碼的情況下實(shí)現(xiàn)通信協(xié)議的改變,XML的部分內(nèi)容如下:
〈Number id="01"〉
〈Name〉幀頭〈/Name〉
〈Length〉4〈/Length〉
〈DefaultValue〉5A5A5A5A〈/DefaultValue〉
〈/Number〉
(c) 文件選擇用于待升級的軟件和需要回傳的軟件絕對目錄的選擇;
(d) 進(jìn)度條是對遠(yuǎn)程升級的進(jìn)度進(jìn)行監(jiān)控;
(e) 運(yùn)行狀態(tài)是對遠(yuǎn)程升級的狀態(tài)進(jìn)行監(jiān)控;
(f) 接受內(nèi)容是對接收的協(xié)議數(shù)據(jù)進(jìn)行顯示;
(g) 發(fā)送內(nèi)容是對發(fā)送的協(xié)議數(shù)據(jù)進(jìn)行顯示;
(h) 數(shù)量統(tǒng)計(jì)是對發(fā)送的協(xié)議幀和接收的協(xié)議幀數(shù)量進(jìn)行顯示;
(i) 返回上級是返回上級目錄。
當(dāng)用戶完成嵌入式軟件的文件選擇,點(diǎn)擊裝訂按鈕后,主要執(zhí)行如下流程:
(a) 打開嵌入式軟件的二進(jìn)制文件,獲取軟件的大小、時間、類型及CRC信息,讀取文件中的二進(jìn)制數(shù)據(jù)到緩存區(qū);
(b) 根據(jù)第2節(jié)設(shè)計(jì)的總線通信協(xié)議完成第一幀的組幀,采用超時重傳的方式發(fā)送第一幀,確保傳輸?shù)目煽啃裕唧w重傳過程見圖4;
(c) 開始中間數(shù)據(jù)幀的組幀和發(fā)送,發(fā)送方式與第一幀相同;
(d) 開始最后一幀的組幀和發(fā)送,發(fā)送方式與第一幀相同;
(e) 升級過程中異常信息在狀態(tài)欄進(jìn)行打印,升級的進(jìn)度條根據(jù)當(dāng)前發(fā)送的幀數(shù)實(shí)時更新。
圖4 基于以太網(wǎng)的指令-回令-結(jié)果超時重傳流程圖
采用有限狀態(tài)機(jī)的設(shè)計(jì)理念描述下位機(jī)嵌入式軟件的工作流,利用有限狀態(tài)機(jī)的事件觸發(fā)轉(zhuǎn)移機(jī)制,根據(jù)不同的測試指令完成狀態(tài)的遷移[5],設(shè)計(jì)下位機(jī)軟件的工作過程。狀態(tài)機(jī)實(shí)現(xiàn)的過程要點(diǎn)如下:
(a) 狀態(tài):軟件當(dāng)前所處的階段稱為狀態(tài),包括初始狀態(tài)、終止?fàn)顟B(tài)及其他可能處于的階段;
(b) 事件:觸發(fā)狀態(tài)發(fā)生遷移的條件稱為事件,當(dāng)事件發(fā)生時,軟件會響應(yīng)事件,發(fā)生狀態(tài)遷移,從當(dāng)前狀態(tài)遷往新狀態(tài);
(c) 動作:軟件狀態(tài)遷移后執(zhí)行的工作稱為動作,動作執(zhí)行完畢后,可保持當(dāng)前狀態(tài),也可以遷移到新狀態(tài);
(d) 狀態(tài)機(jī):從初始狀態(tài)開始,到終止?fàn)顟B(tài)停止,連接軟件的所有中間狀態(tài),并標(biāo)注事件和動作,這樣的狀態(tài)轉(zhuǎn)移過程稱為狀態(tài)機(jī)。
根據(jù)下位機(jī)嵌入式軟件的系統(tǒng)功能,設(shè)計(jì)實(shí)現(xiàn)了5個動作、7個事件、5種狀態(tài),并形成1個狀態(tài)機(jī),具體內(nèi)容如圖5所示。
圖5 下位機(jī)軟件狀態(tài)機(jī)
(a) 動作1:進(jìn)行軟件及硬件初始化;
(b) 動作2:進(jìn)行以太網(wǎng)指令解析;
(c) 動作3:進(jìn)行業(yè)務(wù)邏輯處理;
(d) 動作4:執(zhí)行下位機(jī)軟件的升級;
(e) 動作5:進(jìn)行異常處理和狀態(tài)上報(bào);
(f) 事件1:動作1完成;
(g) 事件2:以太網(wǎng)指令解析結(jié)果是非升級指令;
(h) 事件3:業(yè)務(wù)邏輯后T,本軟件設(shè)置為120 s;
(i) 事件4:以太網(wǎng)指令解析結(jié)果是升級指令;
(j) 事件5:與事件4相同;
(k) 事件6:檢測到系統(tǒng)異常,如棧溢出、內(nèi)存越界訪問等;
(l) 事件7:與事件6相同;
(m) 初始狀態(tài):下位機(jī)軟件啟動后的狀態(tài),執(zhí)行動作1,檢測到事件1時遷移到空閑狀態(tài);
(n) 空閑狀態(tài):下位機(jī)軟件等待工作指令的狀態(tài),執(zhí)行動作2,檢測到事件2時則遷移到工作狀態(tài),檢測到事件4時則遷移到升級狀態(tài);
(o) 工作狀態(tài):下位機(jī)軟件執(zhí)行業(yè)務(wù)邏輯的狀態(tài),執(zhí)行動作3,檢測到事件3時則遷移到空閑狀態(tài),檢測到事件5時則遷移到升級狀態(tài),檢測到事件6時則遷移到終止?fàn)顟B(tài);
(p) 升級狀態(tài):下位機(jī)軟件進(jìn)行軟件升級的狀態(tài),執(zhí)行動作4,檢測到事件7時則遷移到終止?fàn)顟B(tài),為了保證升級過程中不被干擾,軟件進(jìn)入升級狀態(tài)時只執(zhí)行升級動作,不進(jìn)行業(yè)務(wù)處理,只能遷移到終止?fàn)顟B(tài),不能遷移到工作狀態(tài)和空閑狀態(tài);
(q) 終止?fàn)顟B(tài):下位機(jī)軟件出現(xiàn)異常時的狀態(tài),執(zhí)行動作5,終止?fàn)顟B(tài)不進(jìn)行任何狀態(tài)的遷移;
(r) 狀態(tài)機(jī):上述的狀態(tài)、事件、動作及狀態(tài)轉(zhuǎn)移過程。
下位機(jī)軟件開發(fā)時可以采用基于裸機(jī)或者基于實(shí)時操作系統(tǒng)的設(shè)計(jì)模式:如果是基于裸機(jī),在以太網(wǎng)中斷中獲取信息并進(jìn)行判斷,通過置標(biāo)志的方式實(shí)現(xiàn)主循環(huán)不同狀態(tài)的遷移;如果是基于實(shí)時操作系統(tǒng),在以太網(wǎng)任務(wù)中獲取信息并進(jìn)行判斷,通過信號量或者消息隊(duì)列等方式實(shí)現(xiàn)不同狀態(tài)任務(wù)的遷移。
嵌入式軟件升級的Flash分區(qū)有2種方案:第一種是直接覆蓋,第二種是主備分區(qū)。第一種方案在進(jìn)行軟件升級時,先把二進(jìn)制文件緩存在到DDR存儲器上,完成校驗(yàn)后燒寫到Flash,并將上一版本的二進(jìn)制文件覆蓋。該方案的優(yōu)點(diǎn)是占用存儲空間少、流程簡單,但是也存在可靠性不高的問題:如果在軟件升級過程中因?yàn)橥獠扛蓴_導(dǎo)致升級異常,在重新上電后嵌入式軟件將無法正常啟動,并無法與上位機(jī)通信,只能用傳統(tǒng)JTAG(joint test action group)掛接仿真器的方式升級軟件,帶來額外的工作。第二種方案是在進(jìn)行軟件升級時,先把二進(jìn)制文件緩存到DDR存儲器上,完成校驗(yàn)后燒寫到Flash,但是保留上一版本的二進(jìn)制文件,將最新的軟件燒寫到備分區(qū)。該方案的確定占用存儲空間大、流程復(fù)雜,但是能夠在升級出錯的情況下正常啟動,可靠性顯著提高。
對2種方案的優(yōu)劣勢進(jìn)行分析,本文采用主備分區(qū)的方案對存放二進(jìn)制文件的Flash空間進(jìn)行了重新編排,如圖6所示。在Flash存儲區(qū)之后設(shè)計(jì)了3個二進(jìn)制文件存儲區(qū),其中:一個存儲區(qū)用于存放當(dāng)前要啟動的最新二進(jìn)制文件,稱為主分區(qū);一個存儲區(qū)用于存放上一版本的二進(jìn)制文件,稱為備分區(qū);一個存儲區(qū)用于存放第一次燒寫的二進(jìn)制文件,稱為零分區(qū)。主分區(qū)和備分區(qū)存放內(nèi)容不是一成不變的,將隨著軟件的更新而動態(tài)交替變化。此外,單獨(dú)設(shè)計(jì)一個參數(shù)存儲區(qū),供Boot Loader程序識別哪個是主分區(qū),哪個是備份區(qū),是否需要啟用零分區(qū),便于嵌入式軟件的引導(dǎo)。
圖6 下位機(jī)FLASH存儲布局
當(dāng)Boot Loader引導(dǎo)主分區(qū)文件失敗后,將尋找備分區(qū)的文件進(jìn)行引導(dǎo),如果再次引導(dǎo)失敗,將尋找零分區(qū)的文件進(jìn)行引導(dǎo)。通過主備分區(qū)、異常檢測及主動回滾機(jī)制,當(dāng)嵌入式軟件升級過程遇到了異常時,也可以正常實(shí)現(xiàn)軟件的引導(dǎo),顯著提高了軟件遠(yuǎn)程升級的可靠性。
下位機(jī)軟件進(jìn)入到升級狀態(tài)后,工作流程如下:
(a) 軟件收到每一幀數(shù)據(jù)后根據(jù)第3節(jié)通信協(xié)議進(jìn)行校驗(yàn)。如果校驗(yàn)通過則執(zhí)行發(fā)送回令,并執(zhí)行(b),如果校驗(yàn)不通過則執(zhí)行(f)。
(b) 判斷該幀類型。如果是第一幀,轉(zhuǎn)到(c);如果是中間數(shù)據(jù)幀,轉(zhuǎn)到(d);如果是最后幀,轉(zhuǎn)到(e);如果是其他幀,執(zhí)行(f)。
(c) 如果是第一幀,讀取幀協(xié)議中的二進(jìn)制文件長度、時間及類型信息,并將這些信息寫到Flash中,并根據(jù)幀協(xié)議中的長度大小擦出Flash的扇區(qū)。
(d) 如果是中間數(shù)據(jù)幀,讀取本幀的長度,并將內(nèi)容緩存到DDR3中。
(e) 如果是最后幀,將DDR3中緩存的數(shù)據(jù)寫到Flash的相應(yīng)區(qū)域中,對Flash中的數(shù)據(jù)進(jìn)行CRC校驗(yàn),與最后幀中的CRC結(jié)果進(jìn)行比對。
(f) 判斷當(dāng)前出錯的類型:幀頭校驗(yàn)錯誤、Flash讀異常、Flash寫異?;蛘逨lash擦異常等,并發(fā)送到上位機(jī)監(jiān)控軟件。
本設(shè)計(jì)試驗(yàn)驗(yàn)證的下位機(jī)軟件運(yùn)行環(huán)境是TMS320C6678開發(fā)板,TMS320C6678是一款多核DSP處理器芯片,片內(nèi)集成8個C66x內(nèi)核[6],本系統(tǒng)中主要運(yùn)行下位機(jī)嵌入式軟件,掛接一路網(wǎng)口用于與上位機(jī)監(jiān)控軟件的通信。交換機(jī)采用工業(yè)級交換機(jī),上位機(jī)軟件運(yùn)行在商用筆記本。
對嵌入式軟件1進(jìn)行遠(yuǎn)程升級測試,上位機(jī)監(jiān)控升級過程如圖7所示,Wireshark監(jiān)控升級過程如圖8所示。測試結(jié)果表明上位機(jī)界面結(jié)果顯示正常,以太網(wǎng)軟件升級方法經(jīng)驗(yàn)證有效可行。
圖7 上位機(jī)監(jiān)控遠(yuǎn)程升級過程示意圖
本文針對嵌入式軟件固化后升級流程復(fù)雜的問題,提出了一種基于以太網(wǎng)總線的遠(yuǎn)程升級方案,對通信協(xié)議、升級流程、上位機(jī)及下位機(jī)軟件的可靠性增強(qiáng)設(shè)計(jì),顯著地降低升級難度,提高升級的效率和可靠性。本文提出的方法在基于TMS320C6678 DSP的嵌入式軟件升級系統(tǒng)中進(jìn)行了驗(yàn)證,實(shí)驗(yàn)結(jié)果表明方法設(shè)計(jì)正確,具有一定的通用性和實(shí)操性,可以推廣到其他嵌入式系統(tǒng)中。