李浩, 張亞琳, 關(guān)冰
(1.中國(guó)運(yùn)載火箭技術(shù)研究院, 北京 100076;2.北京時(shí)代民芯科技有限公司, 北京 100076)
隨著物聯(lián)網(wǎng)和5G等技術(shù)的發(fā)展,嵌入式軟件的應(yīng)用場(chǎng)景也越來越廣泛,承擔(dān)的功能也越來越復(fù)雜,軟件交付后也可能需要進(jìn)行功能升級(jí)[1-2]。以DSP(digital signal processing)為代表的嵌入式軟件開發(fā),通常采用基于JTAG(joint test action group)的仿真器連接升級(jí)模式[3],這種方法在實(shí)驗(yàn)室環(huán)境下應(yīng)用比較方便,但是在軟件固化到嵌入式硬件平臺(tái)后維護(hù)比較復(fù)雜,操作非常不便,必須將硬件平臺(tái)進(jìn)行拆裝后再進(jìn)行升級(jí),明顯增加了運(yùn)維的成本。
本文針對(duì)嵌入式軟件遠(yuǎn)程升級(jí)的需求,設(shè)計(jì)基于以太網(wǎng)總線的遠(yuǎn)程升級(jí)系統(tǒng),只需要1臺(tái)筆記本就可以在不拆裝硬件平臺(tái)的前提下實(shí)現(xiàn)軟件升級(jí)。考慮嵌入式軟件升級(jí)過程的可靠性與穩(wěn)定性,設(shè)計(jì)指令-回令確認(rèn)及三次重傳機(jī)制解決升級(jí)過程中可能出現(xiàn)的丟幀、錯(cuò)幀和亂幀問題,設(shè)計(jì)有限狀態(tài)機(jī)及分區(qū)存儲(chǔ)機(jī)制保證升級(jí)失敗系統(tǒng)也可以正常啟動(dòng),在保證軟件升級(jí)速度的同時(shí)顯著提升可靠性。此外,設(shè)計(jì)上位機(jī)軟件對(duì)升級(jí)過程進(jìn)行可視化監(jiān)控,操作更加便捷。
基于以太網(wǎng)總線的嵌入式軟件遠(yuǎn)程升級(jí)系統(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í),并對(duì)升級(jí)的過程進(jìn)行實(shí)時(shí)監(jiān)控。系統(tǒng)的接收方是下位機(jī),接收到上位機(jī)的升級(jí)指令后進(jìn)行狀態(tài)遷移、指令校驗(yàn)和升級(jí)實(shí)現(xiàn)。

圖1 遠(yuǎn)程升級(jí)系統(tǒng)拓?fù)浣Y(jié)構(gòu)
需要說明的是下位機(jī)運(yùn)行的嵌入式硬件平臺(tái)中至少有一個(gè)版本的下位機(jī)軟件,遠(yuǎn)程升級(jí)系統(tǒng)才能正常運(yùn)行。當(dāng)某下位機(jī)嵌入式軟件需要升級(jí)時(shí),上位機(jī)軟件選擇最新版本的軟件,通過交換機(jī)將軟件分包傳輸?shù)较挛粰C(jī),下位機(jī)校驗(yàn)通過后將軟件存儲(chǔ)到Flash中。升級(jí)后系統(tǒng)可以選擇將固化到Flash的軟件回讀到上位機(jī),用于進(jìn)一步的校核確認(rèn)。系統(tǒng)重啟后,如果升級(jí)成功,下位機(jī)將運(yùn)行最新版本的軟件,否則將運(yùn)行上一版本的軟件,基于以太網(wǎng)總線的遠(yuǎn)程升級(jí)過程如圖2所示。

圖2 基于以太網(wǎng)總線的遠(yuǎn)程升級(jí)過程
系統(tǒng)中上位機(jī)、交換機(jī)及每一個(gè)下位機(jī)都具有獨(dú)一無二的IP地址和端口,在系統(tǒng)中作為唯一的ID用于身份識(shí)別,本文設(shè)計(jì)的系統(tǒng)中有1個(gè)上位機(jī)、4個(gè)下位機(jī)及1個(gè)交換機(jī)。具體分配的IP地址及端口如表1。

