引 言
從主機(jī)向DSP下載可執(zhí)行文件的常用方式有:(1)利用仿真器,通過USB總線和JTAG端口,把可執(zhí)行文件從主機(jī)下載進(jìn)DSP。這種方式適用于軟件研制階段。(2)利用燒寫器,把可執(zhí)行文件燒寫進(jìn)硬件電路板上的Flash芯片中。DSP上電復(fù)位之后,將固化在Flash芯片中的代碼讀入DSP的片上RAM或片外RAM映射成的存儲(chǔ)區(qū)域里。這種方式適用于軟件調(diào)試結(jié)束、需要將其固化在電路板上的階段。固化之后,整個(gè)系統(tǒng)可以脫離主機(jī)運(yùn)行。
在軟件無線電系統(tǒng)的實(shí)際應(yīng)用過程中,還需要這樣一種下載方式:從主機(jī)直接向DSP下載可執(zhí)行文件并且啟動(dòng)程序運(yùn)行。這些可執(zhí)行文件是已經(jīng)經(jīng)過調(diào)試、滿足要求的功能模塊。主機(jī)將它們分別實(shí)時(shí)下載并啟動(dòng)運(yùn)行,能夠迅速地切換整個(gè)軟件無線電系統(tǒng)的業(yè)務(wù)模式,使系統(tǒng)迅速地滿足不同場合的要求,從而把系統(tǒng)面向廣大用戶的通用性與面向特定用戶的專用性很好地結(jié)合起來。
1 以DSP為核心的軟件無線電硬件平臺(tái)簡介
圖1是本文實(shí)例的硬件平臺(tái)框圖。A/D的工作方式由FPGA控制,外界模擬信號(hào)通過A/D采樣,進(jìn)入雙口RAM,DSP從雙口RAM里讀取采樣數(shù)據(jù)。DSP芯片采用TI公司推出的TMS320C6000系列中的C6701,它通過EMIF與SDRAM和SBRAM芯片相連。PCI芯片AMCCS5933在主機(jī)和DSP之間起橋梁作用,它使得主機(jī)可以通過PCI總線訪問DSP的所有存儲(chǔ)空間,DSP也可以通過PCI總線向主機(jī)發(fā)送信息。
2 從主機(jī)通過PCI總線向DSP下載可執(zhí)行文件
2.1 實(shí)現(xiàn)流程
圖2顯示了下載可執(zhí)行文件的整個(gè)流程。
2.2 文件格式轉(zhuǎn)換
開發(fā)運(yùn)行在TMS32C6000系列DSP上的程序時(shí),通常都使用TI公司推出的集成開發(fā)環(huán)境CCS。編譯通過之后,會(huì)生成一個(gè)可執(zhí)行文件*.out。下載到DSP中的就是該*.out文件里的代碼。
以文件loadProgTest.out為例,闡述文件格式的轉(zhuǎn)換過程:
首先把loadProgTest.out文件轉(zhuǎn)換成十六進(jìn)制格式的文件,編寫一個(gè)名為loadProgTest.cmd的文件,內(nèi)容如下:
各條語句的含義如下:
第1行是out文件名;第2行表示輸出ASCII的十六進(jìn)制格式;第3行指明轉(zhuǎn)換后的十六進(jìn)制文件為image模式;第4行表示生成名為loadProgTest.mxp的文件,可以從該文件中看到各段所占的存儲(chǔ)單元;第5行和第6行分別指明memory和ROM的寬度;第7行指明little-endian方式(如果需要使用big-endian方式,把L改為M即可)。
可執(zhí)行文件中的代碼從組織形式上分成若干段,從內(nèi)容上則分為程序代碼和數(shù)據(jù)代碼。第10行表示在DSP的存儲(chǔ)區(qū)域中,為程序代碼開辟的空間是從地址0x00000000到0x0000ffff;程序代碼轉(zhuǎn)換成十六進(jìn)制格式之后,將被寫入loadProgTest.hex文件。第11行表示在DSP的存儲(chǔ)區(qū)域中,為數(shù)據(jù)代碼開辟的空間是從地址0x80000000到0x8000ffff;數(shù)據(jù)代碼轉(zhuǎn)換成十六進(jìn)制格式之后,將被寫入loadProgTest.a10文件。
編寫好loadProgTest.cmd文件之后,從CCS安裝目錄下拷貝出一個(gè)名為hex6x.exe的應(yīng)用程序,把它和loadProgTest.out文件以及l(fā)oadProgTest.cmd文件放在同一個(gè)文件夾里。執(zhí)行命令行hex6x loadProgTest.cmd。
執(zhí)行完后,將生成3個(gè)文件:loadProgTest.mxp、loadProgTest.hex和loadProgTest.a10。
其次,把loadProgTest.hex和loadProgTest.a10 2個(gè)文件分別轉(zhuǎn)換為頭文件
編寫一個(gè)C語言應(yīng)用程序,利用C語言中的文件庫函數(shù),新建一個(gè)名叫code.h的頭文件,然后打開loadProgTest.hex,按從前到后的順序逐一讀取其中的字符。每讀取8個(gè)字符,就在這8個(gè)字符中最先讀取的字符前面加上“0x”,然后把它們寫入頭文件code.h。這樣,就把loadProgTest.hex中的程序代碼組織成了一個(gè)數(shù)組,存放進(jìn)code.h頭文件。用同樣的方法,把loadProgTest.a10中的數(shù)據(jù)代碼組織成一個(gè)數(shù)組,存放進(jìn)data.h頭文件里。
經(jīng)過了上述轉(zhuǎn)換之后,就可以把頭文件code.h和data.h中的數(shù)組,即可執(zhí)行文件loadProgTest.out中的代碼下載進(jìn)DSP中了。
2.3 下載代碼
下載代碼之前要做的準(zhǔn)備工作是把DSP的BOOT方式設(shè)置為HPI方式(HPI指DSP的主機(jī)并行端口),并給DSP一個(gè)復(fù)位脈沖,以鎖存HPI的BOOT方式。這時(shí),DSP的內(nèi)核將處于reset狀態(tài)。
設(shè)置并鎖存DSP的BOOT方式之后,就可以向它下載代碼了。下載代碼的過程全部在PCI驅(qū)動(dòng)程序里完成,主機(jī)可以通過HPI訪問DSP的所有存儲(chǔ)空間。本實(shí)例中,下載程序代碼時(shí),首先配置HPI控制寄存器HPIC為0x00010001,其次配置HPI地址寄存器HPIA為0x00000000,這是程序代碼在DSP存儲(chǔ)空間中的起始存儲(chǔ)地址,然后把code.h里的數(shù)組寫進(jìn)自動(dòng)增量模式的HPI數(shù)據(jù)寄存器HPID。下載數(shù)據(jù)代碼的步驟和下載程序代碼一樣,只是要把HPIA配置成0x80000000,這是數(shù)據(jù)代碼在DSP存儲(chǔ)空間中的起始存儲(chǔ)地址。
2.4 啟動(dòng)程序運(yùn)行
成功下載可執(zhí)行文件的代碼之后,主機(jī)向HPIC寄存器中的DSPINT位寫入1。這個(gè)動(dòng)作同樣是在PCI驅(qū)動(dòng)程序里完成。只要DSPINT=1,DSP的內(nèi)核將被喚醒,自動(dòng)從0x00000000處開始執(zhí)行已下載的程序。
圖2是一個(gè)演示實(shí)例,程序功能是向地址0x80007000至0x80007010的DSP存儲(chǔ)區(qū)寫入0x12345678。可以看到下載程序前后DSP存儲(chǔ)區(qū)的內(nèi)容變化。
3 結(jié) 論
通過轉(zhuǎn)換可執(zhí)行文件的格式,把DSP設(shè)置成HPI的BOOT方式,復(fù)位DSP,下載可執(zhí)行文件代碼,設(shè)置HPIC寄存器的DSPINT位為1,可以實(shí)現(xiàn)從主機(jī)通過PCI總線在線下載可執(zhí)行文件、并且啟動(dòng)程序運(yùn)行的目的。本文中的實(shí)例DSP采用了TMS320C6701,對(duì)于其它型號(hào)的DSP,本文同樣具有指導(dǎo)意義。