文獻標(biāo)識碼: A
文章編號: 0258-7998(2013)07-0134-03
DM642[1]是TI公司推出的一款高性能的數(shù)字多媒體處理器, 屬于C64x系列DSP芯片,并保留了C64x原有的內(nèi)核結(jié)構(gòu),具有二級存儲器和高速緩沖器, 以及超長指令字結(jié)構(gòu)。其運算速度快、體積小、功耗低的優(yōu)點使其廣泛應(yīng)用于多媒體處理領(lǐng)域[2]。
DM642系統(tǒng)在脫機運行時, 用戶代碼需要在加電后自動加載運行。這一過程通常由引導(dǎo)加載程序(bootloader)來完成的,bootloader自動將一段存儲在外部非易失性存儲器中的代碼移植到高速存儲器單元中執(zhí)行。因此, 開發(fā)可靠穩(wěn)定的bootloader成為嵌入式系統(tǒng)項目中的一個重點和難點。本文在深入研究分析DM642系統(tǒng)軟硬件的基礎(chǔ)上,摒棄傳統(tǒng)的匯編移植方案,用C語言實現(xiàn)了DM642的引導(dǎo)加載過程,同時該方案對于TI C6000系列DSP芯片具有通用性,可以在該系列不同器件中方便地移植。
1 DM642與Flash硬件連接
系統(tǒng)選用意法半導(dǎo)體公司的SST39VF080 Flash芯片,其容量為1 M×8 bit,8根數(shù)據(jù)線,20根地址線,與DM642的EMIF接口實現(xiàn)無縫連接[3],兩者接線圖如圖1所示。DM642選擇EMIF啟動時,從CE1空間起始處(地址0x90000000)加載數(shù)據(jù),所以外部Flash必須接在EMIF接口的CE1空間。
2 DM642加載方式研究
2.1 DM642自啟動方式
DM642有三種啟動方式,分別是Host boot、EMIF boot和No boot。系統(tǒng)上電或復(fù)位時通過采樣引腳AEA[22:21]的電平來設(shè)置,具體配置如表1所示。
DM642選擇Host boot啟動方式時,系統(tǒng)上電復(fù)位后CPU將停止運行,其他設(shè)備正常運行。這期間,外部主機能夠通過Host接口初始化CPU的存儲器和內(nèi)部的配置寄存器,主機完成初始化工作后,通過設(shè)置HPIC寄存器的DSPINT位,CPU即從0地址開始運行。選擇No boot啟動方式時,CPU直接從0地址運行程序。本文重點研究EMIF boot啟動方式的加載過程。
2.2 EMIF boot加載過程
DM642系統(tǒng)的CE1空間外接Flash固態(tài)存儲器,當(dāng)選擇從EMIF啟動時,DM642芯片內(nèi)部已完成固化的加載程序(也稱一級bootloader)會自動從Flash空間(CE1空間,起始地址0x90000000)讀取1 KB數(shù)據(jù)到內(nèi)部RAM空間(起始地址0x00000000),然后跳轉(zhuǎn)到0x00000000處執(zhí)行。這個過程由DM642處理器自動完成,用戶無法干預(yù)。
如果用戶的應(yīng)用程序很小(<1 KB),則直接通過系統(tǒng)的一級bootloader加載即可;但是用戶的應(yīng)用程序通常>1 KB,所以位于0x00000000地址的1 KB程序通常也是一個引導(dǎo)程序(又稱二級bootloader),其作用是將應(yīng)用程序從Flash中讀出并放到內(nèi)存中,然后跳轉(zhuǎn)到c_int00()執(zhí)行,這個過程也被稱為二次加載[4]。
3 二級bootloader程序設(shè)計
3.1 傳統(tǒng)設(shè)計方案
二級bootloader需要完成3部分功能:
(1)初始化EMIF口,配置其寄存器;
(2)把Flash中1 KB以后的各程序段和數(shù)據(jù)拷貝到指定的存儲物理地址中;
(3)跳到C程序入口點c_int00()運行。
傳統(tǒng)的二級bootloader設(shè)計方案多通?;赥I公司提供的匯編例程移植實現(xiàn)[5],該方案要求設(shè)計者熟練掌握TI C6000系列DSP匯編語言,開發(fā)難度大、周期長。
3.2 C語言實現(xiàn)
二級bootloader采用匯編語言編寫,是因為在引導(dǎo)過程中還未建立C語言的運行環(huán)境,包括系統(tǒng)堆棧定義、初始化堆棧、初始化全局和靜態(tài)變量等[6]。但是如果能夠避開系統(tǒng)堆棧操作,仍然可以使用C語言編寫二級bootloader程序。
這些與系統(tǒng)堆棧相關(guān)的操作主要有兩方面:(1)定義局部變量時使用register修飾類型,表明是定義在寄存器中,而不是堆棧中;(2)不需進行函數(shù)調(diào)用,包括C庫函數(shù)的調(diào)用。
把目標(biāo)工程燒寫到Flash中,數(shù)據(jù)在Flash中的分配如圖2所示。其中,前1 KB空間(圖中灰色部分)存放二級bootloader;地址0x90000400之后的Flash空間存放用戶應(yīng)用程序,從圖2可知應(yīng)用程序存儲是以_c_int00()開始,以0x00000000結(jié)束,中間是各代碼段和數(shù)據(jù)段。
基于上述Flash中數(shù)據(jù)分配,以下是對應(yīng)的二級bootloader部分C語言程序代碼:
#include <c6x.h>
#define Flash_CODE_ADDR 0x90000400
#pragma CODE_SECTION(boot, ".bootloader");
extern far void c_int00(void);
void boot(void)
{ register int code_i;
register int addr_ptr;
register int code_len;
register int code_addr;
//此處需要先初始化EMIF口;
// addr_ptr指向代碼段1長度位置
addr_ptr = (int)(FLASH_CODE_ADDR+4);
for(; ;)
{
//代碼段長度
code_len = *(volatile int *)addr_ptr;
addr_ptr += 4;
//代碼段運行地址
code_addr = *(volatile int *)addr_ptr;
addr_ptr += 4;
if(code_len == 0x00000000)
{
//跳轉(zhuǎn)到C語言入口
c_int00();
}
else
{
//把代碼段從Flash中讀到片內(nèi)來
for(code_i=0;code_i<code_len;code_i++)
{
*(char *)(code_addr+code_i)
= *(char *)addr_ptr;
addr_ptr++;
}
}
}
}
程序中"#pragma CODE_SECTION(boot,".bootloader")語句的作用是將boot定位在.Bootloader段,然后在.cmd文件中將.bootloader段映射到片內(nèi)起始1 KB內(nèi)存區(qū)。此bootloader程序編譯后體積為352 B,不會超過1 KB的限制。另外該程序是基于小端字節(jié)序編寫,若系統(tǒng)為大端字節(jié)序,需要作少許修改。
使用C語言設(shè)計bootloader,極大提高了程序的可讀性和移植性,加快了用戶應(yīng)用程序的開發(fā)。但其效率低于傳統(tǒng)的匯編bootloader,所以從系統(tǒng)上電到加載完成運行所需時間略長。
3.3 程序燒寫
在CCS中目標(biāo)工程生成的是COFF格式(.out文件)。而Flash燒寫工具一般只支持ASC II十六進制格式,所以,必須先用16進制轉(zhuǎn)換工具將.out文件轉(zhuǎn)換成.hex文件[7],再進行燒寫。燒寫目標(biāo)程序的步驟為:
(1)編譯生成目標(biāo)工程的.out文件,在編譯之前需進行如下操作: ①把上述C語言編寫的bootloader程序添加到目標(biāo)工程中去; ②修改目標(biāo)工程的.cmd文件,將bootloader這段代碼映射到片內(nèi)起始1 KB內(nèi)存區(qū),目標(biāo)工程中的其他代碼放在后面。
(2)用16進制轉(zhuǎn)換工具h(yuǎn)ex6x.exe從.out文件產(chǎn)生.hex文件。
(3)用Flashburn軟件燒錄.hex文件。
3.4 結(jié)果驗證
系統(tǒng)采用自主研發(fā)的DM642硬件平臺,為了驗證C語言bootloader程序的可行性與穩(wěn)定性,具體操作步驟如下:
(1)編寫測試應(yīng)用程序,其功能是通過串口循環(huán)向PC機發(fā)送預(yù)定的數(shù)據(jù);
(2)按照上述方法把程序燒寫到Flash中;
(3)斷電,設(shè)置 AEA[22:21]為“11”,即EMIF boot啟動方式;
(4)系統(tǒng)與PC串口連接、上電,查看PC機上的串口調(diào)試助手是否收到預(yù)定的數(shù)據(jù)。
驗證時,若PC機上的串口調(diào)試助手收到的數(shù)據(jù)與DM642應(yīng)用程序發(fā)送的數(shù)據(jù)一致,則表明該方案可行。重復(fù)驗證操作,每次都能收到預(yù)定的數(shù)據(jù),則表明該方案穩(wěn)定。
本文的創(chuàng)新之處在于采用C語言實現(xiàn)了DM642的二級引導(dǎo)加載程序的設(shè)計,不再需要使用TI公司提供的匯編程序例程進行移植,提高了程序的可讀性和移植性。在實際項目中已經(jīng)證實了該方案可行性和穩(wěn)定性,同時,該方案適用于TI C6000系列各種型號,可以在該系列不同器件中方便地移植,為基于DM642的實際應(yīng)用開發(fā)提供了新的途徑。
參考文獻
[1] TI. SPRS200N TMS320DM642 video/imaging fixed-point digital signal processor[S]. 2002.
[2] 張志濤,梁光明.基于DM642的Flash分頁二級引導(dǎo)程序設(shè)計[J].現(xiàn)代電子技術(shù),2009(22):210-212.
[3] 韓非,胡春海.TMS320C6000系列DSP開發(fā)應(yīng)用技巧[M].北京:中國電力出版社,2008.
[4] 王躍宗,劉京會.TMS320DM642 DSP應(yīng)用系統(tǒng)設(shè)計與開發(fā)[M].北京:人民郵電出版社,2009.
[5] 劉志發(fā),張東,楊艷,等.基于DM642自啟動的Flash燒寫原理研究及實現(xiàn)[J].現(xiàn)代電子技術(shù),2008(22):8-11.
[6] 李興友,游志勝.基于DM642的大容量Flash引導(dǎo)加載方法研究與實現(xiàn)[J].計算機應(yīng)用,2005,25(8):1939-1941.
[7] 胡海龍,彭啟琮.TMS320C6713基于DSP/BIOS的二級BootLoader開發(fā)[J]. 現(xiàn)代電子技術(shù),2005(15):74-75.