表1 遠(yuǎn)程升級(jí)系統(tǒng)地址分配表
設(shè)計(jì)上位機(jī)與下位機(jī)之間的通信協(xié)議,采用實(shí)時(shí)性更高、基于無連接服務(wù)的UDP通信協(xié)議,除了幀內(nèi)容區(qū)中包含有效數(shù)據(jù)外,還增加了幀頭、幀尾、校驗(yàn)和等確認(rèn)位域以實(shí)現(xiàn)對(duì)總線通信鏈路錯(cuò)誤的檢測(cè),采取指令-回令的協(xié)議應(yīng)答機(jī)制作為超時(shí)重傳的通信協(xié)議基礎(chǔ),采用分包機(jī)制對(duì)大數(shù)據(jù)量的二進(jìn)制文件進(jìn)行傳輸。以太網(wǎng)協(xié)議的指令格式見表2,回令格式見表3。
(a) 幀頭:固定幀頭為0x5A5A5A5A,用于判斷幀的開始;
(b) 幀長(zhǎng)度:本幀的數(shù)據(jù)長(zhǎng)度;
(c) 幀類型:本幀的數(shù)據(jù)類型,其中0表示升級(jí)第一幀,1表示升級(jí)中間數(shù)據(jù)幀,2表示升級(jí)最后一幀,3以上標(biāo)識(shí)其他類型;

表2 以太網(wǎng)協(xié)議-指令

表3 以太網(wǎng)協(xié)議回令
(d) 二進(jìn)制文件的大小:待升級(jí)軟件的大小,單位是B,幀類型的值為0~2時(shí)有效;
(e) 二進(jìn)制文件的時(shí)間:待升級(jí)軟件的最后修改時(shí)間,比如2107151057表示2021年7月15日10點(diǎn)57分,幀類型的值為0~2時(shí)有效;
(f) 二進(jìn)制文件的類型:待升級(jí)軟件的類型,0表示Core0軟件,1表示Core1軟件,以此類推,幀類型的值為0~2時(shí)有效;
(g) 二進(jìn)制文件的CRC:待升級(jí)軟件的校驗(yàn)碼,本文采用CRC16的方式進(jìn)行校驗(yàn),幀類型的值為0~2時(shí)有效;
(h) 幀號(hào):當(dāng)前幀的編號(hào),幀類型的值為0~2時(shí)有效;
(i) 幀內(nèi)容區(qū):通信協(xié)議幀的具體內(nèi)容,幀類型的值為1時(shí)有效,固定長(zhǎng)度1 200 B,采用分包傳輸?shù)姆绞絺鬏敹M(jìn)制文件,最后一幀不滿1 200 B的部分填充為0,回令的幀內(nèi)容區(qū)含義為對(duì)指令的內(nèi)容和升級(jí)的過程進(jìn)行判斷,固定長(zhǎng)度是4 B,狀態(tài)碼的具體含義見表4;
(j) 幀校驗(yàn)和:對(duì)本幀數(shù)據(jù)前N-4個(gè)字節(jié)進(jìn)行CRC校驗(yàn),采用CRC16的方式進(jìn)行校驗(yàn);
(k) 幀尾:固定幀尾為0x6B6B6B6B,用于判斷幀的結(jié)束。

表4 狀態(tài)碼設(shè)計(jì)
利用LabWindows/CVI開發(fā)平臺(tái)設(shè)計(jì)上位機(jī)監(jiān)控軟件,該平臺(tái)的優(yōu)點(diǎn)是控件資源豐富,具備很好的虛擬儀器工具支持,支持C語言開發(fā),廣泛應(yīng)用于測(cè)控領(lǐng)域[4]。上位機(jī)界面主要由以下幾部分組成:初始化基本設(shè)置、XML配置、文件選擇、運(yùn)行狀態(tài)、接受內(nèi)容、發(fā)送內(nèi)容、數(shù)量統(tǒng)計(jì)、返回上級(jí)。上位機(jī)軟件界面如圖3所示。

