張永鵬
(1.中國電子科技集團公司第三十八研究所 合肥 230088; 2.孔徑陣列與空間探測安徽省重點實驗室 合肥 230088)
現有彈載產品中包含大量的DSP、FPGA等嵌入式模塊,在產品生產交付后,伴隨著產品功能、性能的升級改進,需要對內部嵌入式軟件進行更新。傳統嵌入式軟件一般采用專用編程線纜及相應的仿真器連接芯片后對軟件進行更新,此方法需專人操作且操作復雜、靈活性低[1-3]。
本文以某彈載雷達嵌入式DSP芯片TMS320C6713(簡稱C6713)為例,提供一種可靠性高、操作便捷的嵌入式軟件在線更新方法,實現彈載產品嵌入式軟件高效的軟件在線更新。此方法極大地提升了彈載產品軟件在線更新的可靠性、安全性和操作便捷性,具有良好的工程應用價值。
嵌入式軟件為了支持在線自更新任務,需要在系統中單獨設計一個區別于正常工作程序模塊,專用于嵌入式軟件更新的在線更新程序模塊,如圖1所示。系統正常工作啟動時通過BootLoader程序(即引導程序)選擇啟動工作程序模塊,此時在線更新程序模塊處于阻塞狀態,當需要進行軟件在線更新時,工作程序模塊接收外部在線更新控制指令,完成在線更新狀態置位(FLASH地址“0x90070000”存儲在線更新標識),同時嵌入式DSP軟件通過調用Jump(0)函數,將嵌入式軟件重新轉入起始0地址開始執行,即可實現進行嵌入式DSP的自復位。復位后,自動重新運行BootLoader程序,此時BootLoader程序根據在線狀態啟動在線更新程序模塊,此時可接收外部待更新的工作程序文件,并將程序文件寫入到工作程序模塊的FLASH儲存地址中,即可完成工作程序模塊的在線更新操作[4-7]。

圖1 在線更新系統架構示意圖
C6000系列沒有自帶的FLASH存儲器,需要通過EMIF總線與外擴的FLASH儲存芯片進行通信,因此將程序文件通過EMIF寫入到外擴的FLASH中,系統上電復位后,再通過FLASH進行引導自啟動,C6713啟動時通過EDMA自動將FLASH起始地址的前1KB內容搬移到內部的RAM中,并自動執行該段程序。基于C6713的啟動機制,將BootLoader程序文件寫入FLASH的起始地址的前1 KB的地址區中,BootLoader程序主要功能是將FLASH中存放的在線更新程序或工作程序搬移到C6713的RAM/SDRAM中,再通過調用Jump()跳轉程序,跳轉到程序起始地址,即可執行該段軟件程序[8-12]。
基于高可靠、易操作的設計原則,C6713的軟件在線更新主要分為兩部分:第一部分為嵌入式軟件模塊,此模塊主要包含3個子程序模塊,分別為BootLoader程序模塊、在線更新程序模塊和工作程序模塊,主要實現C6713的嵌入式系統的引導、軟件在線更新及正常工作;第二部分為PC端可視化在線更新上位機,主要完成軟件程序文件的生成及“一鍵式”嵌入式系統的軟件在線更新。
如圖2所示,彈載嵌入式系統的軟件在線更新主要由可視化在線更新上位機、RS422串口通信模塊和嵌入式系統組成。可視化在線更新上位機通過RS422通信模塊與嵌入式系統進行相互通信,完成在線更新指令和待更新程序文件的上傳等操作;嵌入式系統與可視化在線更新上位機進行數據的交互,根據在線更新指令完成在線更新狀態的切換,并對接收程序數據文件的正確性、有效性進行判斷,最終完成軟件程序文件的在線FLASH擦寫操作。

圖2 在線更新系統架構示意圖
基于系統在線更新高可靠性、安全性的設計需求,將C6713外掛的軟件程序存儲FLASH劃分為4個獨立的程序區,分別為BootLoader程序區、在線更新程序區和工作程序區,其中工作程序區還分為當前工作程序區和舊工作程序區。FLASH存儲區劃分如圖3所示,其中BootLoader程序區為64KB,在線更新程序區為320KB,前工作程序區和舊工作程序區均為736KB。

