張永鵬
(1.中國(guó)電子科技集團(tuán)公司第三十八研究所 合肥 230088; 2.孔徑陣列與空間探測(cè)安徽省重點(diǎn)實(shí)驗(yàn)室 合肥 230088)
現(xiàn)有彈載產(chǎn)品中包含大量的DSP、FPGA等嵌入式模塊,在產(chǎn)品生產(chǎn)交付后,伴隨著產(chǎn)品功能、性能的升級(jí)改進(jìn),需要對(duì)內(nèi)部嵌入式軟件進(jìn)行更新。傳統(tǒng)嵌入式軟件一般采用專用編程線纜及相應(yīng)的仿真器連接芯片后對(duì)軟件進(jìn)行更新,此方法需專人操作且操作復(fù)雜、靈活性低[1-3]。
本文以某彈載雷達(dá)嵌入式DSP芯片TMS320C6713(簡(jiǎn)稱C6713)為例,提供一種可靠性高、操作便捷的嵌入式軟件在線更新方法,實(shí)現(xiàn)彈載產(chǎn)品嵌入式軟件高效的軟件在線更新。此方法極大地提升了彈載產(chǎn)品軟件在線更新的可靠性、安全性和操作便捷性,具有良好的工程應(yīng)用價(jià)值。
嵌入式軟件為了支持在線自更新任務(wù),需要在系統(tǒng)中單獨(dú)設(shè)計(jì)一個(gè)區(qū)別于正常工作程序模塊,專用于嵌入式軟件更新的在線更新程序模塊,如圖1所示。系統(tǒng)正常工作啟動(dòng)時(shí)通過(guò)BootLoader程序(即引導(dǎo)程序)選擇啟動(dòng)工作程序模塊,此時(shí)在線更新程序模塊處于阻塞狀態(tài),當(dāng)需要進(jìn)行軟件在線更新時(shí),工作程序模塊接收外部在線更新控制指令,完成在線更新?tīng)顟B(tài)置位(FLASH地址“0x90070000”存儲(chǔ)在線更新標(biāo)識(shí)),同時(shí)嵌入式DSP軟件通過(guò)調(diào)用Jump(0)函數(shù),將嵌入式軟件重新轉(zhuǎn)入起始0地址開(kāi)始執(zhí)行,即可實(shí)現(xiàn)進(jìn)行嵌入式DSP的自復(fù)位。復(fù)位后,自動(dòng)重新運(yùn)行BootLoader程序,此時(shí)BootLoader程序根據(jù)在線狀態(tài)啟動(dòng)在線更新程序模塊,此時(shí)可接收外部待更新的工作程序文件,并將程序文件寫(xiě)入到工作程序模塊的FLASH儲(chǔ)存地址中,即可完成工作程序模塊的在線更新操作[4-7]。
圖1 在線更新系統(tǒng)架構(gòu)示意圖
C6000系列沒(méi)有自帶的FLASH存儲(chǔ)器,需要通過(guò)EMIF總線與外擴(kuò)的FLASH儲(chǔ)存芯片進(jìn)行通信,因此將程序文件通過(guò)EMIF寫(xiě)入到外擴(kuò)的FLASH中,系統(tǒng)上電復(fù)位后,再通過(guò)FLASH進(jìn)行引導(dǎo)自啟動(dòng),C6713啟動(dòng)時(shí)通過(guò)EDMA自動(dòng)將FLASH起始地址的前1KB內(nèi)容搬移到內(nèi)部的RAM中,并自動(dòng)執(zhí)行該段程序?;贑6713的啟動(dòng)機(jī)制,將BootLoader程序文件寫(xiě)入FLASH的起始地址的前1 KB的地址區(qū)中,BootLoader程序主要功能是將FLASH中存放的在線更新程序或工作程序搬移到C6713的RAM/SDRAM中,再通過(guò)調(diào)用Jump()跳轉(zhuǎn)程序,跳轉(zhuǎn)到程序起始地址,即可執(zhí)行該段軟件程序[8-12]。
基于高可靠、易操作的設(shè)計(jì)原則,C6713的軟件在線更新主要分為兩部分:第一部分為嵌入式軟件模塊,此模塊主要包含3個(gè)子程序模塊,分別為BootLoader程序模塊、在線更新程序模塊和工作程序模塊,主要實(shí)現(xiàn)C6713的嵌入式系統(tǒng)的引導(dǎo)、軟件在線更新及正常工作;第二部分為PC端可視化在線更新上位機(jī),主要完成軟件程序文件的生成及“一鍵式”嵌入式系統(tǒng)的軟件在線更新。
如圖2所示,彈載嵌入式系統(tǒng)的軟件在線更新主要由可視化在線更新上位機(jī)、RS422串口通信模塊和嵌入式系統(tǒng)組成。可視化在線更新上位機(jī)通過(guò)RS422通信模塊與嵌入式系統(tǒng)進(jìn)行相互通信,完成在線更新指令和待更新程序文件的上傳等操作;嵌入式系統(tǒng)與可視化在線更新上位機(jī)進(jìn)行數(shù)據(jù)的交互,根據(jù)在線更新指令完成在線更新?tīng)顟B(tài)的切換,并對(duì)接收程序數(shù)據(jù)文件的正確性、有效性進(jìn)行判斷,最終完成軟件程序文件的在線FLASH擦寫(xiě)操作。
圖2 在線更新系統(tǒng)架構(gòu)示意圖
基于系統(tǒng)在線更新高可靠性、安全性的設(shè)計(jì)需求,將C6713外掛的軟件程序存儲(chǔ)FLASH劃分為4個(gè)獨(dú)立的程序區(qū),分別為BootLoader程序區(qū)、在線更新程序區(qū)和工作程序區(qū),其中工作程序區(qū)還分為當(dāng)前工作程序區(qū)和舊工作程序區(qū)。FLASH存儲(chǔ)區(qū)劃分如圖3所示,其中BootLoader程序區(qū)為64KB,在線更新程序區(qū)為320KB,前工作程序區(qū)和舊工作程序區(qū)均為736KB。
圖3 FLASH存儲(chǔ)區(qū)劃分示意圖
BootLoader程序區(qū)的前4KB存儲(chǔ)二級(jí)引導(dǎo)程序,該程序?qū)崿F(xiàn)將存儲(chǔ)在BootLoader程序區(qū)4KB~64KB的三級(jí)引導(dǎo)程序搬移到內(nèi)存中運(yùn)行,即實(shí)現(xiàn)了C6713的FLASH自啟動(dòng)。三級(jí)引導(dǎo)程序根據(jù)程序切換狀態(tài)將在線更新程序區(qū)或工作程序區(qū)的FLASH地址的代碼數(shù)據(jù)搬移到內(nèi)存中,再跳轉(zhuǎn)到相應(yīng)程序入口地址;在線更新程序區(qū)用于存儲(chǔ)在線更新程序模塊,該程序?qū)崿F(xiàn)與可視化在線更新上位機(jī)間的通信,并對(duì)工作程序區(qū)FLASH地址上存儲(chǔ)的工作程序代碼數(shù)據(jù)進(jìn)行擦寫(xiě)操作;當(dāng)前工作程序區(qū)用于存儲(chǔ)最新版本的工作程序代碼數(shù)據(jù),用于嵌入式系統(tǒng)的正常工作使用;舊工作程序區(qū)用于存儲(chǔ)前一版本的工作程序代碼數(shù)據(jù),用于嵌入式系統(tǒng)工作程序的備份和異常情況工作程序版本恢復(fù)。
同時(shí),在線更新程序僅可更新“當(dāng)前工作程序區(qū)”和“舊工作程序區(qū)”的程序數(shù)據(jù),不可更新“BootLoader程序區(qū)”和“在線更新程序區(qū)”的程序數(shù)據(jù),BootLoader程序和在線更新程序僅在出廠時(shí)進(jìn)行更新,以保障該兩段軟件程序代碼的正確性和完整性。在對(duì)“工作程序區(qū)”的代碼數(shù)據(jù)進(jìn)行更新過(guò)程中,將已存儲(chǔ)的于“當(dāng)前工作程序區(qū)”的前一版本的工作程序代碼數(shù)據(jù)向“舊工作程序區(qū)”進(jìn)行搬移,實(shí)現(xiàn)了工作程序代碼數(shù)據(jù)的備份,在工作程序更新失敗、代碼數(shù)據(jù)錯(cuò)誤、FLASH局部數(shù)據(jù)損壞等異常情況下,“當(dāng)前工作程序區(qū)”的代碼數(shù)據(jù)無(wú)法正常工作,在三級(jí)引導(dǎo)搬移當(dāng)前工作程序區(qū)數(shù)據(jù)時(shí),判斷程序數(shù)據(jù)異??芍匦掳嵋婆f工作程序區(qū)的備份代碼數(shù)據(jù),避免異常程序?qū)ο到y(tǒng)造成損壞。因此,通過(guò)對(duì)工作程序的備份設(shè)計(jì),可有效地提高系統(tǒng)的可靠性和安全性。
2.2.1 BootLoader程序設(shè)計(jì)
C6713復(fù)位后,通過(guò)EDMA自動(dòng)將存儲(chǔ)在FLASH起始地址的前1KB的BootLoader程序搬移到C6713內(nèi)部RAM中運(yùn)行,完成了C6713的FLASH的自啟動(dòng)及后續(xù)工作/在線更新程序的搬移和跳轉(zhuǎn)。
BootLoader程序的設(shè)計(jì)流程如下:首先完成系統(tǒng)時(shí)鐘、EMIF總線及中斷等初始化;其次,通過(guò)EMIF讀取存儲(chǔ)在FLASH地址“0x90070000”的更新?tīng)顟B(tài)標(biāo)識(shí)字,并對(duì)該地址的標(biāo)識(shí)字進(jìn)行有效性校驗(yàn);若該標(biāo)識(shí)有效則根據(jù)此有效標(biāo)識(shí)判斷本次進(jìn)入正常工作態(tài)或在線更新態(tài)若無(wú)效則進(jìn)入在線更新態(tài);若該標(biāo)識(shí)字無(wú)效,因在線更新軟件屬于出廠軟件,故則本次在線更新態(tài),并反饋相應(yīng)狀態(tài)。
進(jìn)入正常工作態(tài)后,軟件執(zhí)行流程如下:
1)首先讀取FLASH存儲(chǔ)器中“當(dāng)前工作程序區(qū)”的新版本程序代碼數(shù)據(jù),并對(duì)讀取的數(shù)據(jù)內(nèi)容進(jìn)行CRC32校驗(yàn),并與存儲(chǔ)的校驗(yàn)值進(jìn)行判斷;
2)若新版本代碼數(shù)據(jù)有效,則將該代碼數(shù)據(jù)搬移到C6713中的RAM/SDRAM內(nèi)存中,并跳轉(zhuǎn)到該程序的入口地址上,執(zhí)行新版本的工作程序;
3)若新版本代碼數(shù)據(jù)無(wú)效,則讀取FLASH存儲(chǔ)器中“舊工作程序區(qū)”的前一版本程序代碼數(shù)據(jù),并判斷數(shù)據(jù)內(nèi)容的有效性;
4)若前一版本代碼數(shù)據(jù)有效,則將該代碼數(shù)據(jù)搬移到C6713中的RAM/SDRAM內(nèi)存中,并跳轉(zhuǎn)到該程序的入口地址上,執(zhí)行前一版本的工作程序;
5)若前一版本代碼數(shù)據(jù)無(wú)效,則轉(zhuǎn)入在線更新態(tài)。
進(jìn)入在線更新態(tài)后,軟件執(zhí)行流程如下:
1)讀取FLASH存儲(chǔ)器中“在線更新程序區(qū)”的在線更新程序代碼數(shù)據(jù);
2)將讀取的代碼數(shù)據(jù)搬移到C6713中的RAM/SDRAM內(nèi)存中,并跳轉(zhuǎn)到該程序的入口地址上,執(zhí)行在線更新程序。
BootLoader程序執(zhí)行流程如圖4所示。
圖4 BootLoader程序執(zhí)行流程
2.2.2 在線更新程序設(shè)計(jì)
在線更新程序通過(guò)與可視化在線更新上位機(jī)間進(jìn)行通信,接收上位機(jī)下傳的待更新代碼程序數(shù)據(jù),將接收到的完整、正確的程序代碼數(shù)據(jù)更新,并將前一版本的代碼數(shù)據(jù)進(jìn)行備份。為提高在線更新過(guò)程中的可靠性、安全性,對(duì)各個(gè)數(shù)據(jù)包進(jìn)行握手、重傳、校驗(yàn)等方式進(jìn)行處理;同時(shí),完成所有代碼數(shù)據(jù)的接收后,并對(duì)整個(gè)程序文件數(shù)據(jù)進(jìn)行特殊的CRC32位校驗(yàn),確保上傳程序數(shù)據(jù)文件的正確性和有效性;進(jìn)一步,對(duì)寫(xiě)入FLASH地址的數(shù)據(jù)回讀后與待寫(xiě)入的數(shù)據(jù)進(jìn)行對(duì)比,確保FLASH寫(xiě)入數(shù)據(jù)的準(zhǔn)確。
在線更新程序執(zhí)行流程如下:
1)通過(guò)RS422串口采用“握手”方式與PC端的可視化在線更新上位機(jī)建立連接;
2)通過(guò)握手、校驗(yàn)、重傳等方式接收可視化在線更新上位機(jī)下發(fā)的當(dāng)前程序文件的入口地址、長(zhǎng)度、文件特殊校驗(yàn)碼等信息,再通過(guò)分包形式接收程序代碼數(shù)據(jù),并將接收的數(shù)據(jù)存儲(chǔ)到SDRAM中進(jìn)行臨時(shí)存儲(chǔ);
3)接收完所有代碼數(shù)據(jù)后,對(duì)接收的程序代碼文件進(jìn)行特殊校驗(yàn)碼校驗(yàn),并與存儲(chǔ)的特殊校驗(yàn)碼進(jìn)行判斷,判斷接收的代碼數(shù)據(jù)文件是否為該嵌入式軟件的程序,確保程序文件的正確性;
4)對(duì)各個(gè)寫(xiě)入到FLASH地址的數(shù)據(jù)進(jìn)行回讀,與待寫(xiě)入的數(shù)據(jù)進(jìn)行比較,確認(rèn)寫(xiě)入FLASH數(shù)據(jù)的一致性;
5)將前一版本工作程序文件搬移到“舊工作程序區(qū)”進(jìn)行備份;
6)完成所有操作后,更新FLASH地址“0x90070000”的更新?tīng)顟B(tài)標(biāo)識(shí)字為正常工作態(tài),系統(tǒng)再次啟動(dòng)時(shí)可正常進(jìn)入最新版本工作程序。
在線更新程序設(shè)計(jì)流程如圖5所示。
圖5 在線更新程序執(zhí)行流程
2.2.3 工作程序設(shè)計(jì)
工作程序主要完成彈載嵌入式系統(tǒng)的正常工作。同時(shí),具備與可視化在線更新上位機(jī)間進(jìn)行通信,可接收上位機(jī)下發(fā)的在線更新指令,更新FLASH地址“0x90070000”的更新?tīng)顟B(tài)標(biāo)識(shí)字為在線更新態(tài),再完成系統(tǒng)的自復(fù)位。
C6713工作程序通過(guò)CCS編譯完成后生成的目標(biāo)文件類型為*.out和*.map文件,無(wú)法直接用于C6713的更新使用,需進(jìn)行格式轉(zhuǎn)換[13-16]。因此,可視化在線更新上位機(jī)實(shí)現(xiàn)了軟件程序文件的格式轉(zhuǎn)換及與嵌入式系統(tǒng)間的通信交互。
軟件程序*.out和*.map文件轉(zhuǎn)換*.bin文件的處理流程如下:
1)根據(jù)*.map文件獲取程序代碼RAM和SAMR存儲(chǔ)的長(zhǎng)度、主函數(shù)的入口地址等信息;
2)將*.out文件通過(guò)hex6x.exe、*.cmd文件轉(zhuǎn)換到*.hex;(hex6x.exe為T(mén)I公司提供文件轉(zhuǎn)換可執(zhí)行程序;*.cmd文件負(fù)責(zé)C6713的內(nèi)存分配。)
3)將*.hex轉(zhuǎn)換到*.bin文件,并計(jì)算軟件程序文件的特殊校驗(yàn)碼;
4)將轉(zhuǎn)換后的*.bin、特殊校驗(yàn)碼和讀取的*.map文件中的信息拼接成最終可用于在線更新的*.bin文件。
將最終生成好的*.bin文件采用“一鍵化”操作方式完成與嵌入式系統(tǒng)的信息交互,完成在線更新操作。具體流程如下:
1)在“在線更新上位機(jī)”上選擇正確的COM串口,點(diǎn)擊“連接串口”,實(shí)現(xiàn)與嵌入式系統(tǒng)的通信;
2)點(diǎn)擊“連接主控”,嵌入式軟件由正常工作程序切換更新?tīng)顟B(tài)并進(jìn)行自復(fù)位,重新進(jìn)入BootLoader程序,并根據(jù)更新?tīng)顟B(tài)啟動(dòng)在線更新程序;
3)進(jìn)入在線更新程序后,回饋“在線更新上位機(jī)”已進(jìn)入在線更新態(tài);
4)選擇待更新的程序文件,點(diǎn)擊“燒寫(xiě)主控軟件”將數(shù)據(jù)上傳給嵌入式在線更新軟件;
5)完成所有數(shù)據(jù)上傳后,發(fā)送FLASH燒寫(xiě)指令給在線更新程序,在線更新程序完成待更新代碼數(shù)據(jù)的FLASH擦寫(xiě)和程序備份操作。
在線更新軟件流程和上位機(jī)界面如圖6、圖7所示。
圖6 可視化在線更新上位機(jī)執(zhí)行流程
圖7 可視化在線更新上位機(jī)界面
本文提供了一種高可靠性、安全性和操作簡(jiǎn)潔的嵌入式軟件在線更新方法,實(shí)現(xiàn)了彈載嵌入式軟件快速、便捷的在線更新。對(duì)彈載產(chǎn)品嵌入式模塊的在線更新帶來(lái)了極大便利,在實(shí)際工程項(xiàng)目中取得了良好的應(yīng)用效果,對(duì)其他嵌入式產(chǎn)品軟件在線更新具有一定的參考價(jià)值。