圖3 上位機(jī)軟件界面示意圖
(a) 初始化基本設(shè)置主要完成上位機(jī)IP地址和端口、下位機(jī)IP地址和端口、Internet地址族和傳輸層協(xié)議棧的設(shè)置;
(b) XML配置用于遠(yuǎn)程升級(jí)總線協(xié)議的加載、修改和保存,通過配置XML文件可以在不改變軟件代碼的情況下實(shí)現(xiàn)通信協(xié)議的改變,XML的部分內(nèi)容如下:
〈Number id="01"〉
〈Name〉幀頭〈/Name〉
〈Length〉4〈/Length〉
〈DefaultValue〉5A5A5A5A〈/DefaultValue〉
〈/Number〉
(c) 文件選擇用于待升級(jí)的軟件和需要回傳的軟件絕對(duì)目錄的選擇;
(d) 進(jìn)度條是對(duì)遠(yuǎn)程升級(jí)的進(jìn)度進(jìn)行監(jiān)控;
(e) 運(yùn)行狀態(tài)是對(duì)遠(yuǎn)程升級(jí)的狀態(tài)進(jìn)行監(jiān)控;
(f) 接受內(nèi)容是對(duì)接收的協(xié)議數(shù)據(jù)進(jìn)行顯示;
(g) 發(fā)送內(nèi)容是對(duì)發(fā)送的協(xié)議數(shù)據(jù)進(jìn)行顯示;
(h) 數(shù)量統(tǒng)計(jì)是對(duì)發(fā)送的協(xié)議幀和接收的協(xié)議幀數(shù)量進(jìn)行顯示;
(i) 返回上級(jí)是返回上級(jí)目錄。
當(dāng)用戶完成嵌入式軟件的文件選擇,點(diǎn)擊裝訂按鈕后,主要執(zhí)行如下流程:
(a) 打開嵌入式軟件的二進(jìn)制文件,獲取軟件的大小、時(shí)間、類型及CRC信息,讀取文件中的二進(jìn)制數(shù)據(jù)到緩存區(qū);
(b) 根據(jù)第2節(jié)設(shè)計(jì)的總線通信協(xié)議完成第一幀的組幀,采用超時(shí)重傳的方式發(fā)送第一幀,確保傳輸?shù)目煽啃裕唧w重傳過程見圖4;
(c) 開始中間數(shù)據(jù)幀的組幀和發(fā)送,發(fā)送方式與第一幀相同;
(d) 開始最后一幀的組幀和發(fā)送,發(fā)送方式與第一幀相同;
(e) 升級(jí)過程中異常信息在狀態(tài)欄進(jìn)行打印,升級(jí)的進(jìn)度條根據(jù)當(dāng)前發(fā)送的幀數(shù)實(shí)時(shí)更新。

圖4 基于以太網(wǎng)的指令-回令-結(jié)果超時(shí)重傳流程圖
采用有限狀態(tài)機(jī)的設(shè)計(jì)理念描述下位機(jī)嵌入式軟件的工作流,利用有限狀態(tài)機(jī)的事件觸發(fā)轉(zhuǎn)移機(jī)制,根據(jù)不同的測(cè)試指令完成狀態(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ā)生時(shí),軟件會(huì)響應(yīng)事件,發(fā)生狀態(tài)遷移,從當(dāng)前狀態(tài)遷往新狀態(tài);
(c) 動(dòng)作:軟件狀態(tài)遷移后執(zhí)行的工作稱為動(dòng)作,動(dòng)作執(zhí)行完畢后,可保持當(dāng)前狀態(tài),也可以遷移到新狀態(tài);
(d) 狀態(tài)機(jī):從初始狀態(tài)開始,到終止?fàn)顟B(tài)停止,連接軟件的所有中間狀態(tài),并標(biāo)注事件和動(dòng)作,這樣的狀態(tài)轉(zhuǎn)移過程稱為狀態(tài)機(jī)。
根據(jù)下位機(jī)嵌入式軟件的系統(tǒng)功能,設(shè)計(jì)實(shí)現(xiàn)了5個(gè)動(dòng)作、7個(gè)事件、5種狀態(tài),并形成1個(gè)狀態(tài)機(jī),具體內(nèi)容如圖5所示。

