王碩果,肖 強(qiáng)
摘 要:在嵌入式系統(tǒng)中,經(jīng)常要求上電后系統(tǒng)能自動(dòng)把程序從DSP外部的ROM加載到片內(nèi)RAM執(zhí)行。給出一種基于TMS320C6701 DSP的ROM加載方案,通過(guò)配置CCS中DSP/BIOS模塊的參數(shù)實(shí)現(xiàn)DSP程序中代碼和數(shù)據(jù)段的先后分開(kāi)加載,比傳統(tǒng)的由手動(dòng)編寫連接命令文件(.CMD)實(shí)現(xiàn)自動(dòng)加載更為方便。在此基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了用CCS直接對(duì)FLASH芯片進(jìn)行在線燒寫。實(shí)驗(yàn)證明,該DSP加載方案穩(wěn)定可靠,且易于實(shí)現(xiàn)。
關(guān)鍵詞:DSP;TMS320C6701;ROM加載;FLASH
中圖分類號(hào):TP391文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1004-373X(2009)19-086-03
Research of Auto Bootload on TMS320C6701 DSP
WANG Shuoguo,XIAO Qiang
(Radar Guidance Research Institute,China Airborne Missile Academy,Luoyang,471009,China)
Abstract:The program code needs to be loaded from external ROM to internal RAM in embedded system when it is switched on.A method of ROM bootload based on TMS320C6701 DSP is presented,which implements code and data section loading dividually by configuring the DSP/BIOS module in CCS,then a method of FLASH online programming with CCS is presented.The feasibility and conveniency of this bootload method are verified.
Keywords:DSP;TMS320C6701;ROM bootload;FLASH
0 引 言
在許多DSP應(yīng)用系統(tǒng)中,都需要DSP芯片能夠在加電后自動(dòng)從外部設(shè)備加載程序,也就是引導(dǎo)(Bootload)。TI公司的TMS320C6000系列芯片有三種引導(dǎo)方式可供選擇,分別是不加載、ROM加載和主機(jī)加載[1],詳細(xì)工作流程如下:
不加載:CPU直接從地址0處開(kāi)始執(zhí)行代碼。如果該處內(nèi)存是SDRAM,那么CPU會(huì)先掛起,等待SDRAM的初始化完成。
ROM加載:位于外部CE1空間的ROM中的代碼首先通過(guò)DMA/EDMA被搬入地址0處。加載過(guò)程在復(fù)位信號(hào)撤銷后開(kāi)始,此時(shí)CPU內(nèi)部保持復(fù)位狀態(tài),由DMA/EDMA執(zhí)行一個(gè)單幀的數(shù)據(jù)塊傳輸。對(duì)于C620x/C670x,DMA從CE1空間中拷貝64 KB數(shù)據(jù)到地址0處。傳輸完成后,CPU退出復(fù)位狀態(tài),開(kāi)始執(zhí)行地址0處的指令。對(duì)于C62x/C67x,用戶還可以指定外部加載ROM的存儲(chǔ)寬度,EMIF會(huì)自動(dòng)把相鄰的8 b/16 b數(shù)據(jù)合成32 b的指令。
主機(jī)加載:也就是HPI加載。CPU停留在復(fù)位狀態(tài),芯片其余部分保持正常狀態(tài)。引導(dǎo)過(guò)程中,外部主機(jī)通過(guò)主機(jī)接口初始化CPU的存儲(chǔ)空間。主機(jī)完成所有的初始化工作后,向接口控制寄存器的DSPINT位寫1,結(jié)束引導(dǎo)過(guò)程。此時(shí)CPU退出復(fù)位狀態(tài),開(kāi)始執(zhí)行地址0處的指令。
1 ROM加載的實(shí)現(xiàn)
究竟使用哪種引導(dǎo)方式取決于芯片引導(dǎo)模式設(shè)置,而引導(dǎo)模式由BOOTMODE[4:0]管腳確定。系統(tǒng)加電后,RESET信號(hào)有效,DSP芯片復(fù)位,在RESET信號(hào)上升沿處鎖存BOOTMODE[4:0]管腳上的設(shè)置值,以此決定DSP芯片內(nèi)存映射方式、地址0處的內(nèi)存類型以及復(fù)位后芯片的引導(dǎo)模式。本例中C6701的BOOTMODE值設(shè)為01101,即8 b ROM加載。
ROM加載是工程中最常見(jiàn)的加載方式,這種方式可以把程序代碼段和數(shù)據(jù)段保存在ROM,FLASH等非易失存儲(chǔ)器中,加載過(guò)程完全由DSP自動(dòng)完成,在實(shí)際應(yīng)用中十分方便。ROM加載的具體步驟如下。
1.1 分配存儲(chǔ)空間,生成目標(biāo)文件(.out)
TI代碼產(chǎn)生工具產(chǎn)生的目標(biāo)文件是一種模塊化的文件格式——COFF格式。程序中的代碼和數(shù)據(jù)在COFF文件中是以段的形式組織的。對(duì)于C語(yǔ)言文件,編譯器生成的代碼段名為.text。全局變量和靜態(tài)變量分配在.bss段中,而局部變量或寄存器變量分配到.stack段或使用寄存器。在DSP的配置文件中必須將這些代碼段正確地分配到C6701的地址空間中去。
在TI提供的DSP軟件開(kāi)發(fā)平臺(tái)Code Composer Studio(CCS)中,編寫DSP系統(tǒng)的工作程序,并對(duì)DSP芯片的內(nèi)存空間、EMIF接口等進(jìn)行正確的配置后,程序編譯通過(guò),CCS就會(huì)自動(dòng)產(chǎn)生目標(biāo)(后綴為.out)文件,這種.out文件即為COFF格式的。
在ROM加載模式下,復(fù)位后C6701將通過(guò)DMA方式將FLASH中的前64 KB數(shù)據(jù)搬運(yùn)到DSP的片內(nèi)程序RAM執(zhí)行,因此,必須將前面編譯好的工作程序的代碼段燒寫到FLASH地址空間中的前64 KB,而數(shù)據(jù)段則應(yīng)該燒寫在FLASH首地址64 KB以后。這就需要在DSP芯片的內(nèi)存段管理中,將數(shù)據(jù)段的加載地址(Load Address)配置為CE1空間FLASH上的指定地址,以保證DSP在復(fù)位后能正確地從FLASH上的不同地址讀取代碼和數(shù)據(jù)(見(jiàn)圖1)。
圖1 DSP自動(dòng)引導(dǎo)過(guò)程
利用CCS自帶的DSP/BIOS配置工具,可以在類似Windows Explorer的窗口界面下直觀方便地初始化DSP芯片的數(shù)據(jù)結(jié)構(gòu)并設(shè)置不同的參數(shù),而不需要再單獨(dú)編寫連接命令文件(link command file,后綴為.cmd)。保存該配置文件時(shí),配置工具自動(dòng)生成匹配當(dāng)前配置的匯編源文件和頭文件以及一個(gè)鏈接命令文件。當(dāng)構(gòu)建(Build)應(yīng)用程序時(shí),這些文件都會(huì)自動(dòng)被鏈接進(jìn)應(yīng)用程序。在CCS中打開(kāi)DSP/BIOS中的.cdb文件,操作System下的MEM(Memory Section Manager)模塊就可以對(duì)DSP存儲(chǔ)器映射空間進(jìn)行配置,并可以設(shè)置程序編譯后生成的代碼段、數(shù)據(jù)段是如何分配到這些存儲(chǔ)器空間的。這對(duì)ROM加載能否成功至關(guān)重要,要實(shí)現(xiàn)ROM加載必須把一些關(guān)鍵的代碼和數(shù)據(jù)段裝在系統(tǒng)的ROM中,但上電后仍在較快的DSP片內(nèi)RAM中運(yùn)行。這需要在DSP的內(nèi)存映射空間上先劃分出外部FLASH的起始地址和長(zhǎng)度(如圖2中的EDFLASH段),并將CCS編譯產(chǎn)生的各個(gè)段的運(yùn)行地址(Run Address)和加載地址(Load Address)分配到合適的存儲(chǔ)空間。需要特別注意的是,數(shù)據(jù)及代碼初始化段的加載地址必需放在FLASH空間上(如圖3),只讀的段都可以放在FLASH上,非初始化段只需要分配運(yùn)行地址。
圖2 配置DSP的存儲(chǔ)區(qū)
圖3 各段的加載地址
下面是用DSP/BIOS配置工具在DSP內(nèi)存空間中劃分好的各段開(kāi)始地址及長(zhǎng)度,其中EDFLASH就是外部FLASH上用于二次加載的地址空間。代碼則存放在FLASH的首地址,也就是0x1400000。
MEMORY {
IPRAM:origin=0x0,len=0x10000
IDRAM: origin=0x80000000,len=0x4000
SRAM: origin=0x400000, len=0x40000
IDRAMB1:origin=0x80004000,len=0x7000
EDFLASH:origin=0x1410000,len=0x10000}
1.2 轉(zhuǎn)換文件格式,得到燒寫文件(.h)
程序編譯好后輸出的是COFF格式的.out文件,這種文件無(wú)法直接寫進(jìn)FLASH,所以只能將其轉(zhuǎn)換為其他FLASH支持的格式。一般來(lái)說(shuō),對(duì)FLASH燒寫的傳統(tǒng)方法是通過(guò)CCS自帶的格式轉(zhuǎn)換器hex6x把.out文件轉(zhuǎn)換為FLASH可識(shí)別的十六進(jìn)制格式(如Motorola-S、ASCII-Hex等),再用專門的編程器將其燒寫到FLASH芯片中保存。該方法的實(shí)現(xiàn)需要使用專門的FLASH燒寫器,實(shí)際應(yīng)用中較為不便,本工程中,在CCS環(huán)境下,通過(guò)JTAG口,完全由DSP控制對(duì)FLASH進(jìn)行燒寫和擦除,實(shí)現(xiàn)了對(duì)外部FLASH的在線編程。
由于燒寫是在CCS程序中實(shí)現(xiàn),所以首先要把.out格式的目標(biāo)文件轉(zhuǎn)換為工程中可包含的.h文件。根據(jù)前面提到的方法,需要把工作程序編譯后得到的代碼段和數(shù)據(jù)段分別寫進(jìn)FLASH中的不同地址,這就需要將COFF文件中的代碼段和數(shù)據(jù)段分別提取出來(lái)。具體做法是:使用CCS中“File-Data-Save”分別把代碼段和數(shù)據(jù)段保存為dat文件(code.dat和data.dat),代碼段和數(shù)據(jù)段的具體起始地址及長(zhǎng)度可以參考程序連接后自動(dòng)生成的連接過(guò)程結(jié)果說(shuō)明文件(后綴為.map,其中記錄了段的各種詳細(xì)信息,從中還可以知道各段的地址分配是否正確)。雖然保存下來(lái)的代碼段和數(shù)據(jù)段都是.dat格式,但其內(nèi)容已經(jīng)是我們所需要的DSP工作需要的底層機(jī)器碼,所以只需要將其作為一個(gè)數(shù)組的內(nèi)容,再給數(shù)組加上合適的類型定義,就可以直接將其格式改為能在CCS工程中直接調(diào)用的.h文件(code.h和data.h)。這樣也就巧妙地解決了格式轉(zhuǎn)換問(wèn)題。
1.3 燒寫FLASH
有了.h格式的燒寫文件,下面就只需要再編寫一個(gè)用于擦除和燒寫FLASH的DSP工作程序,由DSP控制并通過(guò)JTAG線操作FLASH芯片,燒寫和擦除時(shí)要按照FLASH芯片手冊(cè)中的要求先向指定地址寫入指定關(guān)鍵字。注意代碼和數(shù)據(jù)應(yīng)分別寫入FLASH中相應(yīng)的存儲(chǔ)地址。
以上三步完成后,DSP就可以在重新加電時(shí)實(shí)現(xiàn)自動(dòng)引導(dǎo):首先從地址0x1400000處搬移64 KB初始化程序到片內(nèi)運(yùn)行,然后再?gòu)牡刂?x1410000處加載剩余的代碼和數(shù)據(jù)。
2 結(jié) 語(yǔ)
實(shí)際工程中的應(yīng)用證明了上述方法可以使TMS320C6701在脫離上位機(jī)的情況下實(shí)現(xiàn)上電后自動(dòng)加載運(yùn)行,并且穩(wěn)定可靠,操作方便,使用JTAG線和仿真器就可完成所有操作。該方法只要對(duì)一些存儲(chǔ)空間的配置稍作修改即可用于C6000系列其他DSP芯片的自動(dòng)加載。另外,本文思路也可推廣到其他DSP芯片的自動(dòng)加載設(shè)計(jì)中。
參考文獻(xiàn)
[1]李芳慧,王飛,何佩琨,等.TMS320C6000系列DSPs原理與應(yīng)用[M].2版.北京:電子工業(yè)出版社,2003.
[2]TMS320C6000 Tools:Vector Table and Boot ROM Creation[Z].2004.
[3]TMS320C620x/670x DSP Boot Modes and Configuration Reference Guide[Z].2003.
[4]TMS320C6000 Assembly Language Tools User′s Guide[Z].2002.
[5]TMS320C6000 DSP/BIOS User′s Guide[Z].2000.
[6]奚剛,吳清華.TMS320F2812內(nèi)存管理與FLASH引導(dǎo)模式實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2007,30(22):58-60.
[7]徐良波,龍小民.TMS320VC33并行自舉的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2007,30(22):183-184,190.