趙昶宇
(天津津航計算技術(shù)研究所,天津 300308)
隨著芯片技術(shù)和微電子技術(shù)的不斷進步和發(fā)展,數(shù)字信號處理器(DSP)在圖像處理、通信以及控制等領(lǐng)域被越來越廣泛的應(yīng)用。早期的DSP 系統(tǒng)通常采用EPROM 或者E2PROM 作為存儲器保存程序代碼,在對這類存儲器進行編程時,需要將存儲芯片取下來利用專門的編程器進行編程。當需要軟件升級的設(shè)備較多,或者芯片不易從系統(tǒng)中拆卸時,這種編程方式會給開發(fā)人員增加許多工作量。非易失性存儲器FLASH 出現(xiàn)后簡化了編程環(huán)境,不需要從系統(tǒng)中拆取芯片,可利用板上的MCU 進行編程,在線編程技術(shù)也在此時應(yīng)運而生。
運用在線編程技術(shù)時,DSP 通過某種特定接口對用戶程序進行燒寫和重新編制,不用打開控制箱體和插拔仿真器便可完成程序內(nèi)部相關(guān)參數(shù)的變更及監(jiān)控,遠程更新數(shù)據(jù)程序。當前DSP 程序的在線燒寫方法是采用某種單一的接口進行程序燒寫,不能滿足多接口燒寫的需求;大多數(shù)基于DSP 設(shè)計的處理模塊的RAM 容量有限,不能滿足同時選擇和加載多個應(yīng)用程序的需求;大多數(shù)系統(tǒng)在燒寫完升級后的程序后,還需要對DSP 進行復(fù)位操作,系統(tǒng)才能運行升級后的程序。為了提高DSP 程序在線燒寫的可靠性和靈活性,滿足用戶采用多通信方式進行在線燒寫的需求,本文提出了一種DSP 程序在線燒寫方法。
傳統(tǒng)的上位機和DSP 端的通信均采用單一固定的通信協(xié)議,一旦用戶需求發(fā)生改變,或者系統(tǒng)硬件芯片完成替代升級后,新的DSP 硬件系統(tǒng)已經(jīng)無法使用原有的通信協(xié)議實現(xiàn)上位機和DSP 端的通信。這種情況下只能根據(jù)新的通信協(xié)議重新開發(fā)應(yīng)用軟件,給系統(tǒng)的維護帶來了不小的困難和挑戰(zhàn)。這種單一的通信方式已經(jīng)不能滿足嵌入式DSP 系統(tǒng)復(fù)雜性和多變性的要求,迫切需要一種可支持多種協(xié)議的通信機制。
由于當前通信協(xié)議的種類繁多,有的通信協(xié)議還比較復(fù)雜,傳統(tǒng)的支持多種通信協(xié)議的工作模式只關(guān)注通信接口的實現(xiàn)與開發(fā),這種方式的缺點是可移植性較差,仍然不能滿足用戶的復(fù)雜需求。本文提出了一種可擴展的多通信方式模塊,該模塊主要由5 部分組成,即協(xié)議層、協(xié)議管理層、數(shù)據(jù)收發(fā)層、傳輸層和接口層,同時兼顧有線和無線多種通信能力,可根據(jù)具體環(huán)境進行靈活選擇。采用可擴展的通信協(xié)議棧,可擴展通信接口和通信協(xié)議。利用該模塊可將數(shù)據(jù)的收發(fā)過程和數(shù)據(jù)內(nèi)部表示的信息分離,數(shù)據(jù)的收發(fā)由抽象的收發(fā)器接口表示并由硬件實現(xiàn),通過專門的協(xié)議管理層擴展通信協(xié)議,協(xié)議管理層具有協(xié)議注冊和匹配功能。協(xié)議層通常由一組平等的協(xié)議集合組成,當系統(tǒng)中需要加入新的協(xié)議時,先在協(xié)議層實現(xiàn)新的協(xié)議,然后向協(xié)議管理層注冊后就可以使用[1]。
接口層和傳輸層主要針對硬件設(shè)備,一種類型的接口對應(yīng)一種類型的傳輸層,比如RS232、RS422、RS485 均屬于串口傳輸層;數(shù)據(jù)收發(fā)層的功能是負責(zé)設(shè)備底層的數(shù)據(jù)接收和發(fā)送,通信協(xié)議采用數(shù)據(jù)統(tǒng)一收發(fā)的方式,有效地實現(xiàn)對應(yīng)用程序和底層接口驅(qū)動的隔離;協(xié)議管理層的功能是負責(zé)協(xié)議匹配,并解析已收到的和尚未發(fā)送的指令幀的指令類型、目的地址和幀計數(shù);協(xié)議層的功能是對數(shù)據(jù)幀和應(yīng)答幀進行分類處理。多通信方式的軟件流程如圖1 所示。
圖1 多通信方式的軟件流程圖
傳統(tǒng)的DSP 應(yīng)用系統(tǒng)中采用Bootloader 程序?qū)崿F(xiàn)代碼的加載,但是這種方式在實際應(yīng)用中也存在著很多弊端和限制,具體如下:由于Bootloader 程序固化在DSP 芯片內(nèi)部,因此,其具有不易修改的特性;該Bootloader 程序只被加載一次,且僅在DSP 芯片上電復(fù)位時被加載;Bootloader 程序能夠加載的程序大小有限制。因此,本文設(shè)計了一種可擴展的Bootloader 程序,即采用了動態(tài)加載技術(shù)。
該動態(tài)加載技術(shù)是一個相對獨立的功能模塊,由動態(tài)程序加載模塊實現(xiàn)。它的基本功能是讀取Flash芯片中指定地址內(nèi)存儲的程序代碼及數(shù)據(jù)信息,將其加載到DSP 芯片的片內(nèi)RAM 中;將接收到的程序代碼及數(shù)據(jù)信息寫入DSP 片內(nèi)指定的RAM 中。動態(tài)程序加載模塊需要將DSP 片內(nèi)ROM 中固化的加載引導(dǎo)程序(Bootloader)在系統(tǒng)加電啟動后加載到片內(nèi)RAM中,它的入口參數(shù)如下:待讀取的程序或數(shù)據(jù)的源地址、讀取數(shù)據(jù)的長度、待寫入的目的地址。動態(tài)加載的引導(dǎo)流程如圖2 所示。
圖2 動態(tài)加載的引導(dǎo)流程
上層應(yīng)用程序?qū)⒋壍某绦蛭募魅隓SP 中后,由動態(tài)程序加載模塊解析其寫入的地址和數(shù)據(jù)長度,然后通過調(diào)用Flash 寫入模塊,將數(shù)據(jù)寫入擴產(chǎn)的Flash 存儲器中,最后通過動態(tài)程序加載模塊將升級后的內(nèi)容重新加載到DSP 內(nèi)的RAM 空間,實現(xiàn)無需DSP復(fù)位的在線升級操作。
由于DSP 應(yīng)用程序通常是單線程的,在同一時刻DSP 片內(nèi)系統(tǒng)程序模塊不會被同時調(diào)用。因此,在進行系統(tǒng)設(shè)計時無需在DSP 復(fù)位后馬上加載上述功能模塊,什么時候需要就什么時候加載,使其共用片內(nèi)RAM。這樣一來,可以認為DSP 的片內(nèi)RAM 空間無限大。
目前主流系列的DSP 處理器系統(tǒng)有多種啟動方式,包括主機啟動、仿真器啟動或EMIF 啟動等,后2種啟動方式被廣泛應(yīng)用在嵌入式系統(tǒng)中。
仿真器啟動通常使用在系統(tǒng)的調(diào)試階段,在系統(tǒng)上電啟動時,由仿真器替代主機加載程序代碼,并設(shè)置DSPINT 位。
當系統(tǒng)調(diào)試完畢進入正常工作階段時,通常采用EMIF 的啟動方式。當系統(tǒng)上電復(fù)位工作完成后,按照系統(tǒng)中ROM 的時序,DSP 系統(tǒng)自動從片外FLASH 的起始地址空間開始,拷貝一定字節(jié)大小的代碼存放到地址空間從0 開始的RAM 中,拷貝的代碼大小由處理器的類型決定。當訪問FLASH 中的數(shù)據(jù)時,若CPU的指令字長度大于FLASH 的存儲字寬,則EMIF 控制器先把FLASH 中連續(xù)幾個字自動打包成CPU 指令字長寬度的數(shù)據(jù)包,然后將打包后的數(shù)據(jù)包傳送到內(nèi)部RAM 中。當傳送完全部數(shù)據(jù)包后,CPU 開始從片內(nèi)RAM 地址為0 的位置執(zhí)行相應(yīng)指令。
隨著社會發(fā)展,DSP 用戶需求不斷升級變化,其要求在通用的硬件平臺上保留并運行具有多種功能的應(yīng)用程序。根據(jù)不同的應(yīng)用場景,在DSP 系統(tǒng)啟動時加載運行不同的應(yīng)用程序,降低各種版本代碼維護的復(fù)雜度。為了實現(xiàn)用戶的需求,本文設(shè)計了一種在DSP上電啟動時可在多個應(yīng)用程序中任意選擇并啟動其中一個應(yīng)用程序的方法,根據(jù)系統(tǒng)上電后讀取設(shè)備的位置信息,從FLASH 中加載相應(yīng)的應(yīng)用程序到系統(tǒng)RAM 中運行,實現(xiàn)了多應(yīng)用可選的啟動。
在DSP 系統(tǒng)應(yīng)用開發(fā)中,CCS 開發(fā)環(huán)境生成的目標文件是COFF 格式的.out 可執(zhí)行二進制文件。在調(diào)試階段,CCS 仿真器將COFF 文件加載到系統(tǒng)RAM 中時,RAM 內(nèi)的程序代碼所在的地址就是程序最終的運行地址,該代碼即為需要生成的純目標代碼,將這些代碼保存為十六進制機器碼DAT 格式的文件,即為應(yīng)用程序目標文件。該方法可避免傳統(tǒng)復(fù)雜的格式轉(zhuǎn)換工具操作和參數(shù)配置操作。
為了啟動不同的應(yīng)用程序,需要獲得不同的_c_int00 物理地址。利用上述提出的目標文件的生成方法,保存_c_int00 跳轉(zhuǎn)指令至代碼末尾,形成與具體應(yīng)用相關(guān)的完整應(yīng)用程序,避免使用具體的_c_int00 物理地址,減少應(yīng)用開發(fā)過程中可能出現(xiàn)的地址引用出錯問題。
利用上述介紹的應(yīng)用程序在線升級的方法將不同的應(yīng)用程序分別固化到FLASH 中不同空間區(qū)域中。在進行程序固化工作前,為便于維護FLASH 中不同的應(yīng)用,需用一張軟件配置表來描述不同程序在FLASH 中的映射關(guān)系,表的內(nèi)容主要包括各個程序的名稱、起始地址、程序數(shù)據(jù)塊大小、分配空間大小、版本號、版本號地址等信息,軟件配置如表1 所示。更新修改程序時,首先索引該表獲得相應(yīng)的FLASH 空間地址、版本號,防止燒入錯誤的地址或錯誤的版本號。在每次更新完應(yīng)用程序后,修改相應(yīng)的版本號等信息便于以后軟件的修改和維護。不同應(yīng)用程序的啟動流程如圖3 所示。
圖3 不同應(yīng)用程序的啟動流程
本文提出的DSP 程序通用在線燒寫的方法解決了DSP 在線編程時通信方式單一及不能適應(yīng)設(shè)備復(fù)雜性和多變性要求的問題,同時滿足了DSP 啟動時多種應(yīng)用程序可選的加載需求。該方法提高在線編程的可擴展性和可維護性,提高了模塊通用化能力和模塊硬件利用率,并能降低開發(fā)成本,縮短開發(fā)周期。