圖5 下位機(jī)軟件狀態(tài)機(jī)
(a) 動(dòng)作1:進(jìn)行軟件及硬件初始化;
(b) 動(dòng)作2:進(jìn)行以太網(wǎng)指令解析;
(c) 動(dòng)作3:進(jìn)行業(yè)務(wù)邏輯處理;
(d) 動(dòng)作4:執(zhí)行下位機(jī)軟件的升級(jí);
(e) 動(dòng)作5:進(jìn)行異常處理和狀態(tài)上報(bào);
(f) 事件1:動(dòng)作1完成;
(g) 事件2:以太網(wǎng)指令解析結(jié)果是非升級(jí)指令;
(h) 事件3:業(yè)務(wù)邏輯后T,本軟件設(shè)置為120 s;
(i) 事件4:以太網(wǎng)指令解析結(jié)果是升級(jí)指令;
(j) 事件5:與事件4相同;
(k) 事件6:檢測(cè)到系統(tǒng)異常,如棧溢出、內(nèi)存越界訪問等;
(l) 事件7:與事件6相同;
(m) 初始狀態(tài):下位機(jī)軟件啟動(dòng)后的狀態(tài),執(zhí)行動(dòng)作1,檢測(cè)到事件1時(shí)遷移到空閑狀態(tài);
(n) 空閑狀態(tài):下位機(jī)軟件等待工作指令的狀態(tài),執(zhí)行動(dòng)作2,檢測(cè)到事件2時(shí)則遷移到工作狀態(tài),檢測(cè)到事件4時(shí)則遷移到升級(jí)狀態(tài);
(o) 工作狀態(tài):下位機(jī)軟件執(zhí)行業(yè)務(wù)邏輯的狀態(tài),執(zhí)行動(dòng)作3,檢測(cè)到事件3時(shí)則遷移到空閑狀態(tài),檢測(cè)到事件5時(shí)則遷移到升級(jí)狀態(tài),檢測(cè)到事件6時(shí)則遷移到終止?fàn)顟B(tài);
(p) 升級(jí)狀態(tài):下位機(jī)軟件進(jìn)行軟件升級(jí)的狀態(tài),執(zhí)行動(dòng)作4,檢測(cè)到事件7時(shí)則遷移到終止?fàn)顟B(tài),為了保證升級(jí)過程中不被干擾,軟件進(jìn)入升級(jí)狀態(tài)時(shí)只執(zhí)行升級(jí)動(dòng)作,不進(jìn)行業(yè)務(wù)處理,只能遷移到終止?fàn)顟B(tài),不能遷移到工作狀態(tài)和空閑狀態(tài);
(q) 終止?fàn)顟B(tài):下位機(jī)軟件出現(xiàn)異常時(shí)的狀態(tài),執(zhí)行動(dòng)作5,終止?fàn)顟B(tài)不進(jìn)行任何狀態(tài)的遷移;
(r) 狀態(tài)機(jī):上述的狀態(tài)、事件、動(dòng)作及狀態(tài)轉(zhuǎn)移過程。
下位機(jī)軟件開發(fā)時(shí)可以采用基于裸機(jī)或者基于實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)模式:如果是基于裸機(jī),在以太網(wǎng)中斷中獲取信息并進(jìn)行判斷,通過置標(biāo)志的方式實(shí)現(xiàn)主循環(huán)不同狀態(tài)的遷移;如果是基于實(shí)時(shí)操作系統(tǒng),在以太網(wǎng)任務(wù)中獲取信息并進(jìn)行判斷,通過信號(hào)量或者消息隊(duì)列等方式實(shí)現(xiàn)不同狀態(tài)任務(wù)的遷移。
嵌入式軟件升級(jí)的Flash分區(qū)有2種方案:第一種是直接覆蓋,第二種是主備分區(qū)。第一種方案在進(jìn)行軟件升級(jí)時(shí),先把二進(jìn)制文件緩存在到DDR存儲(chǔ)器上,完成校驗(yàn)后燒寫到Flash,并將上一版本的二進(jìn)制文件覆蓋。該方案的優(yōu)點(diǎn)是占用存儲(chǔ)空間少、流程簡(jiǎn)單,但是也存在可靠性不高的問題:如果在軟件升級(jí)過程中因?yàn)橥獠扛蓴_導(dǎo)致升級(jí)異常,在重新上電后嵌入式軟件將無法正常啟動(dòng),并無法與上位機(jī)通信,只能用傳統(tǒng)JTAG(joint test action group)掛接仿真器的方式升級(jí)軟件,帶來額外的工作。第二種方案是在進(jìn)行軟件升級(jí)時(shí),先把二進(jìn)制文件緩存到DDR存儲(chǔ)器上,完成校驗(yàn)后燒寫到Flash,但是保留上一版本的二進(jìn)制文件,將最新的軟件燒寫到備分區(qū)。該方案的確定占用存儲(chǔ)空間大、流程復(fù)雜,但是能夠在升級(jí)出錯(cuò)的情況下正常啟動(dòng),可靠性顯著提高。
對(duì)2種方案的優(yōu)劣勢(shì)進(jìn)行分析,本文采用主備分區(qū)的方案對(duì)存放二進(jìn)制文件的Flash空間進(jìn)行了重新編排,如圖6所示。在Flash存儲(chǔ)區(qū)之后設(shè)計(jì)了3個(gè)二進(jìn)制文件存儲(chǔ)區(qū),其中:一個(gè)存儲(chǔ)區(qū)用于存放當(dāng)前要啟動(dòng)的最新二進(jìn)制文件,稱為主分區(qū);一個(gè)存儲(chǔ)區(qū)用于存放上一版本的二進(jìn)制文件,稱為備分區(qū);一個(gè)存儲(chǔ)區(qū)用于存放第一次燒寫的二進(jìn)制文件,稱為零分區(qū)。主分區(qū)和備分區(qū)存放內(nèi)容不是一成不變的,將隨著軟件的更新而動(dòng)態(tài)交替變化。此外,單獨(dú)設(shè)計(jì)一個(gè)參數(shù)存儲(chǔ)區(qū),供Boot Loader程序識(shí)別哪個(gè)是主分區(qū),哪個(gè)是備份區(qū),是否需要啟用零分區(qū),便于嵌入式軟件的引導(dǎo)。

