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

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

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

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