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