趙昶宇
(天津津航計算技術研究所,天津 300308)
隨著芯片技術和微電子技術的不斷進步和發展,數字信號處理器(DSP)在圖像處理、通信以及控制等領域被越來越廣泛的應用。早期的DSP 系統通常采用EPROM 或者E2PROM 作為存儲器保存程序代碼,在對這類存儲器進行編程時,需要將存儲芯片取下來利用專門的編程器進行編程。當需要軟件升級的設備較多,或者芯片不易從系統中拆卸時,這種編程方式會給開發人員增加許多工作量。非易失性存儲器FLASH 出現后簡化了編程環境,不需要從系統中拆取芯片,可利用板上的MCU 進行編程,在線編程技術也在此時應運而生。
運用在線編程技術時,DSP 通過某種特定接口對用戶程序進行燒寫和重新編制,不用打開控制箱體和插拔仿真器便可完成程序內部相關參數的變更及監控,遠程更新數據程序。當前DSP 程序的在線燒寫方法是采用某種單一的接口進行程序燒寫,不能滿足多接口燒寫的需求;大多數基于DSP 設計的處理模塊的RAM 容量有限,不能滿足同時選擇和加載多個應用程序的需求;大多數系統在燒寫完升級后的程序后,還需要對DSP 進行復位操作,系統才能運行升級后的程序。為了提高DSP 程序在線燒寫的可靠性和靈活性,滿足用戶采用多通信方式進行在線燒寫的需求,本文提出了一種DSP 程序在線燒寫方法。
傳統的上位機和DSP 端的通信均采用單一固定的通信協議,一旦用戶需求發生改變,或者系統硬件芯片完成替代升級后,新的DSP 硬件系統已經無法使用原有的通信協議實現上位機和DSP 端的通信。這種情況下只能根據新的通信協議重新開發應用軟件,給系統的維護帶來了不小的困難和挑戰。這種單一的通信方式已經不能滿足嵌入式DSP 系統復雜性和多變性的要求,迫切需要一種可支持多種協議的通信機制。
由于當前通信協議的種類繁多,有的通信協議還比較復雜,傳統的支持多種通信協議的工作模式只關注通信接口的實現與開發,這種方式的缺點是可移植性較差,仍然不能滿足用戶的復雜需求。本文提出了一種可擴展的多通信方式模塊,該模塊主要由5 部分組成,即協議層、協議管理層、數據收發層、傳輸層和接口層,同時兼顧有線和無線多種通信能力,可根據具體環境進行靈活選擇。采用可擴展的通信協議棧,可擴展通信接口和通信協議。利用該模塊可將數據的收發過程和數據內部表示的信息分離,數據的收發由抽象的收發器接口表示并由硬件實現,通過專門的協議管理層擴展通信協議,協議管理層具有協議注冊和匹配功能。協議層通常由一組平等的協議集合組成,當系統中需要加入新的協議時,先在協議層實現新的協議,然后向協議管理層注冊后就可以使用[1]。
接口層和傳輸層主要針對硬件設備,一種類型的接口對應一種類型的傳輸層,比如RS232、RS422、RS485 均屬于串口傳輸層;數據收發層的功能是負責設備底層的數據接收和發送,通信協議采用數據統一收發的方式,有效地實現對應用程序和底層接口驅動的隔離;協議管理層的功能是負責協議匹配,并解析已收到的和尚未發送的指令幀的指令類型、目的地址和幀計數;協議層的功能是對數據幀和應答幀進行分類處理。多通信方式的軟件流程如圖1 所示。

圖1 多通信方式的軟件流程圖
傳統的DSP 應用系統中采用Bootloader 程序實現代碼的加載,但是這種方式在實際應用中也存在著很多弊端和限制,具體如下:由于Bootloader 程序固化在DSP 芯片內部,因此,其具有不易修改的特性;該Bootloader 程序只被加載一次,且僅在DSP 芯片上電復位時被加載;Bootloader 程序能夠加載的程序大小有限制。因此,本文設計了一種可擴展的Bootloader 程序,即采用了動態加載技術。
該動態加載技術是一個相對獨立的功能模塊,由動態程序加載模塊實現。它的基本功能是讀取Flash芯片中指定地址內存儲的程序代碼及數據信息,將其加載到DSP 芯片的片內RAM 中;將接收到的程序代碼及數據信息寫入DSP 片內指定的RAM 中。動態程序加載模塊需要將DSP 片內ROM 中固化的加載引導程序(Bootloader)在系統加電啟動后加載到片內RAM中,它的入口參數如下:待讀取的程序或數據的源地址、讀取數據的長度、待寫入的目的地址。動態加載的引導流程如圖2 所示。

