牛亞莉(陜西交通職業(yè)技術(shù)學(xué)院,陜西西安 710018)
?
TMS320C6000 DSPs的ROM自動(dòng)引導(dǎo)實(shí)現(xiàn)
牛亞莉
(陜西交通職業(yè)技術(shù)學(xué)院,陜西西安710018)
【摘 要】本文通過對TMS320C6000系列DSP引導(dǎo)方式及初始化過程的分析,根據(jù)實(shí)際工程開發(fā)經(jīng)驗(yàn),完整詳細(xì)的闡述了6000系列DSP的ROM引導(dǎo)方式上電引導(dǎo)過程,以及所需用戶引導(dǎo)文件的編寫,常用系數(shù)表的處理方法,落焊文件的生成等過程,并給出了設(shè)計(jì)代碼,有效解決了TI DSP 6000系列的上電引導(dǎo)及初始化問題。
【關(guān)鍵詞】DSP自動(dòng)引導(dǎo)初始化ROM方式
隨著數(shù)字信號處理技術(shù)的不斷發(fā)展,大規(guī)模集成芯片及電路的出現(xiàn),DSP技術(shù)被廣泛應(yīng)用于鐵路信號傳輸[1]、檢測[2]、識別系統(tǒng)[3]中,實(shí)現(xiàn)產(chǎn)品的小型化、模塊化,大大提高信號處理的靈活度及處理速度,在鐵路提速、高鐵建設(shè)、城市軌道交通發(fā)展中隨處可見。
TMS320C6000系列DSP是TI公司推出的新一代高性能DSP,包括定點(diǎn)系列C62xx、C64xx和浮點(diǎn)系列C67xx,其CPU主頻范圍分布在100MHz到600MHz。在DSP的應(yīng)用過程中,為了保證系統(tǒng)在脫機(jī)狀況下能夠?qū)崿F(xiàn)獨(dú)立運(yùn)行,需要將用戶代碼及一些系數(shù)等文件保存在ROM/FLASH等非易失性存儲(chǔ)器當(dāng)中,在系統(tǒng)加電后,通過DSP自身提供的引導(dǎo)方式將應(yīng)用程序從外部存儲(chǔ)區(qū)搬移到內(nèi)部RAM以便運(yùn)行。這樣一方面擴(kuò)展了DSP有限的ROM資源,另一方面又能充分發(fā)揮DSP內(nèi)部資源的性能優(yōu)勢。
盡管TI 公司的使用指南上提供了不同引導(dǎo)方式的操作方法,但在實(shí)際應(yīng)用中,往往由于文件描述不夠細(xì)致全面加上部分開發(fā)者經(jīng)驗(yàn)不足,使得鏈接命令文件、初始化系數(shù)表及格式化文件等設(shè)計(jì)不當(dāng),導(dǎo)致在DSP上電時(shí)不能正常自舉,往往會(huì)為工程進(jìn)度帶來較大的麻煩,甚至影響產(chǎn)品的可靠性。
C6000系列DSP提供了三種引導(dǎo)方式,不加載、ROM方式加載和HPI方式加載,其中最常用的就是ROM加載方式。DSP芯片上有專門的管腳用來選擇其引導(dǎo)方式和存儲(chǔ)器映射方式,C620x/C670x DSP芯片由BOOTMODE[4:0]管腳決定,C6211/C6711通過HD[1:0]、C6712/C64x通過BOOTMODE[1:0]來設(shè)置。
在ROM引導(dǎo)方式下,DSP加電后首先通過DMA/EDMA將位于外部ROM/FLASH存儲(chǔ)區(qū)0地址開始的內(nèi)容當(dāng)作一幀數(shù)據(jù)搬移到內(nèi)部地址0處。
(1)對于C620x/C670x,DMA從CE1空間自動(dòng)搬移64KB的數(shù)據(jù)到內(nèi)部地址0處;
(2)對于C621x/C671x/C64x,EDMA從CE1空間(對C64x是EMIFB的CE1空間)自動(dòng)搬移1KB的數(shù)據(jù)到地址0處。此時(shí)一般來說需要編寫用戶引導(dǎo)代碼來完成其余數(shù)據(jù)的搬移,因?yàn)橛脩糸_發(fā)的程序一般都會(huì)大于1KB。
傳輸完成后,CPU退出復(fù)位狀態(tài),開始執(zhí)行零地址處的指令,即從中斷向量表進(jìn)入,跳轉(zhuǎn)到DSP庫函數(shù)c_int00或者用戶引導(dǎo)程序,用戶引導(dǎo)程序運(yùn)行結(jié)束后仍然應(yīng)該跳轉(zhuǎn)到c_int00,然后開始DSP的初始化過程。
c_int00完成C開發(fā)環(huán)境的初始化以及.bss段全局變量的初始化,由auto_init庫函數(shù)控制,調(diào)用memcpy庫函數(shù)從.cinit數(shù)據(jù)段中搬移相應(yīng)的數(shù)據(jù)到.bss段中對應(yīng)的全局變量中,這些過程全都是由DSP自動(dòng)完成的。初始化完成后,即開始執(zhí)行應(yīng)用程序,進(jìn)入main函數(shù)。
表1 CMD文件各段含義
一般我們都采用c語言與匯編語言混合使用來進(jìn)行DSP軟件設(shè)計(jì),一個(gè)基本的DSP工程至少應(yīng)該包含一個(gè)主程序main()函數(shù)、一個(gè)中斷向量表.vextors段和一個(gè)鏈接命令文件*.cmd。
DSP的命令文件用于將程序中的各段正確的分配到C6000的地址空間中去,通過連接器生成可執(zhí)行的.out文件。如第二節(jié)所介紹的,DSP加載后首先從0地址處開始執(zhí)行,中斷向量表應(yīng)該安排在地址零處,我們可以根據(jù)實(shí)際需要安排程序在0地址處直接轉(zhuǎn)向c_int00或者轉(zhuǎn)向用戶引導(dǎo)程序。
常見的DSP應(yīng)用當(dāng)中還有對系數(shù)表的應(yīng)用,在編程中可以將系數(shù)表作為一個(gè)匯編文件添加到DSP工程中,這樣在編譯連接后該文件就會(huì)作為一個(gè)數(shù)據(jù)段出現(xiàn)在最后的.out文件(COEF格式)中,可以在加載之后由DMA搬移到內(nèi)部數(shù)據(jù)區(qū)待用。
3.1命令文件
命令文件的編寫關(guān)系到整個(gè)工程是否能夠正常工作[4],因此是DSP程序設(shè)計(jì)非常關(guān)鍵的一個(gè)環(huán)節(jié)。
以下以6701為例來說明CMD文件的編寫:
-c
-l rts6701.lib
-stack 0x0400
MEMORY
{
PRAM : origin = 0x00000000,len = 0x0FFFF
DRAM_init : origin = 0x80000000,len = 0x04800
DRAM: origin = 0x80004800,len = 0x0b000
}
SECTIONS
{
.vectors> PRAM
.my_boot> PRAM
.text> PRAM
.cinit: load=PRAM, run=DRAM_init
.bss> DRAM_init
.far> DRAM_init
.stack> DRAM_init
.data_buf1
{
coef.obj
} load=PRAM, run=DRAM_init
.data_buf2> DRAM
}
其中,-c代表運(yùn)行時(shí)自動(dòng)初始化全局變量,ROM加載模式應(yīng)該使用該選項(xiàng);各段含義如表1:
DSP最終形成的.out文件分為三種類型的數(shù)據(jù)段,如表中括號注明的代碼段、初始化段和非初始化段,每一種類型的段都有一個(gè)加載地址和一個(gè)運(yùn)行地址。由于我們選擇ROM自動(dòng)引導(dǎo)方式,上電后位于外部ROM中的程序會(huì)自動(dòng)搬移到內(nèi)部0地址處的RAM,即DSP通常所指的程序RAM(PRAM)當(dāng)中,所以這里的加載地址可以直接寫成內(nèi)部PRAM。代碼段的加載地址和運(yùn)行地址都在PRAM;非初始化段的加載地址和運(yùn)行地址都在DRAM_init;而初始化段則應(yīng)該分配兩個(gè)地址,加載地址在PRAM,運(yùn)行地址在DRAM_init。因此,對于分配了兩個(gè)地址的數(shù)據(jù)段就需要編寫用戶引導(dǎo)代碼,將其從加載地址搬移到運(yùn)行地址。
3.2用戶引導(dǎo)代碼
由于在DSP的引導(dǎo)過程中C編譯環(huán)境還沒有得到初始化,所以用戶引導(dǎo)代碼一般采用匯編語言進(jìn)行設(shè)計(jì),主要用于初始化段的搬移或者1KB以外的代碼數(shù)據(jù)搬移,以下為具體設(shè)計(jì)實(shí)例:
.sect “.my_boot”
.include boot_c671x.h62
.global _boot
_boot:
;配置EMIF控制寄存器(C621x/C671x/C64x需要,若只是實(shí)現(xiàn)初始化段搬移則不需要此配置)
MVKL EMIF_GCTL,A4
|| MVKL 0x3090,B4 ;具體值參考手冊設(shè)置
MVKH EMIF_GCTL,A4
|| MVKH 0x3090,B4
stw B4,*A4
;根據(jù)需要配置EMIF CE空間控制寄存器、SDRAM 控制寄存器
…………
;設(shè)置CSR、ICR、IER寄存器
………….
;設(shè)置DMA控制寄存器
MVKL 0x01840044, A1;DMA3_PRIMARY_CTRL
|| MVKL 0xfffffffc,B2
MVKH 0x01840044, A1
|| MVKH 0xfffffffc,B2
LDW *A1, A10
AND A10, B2, A11
STW A11, *A1
;配置DMA副控寄存器,源/目的寄存器,計(jì)數(shù)寄存器
此時(shí)需參考編譯器產(chǎn)生的map文件,確定所需搬移各段地址和長度(注:map文件中長度數(shù)據(jù)對應(yīng)于32bit)
…………………
;啟動(dòng)DMA
MVKL 0x0b000051,A2
MVKH 0x0b000051,A2
STW A2, *A1
IDLE ;傳輸結(jié)束后產(chǎn)生中斷,在中斷向量表中跳轉(zhuǎn)到c_int00,開始初始化過程
用戶編寫的應(yīng)用程序經(jīng)過正確的編譯連接以后生成COEF格式的.out文件,由于ROM/FLASH存儲(chǔ)器不支持這種格式,所以在燒寫之前需要將其轉(zhuǎn)換為十六進(jìn)制碼的格式。TI提供了專用工具h(yuǎn) e x 6 x . e x e可以實(shí)現(xiàn)該轉(zhuǎn)換過程,該文件位于安裝目錄下tic6000cgtoolsin文件夾中。
以下是格式轉(zhuǎn)換命令文件實(shí)例:
channel_s.out/* 用戶應(yīng)用程序的.out文件,作為hex6x的輸入*/
-m/* 輸出文件格式,m代表Motorola-S格式 */
-memwidth 8/* 存儲(chǔ)寬度 */
-romwidth 8/* ROM數(shù)據(jù)寬度 */
-o channel_2.hex/* 輸出文件名稱 */
ROMS
{
FLASH:org = 0x00000000, length = 0xFFFF
}
若采用16bit ROM加載方式,則連接兩片8位的ROM,地址線連接方式相同,數(shù)據(jù)線高低八位分別連接。此時(shí),存儲(chǔ)寬度設(shè)置為16,將產(chǎn)生兩個(gè)HEX文件,命令文件中相應(yīng)內(nèi)容改寫為:
-memwidth 16
ROMS
{
FLASH:org = 0x00000000, length = 0xFFFF
files={ channel_2.b0, channel_2.b1 }
}
其中.b0文件是低八位數(shù)據(jù) ,.b1是高八位數(shù)據(jù)。通過以上步驟轉(zhuǎn)換后即可得到可燒寫的目標(biāo)文件。
本文通過分析TMS320C6000系列DSP的加載及初始化過程,結(jié)合實(shí)際開發(fā)經(jīng)驗(yàn),給出了用于ROM自動(dòng)加載模式下DSP的軟件設(shè)計(jì)和文件格式轉(zhuǎn)換方法。通過具體的代碼實(shí)例詳細(xì)說明了設(shè)計(jì)過程,尤其是對于命令文件和用戶引導(dǎo)程序的編寫。
參考文獻(xiàn):
[1]張西峰,杜普選.基于TMS3206722的高度鐵路軌道信號發(fā)送與接收模擬系統(tǒng)[J].2010(10):25-28.
[2]孫國斌.基于DSO+FPGA架構(gòu)的DC6000V供電鐵路客車逆變電源的設(shè)計(jì)與實(shí)現(xiàn)[J].鐵道車輛,2013(7):13-15.
[3]黃雪程,王焱,劉春.基于DSP的鐵路信號識別技術(shù)[J].鐵路計(jì)算機(jī)應(yīng)用,2009(4):46-48.
[4]李方慧,王飛,何佩琨.TMS320C6000系列DSPs原理與應(yīng)用[M].北京:電子工業(yè)出版社,2003.
作者簡介:牛亞莉(1980—),女,陜西,碩士,陜西交通職業(yè)技術(shù)學(xué)院,高級工程師,從事城市軌道交通控制及數(shù)字信號處理方面的工作。