圖3 FLASH存儲區劃分示意圖
BootLoader程序區的前4KB存儲二級引導程序,該程序實現將存儲在BootLoader程序區4KB~64KB的三級引導程序搬移到內存中運行,即實現了C6713的FLASH自啟動。三級引導程序根據程序切換狀態將在線更新程序區或工作程序區的FLASH地址的代碼數據搬移到內存中,再跳轉到相應程序入口地址;在線更新程序區用于存儲在線更新程序模塊,該程序實現與可視化在線更新上位機間的通信,并對工作程序區FLASH地址上存儲的工作程序代碼數據進行擦寫操作;當前工作程序區用于存儲最新版本的工作程序代碼數據,用于嵌入式系統的正常工作使用;舊工作程序區用于存儲前一版本的工作程序代碼數據,用于嵌入式系統工作程序的備份和異常情況工作程序版本恢復。
同時,在線更新程序僅可更新“當前工作程序區”和“舊工作程序區”的程序數據,不可更新“BootLoader程序區”和“在線更新程序區”的程序數據,BootLoader程序和在線更新程序僅在出廠時進行更新,以保障該兩段軟件程序代碼的正確性和完整性。在對“工作程序區”的代碼數據進行更新過程中,將已存儲的于“當前工作程序區”的前一版本的工作程序代碼數據向“舊工作程序區”進行搬移,實現了工作程序代碼數據的備份,在工作程序更新失敗、代碼數據錯誤、FLASH局部數據損壞等異常情況下,“當前工作程序區”的代碼數據無法正常工作,在三級引導搬移當前工作程序區數據時,判斷程序數據異常可重新搬移舊工作程序區的備份代碼數據,避免異常程序對系統造成損壞。因此,通過對工作程序的備份設計,可有效地提高系統的可靠性和安全性。
2.2.1 BootLoader程序設計
C6713復位后,通過EDMA自動將存儲在FLASH起始地址的前1KB的BootLoader程序搬移到C6713內部RAM中運行,完成了C6713的FLASH的自啟動及后續工作/在線更新程序的搬移和跳轉。
BootLoader程序的設計流程如下:首先完成系統時鐘、EMIF總線及中斷等初始化;其次,通過EMIF讀取存儲在FLASH地址“0x90070000”的更新狀態標識字,并對該地址的標識字進行有效性校驗;若該標識有效則根據此有效標識判斷本次進入正常工作態或在線更新態若無效則進入在線更新態;若該標識字無效,因在線更新軟件屬于出廠軟件,故則本次在線更新態,并反饋相應狀態。
進入正常工作態后,軟件執行流程如下:
1)首先讀取FLASH存儲器中“當前工作程序區”的新版本程序代碼數據,并對讀取的數據內容進行CRC32校驗,并與存儲的校驗值進行判斷;
2)若新版本代碼數據有效,則將該代碼數據搬移到C6713中的RAM/SDRAM內存中,并跳轉到該程序的入口地址上,執行新版本的工作程序;
3)若新版本代碼數據無效,則讀取FLASH存儲器中“舊工作程序區”的前一版本程序代碼數據,并判斷數據內容的有效性;
4)若前一版本代碼數據有效,則將該代碼數據搬移到C6713中的RAM/SDRAM內存中,并跳轉到該程序的入口地址上,執行前一版本的工作程序;
5)若前一版本代碼數據無效,則轉入在線更新態。
進入在線更新態后,軟件執行流程如下:
1)讀取FLASH存儲器中“在線更新程序區”的在線更新程序代碼數據;
2)將讀取的代碼數據搬移到C6713中的RAM/SDRAM內存中,并跳轉到該程序的入口地址上,執行在線更新程序。
BootLoader程序執行流程如圖4所示。