圖2 動態加載的引導流程
上層應用程序將待升級的程序文件傳入DSP 中后,由動態程序加載模塊解析其寫入的地址和數據長度,然后通過調用Flash 寫入模塊,將數據寫入擴產的Flash 存儲器中,最后通過動態程序加載模塊將升級后的內容重新加載到DSP 內的RAM 空間,實現無需DSP復位的在線升級操作。
由于DSP 應用程序通常是單線程的,在同一時刻DSP 片內系統程序模塊不會被同時調用。因此,在進行系統設計時無需在DSP 復位后馬上加載上述功能模塊,什么時候需要就什么時候加載,使其共用片內RAM。這樣一來,可以認為DSP 的片內RAM 空間無限大。
目前主流系列的DSP 處理器系統有多種啟動方式,包括主機啟動、仿真器啟動或EMIF 啟動等,后2種啟動方式被廣泛應用在嵌入式系統中。
仿真器啟動通常使用在系統的調試階段,在系統上電啟動時,由仿真器替代主機加載程序代碼,并設置DSPINT 位。
當系統調試完畢進入正常工作階段時,通常采用EMIF 的啟動方式。當系統上電復位工作完成后,按照系統中ROM 的時序,DSP 系統自動從片外FLASH 的起始地址空間開始,拷貝一定字節大小的代碼存放到地址空間從0 開始的RAM 中,拷貝的代碼大小由處理器的類型決定。當訪問FLASH 中的數據時,若CPU的指令字長度大于FLASH 的存儲字寬,則EMIF 控制器先把FLASH 中連續幾個字自動打包成CPU 指令字長寬度的數據包,然后將打包后的數據包傳送到內部RAM 中。當傳送完全部數據包后,CPU 開始從片內RAM 地址為0 的位置執行相應指令。
隨著社會發展,DSP 用戶需求不斷升級變化,其要求在通用的硬件平臺上保留并運行具有多種功能的應用程序。根據不同的應用場景,在DSP 系統啟動時加載運行不同的應用程序,降低各種版本代碼維護的復雜度。為了實現用戶的需求,本文設計了一種在DSP上電啟動時可在多個應用程序中任意選擇并啟動其中一個應用程序的方法,根據系統上電后讀取設備的位置信息,從FLASH 中加載相應的應用程序到系統RAM 中運行,實現了多應用可選的啟動。
在DSP 系統應用開發中,CCS 開發環境生成的目標文件是COFF 格式的.out 可執行二進制文件。在調試階段,CCS 仿真器將COFF 文件加載到系統RAM 中時,RAM 內的程序代碼所在的地址就是程序最終的運行地址,該代碼即為需要生成的純目標代碼,將這些代碼保存為十六進制機器碼DAT 格式的文件,即為應用程序目標文件。該方法可避免傳統復雜的格式轉換工具操作和參數配置操作。
為了啟動不同的應用程序,需要獲得不同的_c_int00 物理地址。利用上述提出的目標文件的生成方法,保存_c_int00 跳轉指令至代碼末尾,形成與具體應用相關的完整應用程序,避免使用具體的_c_int00 物理地址,減少應用開發過程中可能出現的地址引用出錯問題。
利用上述介紹的應用程序在線升級的方法將不同的應用程序分別固化到FLASH 中不同空間區域中。在進行程序固化工作前,為便于維護FLASH 中不同的應用,需用一張軟件配置表來描述不同程序在FLASH 中的映射關系,表的內容主要包括各個程序的名稱、起始地址、程序數據塊大小、分配空間大小、版本號、版本號地址等信息,軟件配置如表1 所示。更新修改程序時,首先索引該表獲得相應的FLASH 空間地址、版本號,防止燒入錯誤的地址或錯誤的版本號。在每次更新完應用程序后,修改相應的版本號等信息便于以后軟件的修改和維護。不同應用程序的啟動流程如圖3 所示。

圖3 不同應用程序的啟動流程
本文提出的DSP 程序通用在線燒寫的方法解決了DSP 在線編程時通信方式單一及不能適應設備復雜性和多變性要求的問題,同時滿足了DSP 啟動時多種應用程序可選的加載需求。該方法提高在線編程的可擴展性和可維護性,提高了模塊通用化能力和模塊硬件利用率,并能降低開發成本,縮短開發周期。