圖6 下位機(jī)FLASH存儲(chǔ)布局
當(dāng)Boot Loader引導(dǎo)主分區(qū)文件失敗后,將尋找備分區(qū)的文件進(jìn)行引導(dǎo),如果再次引導(dǎo)失敗,將尋找零分區(qū)的文件進(jìn)行引導(dǎo)。通過主備分區(qū)、異常檢測(cè)及主動(dòng)回滾機(jī)制,當(dāng)嵌入式軟件升級(jí)過程遇到了異常時(shí),也可以正常實(shí)現(xiàn)軟件的引導(dǎo),顯著提高了軟件遠(yuǎn)程升級(jí)的可靠性。
下位機(jī)軟件進(jìn)入到升級(jí)狀態(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)制文件長(zhǎng)度、時(shí)間及類型信息,并將這些信息寫到Flash中,并根據(jù)幀協(xié)議中的長(zhǎng)度大小擦出Flash的扇區(qū)。
(d) 如果是中間數(shù)據(jù)幀,讀取本幀的長(zhǎng)度,并將內(nèi)容緩存到DDR3中。
(e) 如果是最后幀,將DDR3中緩存的數(shù)據(jù)寫到Flash的相應(yīng)區(qū)域中,對(duì)Flash中的數(shù)據(jù)進(jìn)行CRC校驗(yàn),與最后幀中的CRC結(jié)果進(jìn)行比對(duì)。
(f) 判斷當(dāng)前出錯(cuò)的類型:幀頭校驗(yàn)錯(cuò)誤、Flash讀異常、Flash寫異常或者Flash擦異常等,并發(fā)送到上位機(jī)監(jiān)控軟件。
本設(shè)計(jì)試驗(yàn)驗(yàn)證的下位機(jī)軟件運(yùn)行環(huán)境是TMS320C6678開發(fā)板,TMS320C6678是一款多核DSP處理器芯片,片內(nèi)集成8個(gè)C66x內(nèi)核[6],本系統(tǒng)中主要運(yùn)行下位機(jī)嵌入式軟件,掛接一路網(wǎng)口用于與上位機(jī)監(jiān)控軟件的通信。交換機(jī)采用工業(yè)級(jí)交換機(jī),上位機(jī)軟件運(yùn)行在商用筆記本。
對(duì)嵌入式軟件1進(jìn)行遠(yuǎn)程升級(jí)測(cè)試,上位機(jī)監(jiān)控升級(jí)過程如圖7所示,Wireshark監(jiān)控升級(jí)過程如圖8所示。測(cè)試結(jié)果表明上位機(jī)界面結(jié)果顯示正常,以太網(wǎng)軟件升級(jí)方法經(jīng)驗(yàn)證有效可行。

圖7 上位機(jī)監(jiān)控遠(yuǎn)程升級(jí)過程示意圖
本文針對(duì)嵌入式軟件固化后升級(jí)流程復(fù)雜的問題,提出了一種基于以太網(wǎng)總線的遠(yuǎn)程升級(jí)方案,對(duì)通信協(xié)議、升級(jí)流程、上位機(jī)及下位機(jī)軟件的可靠性增強(qiáng)設(shè)計(jì),顯著地降低升級(jí)難度,提高升級(jí)的效率和可靠性。本文提出的方法在基于TMS320C6678 DSP的嵌入式軟件升級(jí)系統(tǒng)中進(jìn)行了驗(yàn)證,實(shí)驗(yàn)結(jié)果表明方法設(shè)計(jì)正確,具有一定的通用性和實(shí)操性,可以推廣到其他嵌入式系統(tǒng)中。