圖4 BootLoader程序執行流程
2.2.2 在線更新程序設計
在線更新程序通過與可視化在線更新上位機間進行通信,接收上位機下傳的待更新代碼程序數據,將接收到的完整、正確的程序代碼數據更新,并將前一版本的代碼數據進行備份。為提高在線更新過程中的可靠性、安全性,對各個數據包進行握手、重傳、校驗等方式進行處理;同時,完成所有代碼數據的接收后,并對整個程序文件數據進行特殊的CRC32位校驗,確保上傳程序數據文件的正確性和有效性;進一步,對寫入FLASH地址的數據回讀后與待寫入的數據進行對比,確保FLASH寫入數據的準確。
在線更新程序執行流程如下:
1)通過RS422串口采用“握手”方式與PC端的可視化在線更新上位機建立連接;
2)通過握手、校驗、重傳等方式接收可視化在線更新上位機下發的當前程序文件的入口地址、長度、文件特殊校驗碼等信息,再通過分包形式接收程序代碼數據,并將接收的數據存儲到SDRAM中進行臨時存儲;
3)接收完所有代碼數據后,對接收的程序代碼文件進行特殊校驗碼校驗,并與存儲的特殊校驗碼進行判斷,判斷接收的代碼數據文件是否為該嵌入式軟件的程序,確保程序文件的正確性;
4)對各個寫入到FLASH地址的數據進行回讀,與待寫入的數據進行比較,確認寫入FLASH數據的一致性;
5)將前一版本工作程序文件搬移到“舊工作程序區”進行備份;
6)完成所有操作后,更新FLASH地址“0x90070000”的更新狀態標識字為正常工作態,系統再次啟動時可正常進入最新版本工作程序。
在線更新程序設計流程如圖5所示。

圖5 在線更新程序執行流程
2.2.3 工作程序設計
工作程序主要完成彈載嵌入式系統的正常工作。同時,具備與可視化在線更新上位機間進行通信,可接收上位機下發的在線更新指令,更新FLASH地址“0x90070000”的更新狀態標識字為在線更新態,再完成系統的自復位。
C6713工作程序通過CCS編譯完成后生成的目標文件類型為*.out和*.map文件,無法直接用于C6713的更新使用,需進行格式轉換[13-16]。因此,可視化在線更新上位機實現了軟件程序文件的格式轉換及與嵌入式系統間的通信交互。
軟件程序*.out和*.map文件轉換*.bin文件的處理流程如下:
1)根據*.map文件獲取程序代碼RAM和SAMR存儲的長度、主函數的入口地址等信息;
2)將*.out文件通過hex6x.exe、*.cmd文件轉換到*.hex;(hex6x.exe為TI公司提供文件轉換可執行程序;*.cmd文件負責C6713的內存分配。)
3)將*.hex轉換到*.bin文件,并計算軟件程序文件的特殊校驗碼;
4)將轉換后的*.bin、特殊校驗碼和讀取的*.map文件中的信息拼接成最終可用于在線更新的*.bin文件。
將最終生成好的*.bin文件采用“一鍵化”操作方式完成與嵌入式系統的信息交互,完成在線更新操作。具體流程如下:
1)在“在線更新上位機”上選擇正確的COM串口,點擊“連接串口”,實現與嵌入式系統的通信;
2)點擊“連接主控”,嵌入式軟件由正常工作程序切換更新狀態并進行自復位,重新進入BootLoader程序,并根據更新狀態啟動在線更新程序;
3)進入在線更新程序后,回饋“在線更新上位機”已進入在線更新態;
4)選擇待更新的程序文件,點擊“燒寫主控軟件”將數據上傳給嵌入式在線更新軟件;
5)完成所有數據上傳后,發送FLASH燒寫指令給在線更新程序,在線更新程序完成待更新代碼數據的FLASH擦寫和程序備份操作。
在線更新軟件流程和上位機界面如圖6、圖7所示。

圖6 可視化在線更新上位機執行流程

圖7 可視化在線更新上位機界面
本文提供了一種高可靠性、安全性和操作簡潔的嵌入式軟件在線更新方法,實現了彈載嵌入式軟件快速、便捷的在線更新。對彈載產品嵌入式模塊的在線更新帶來了極大便利,在實際工程項目中取得了良好的應用效果,對其他嵌入式產品軟件在線更新具有一定的參考價值。