新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ‘C5402DSP自舉引導(dǎo)方法的分析與研究

‘C5402DSP自舉引導(dǎo)方法的分析與研究

作者: 時(shí)間:2006-05-07 來源:網(wǎng)絡(luò) 收藏

摘要:介紹'5402 芯片幾種自舉引導(dǎo)方法的特點(diǎn),對(duì)最常用的并行自舉引導(dǎo)方式進(jìn)行了深入的分析及研究,并通過實(shí)例說明建立自舉表的步驟及應(yīng)注意的問題。

本文引用地址:http://m.butianyuan.cn/article/242263.htm

關(guān)鍵詞:器() 自舉引導(dǎo) 并行引導(dǎo)

領(lǐng)域,TI公司(德州儀器公司)一直處于世界霸主地位,它生產(chǎn)的TMS320系列DSP芯片以其獨(dú)特的哈佛結(jié)構(gòu)、硬件密集型方案和靈活的指令系統(tǒng)成為器產(chǎn)業(yè)中的領(lǐng)先者[1]。其C5000系列DSP芯片具有功耗小、高度并行等優(yōu)點(diǎn),可以滿足眾多領(lǐng)域的實(shí)時(shí)處理要求。尤其是新近推出的TMS320VC5402及TMS320UC5402(簡(jiǎn)稱'5402)以其獨(dú)有的高性能、低功耗及低價(jià)位等優(yōu)勢(shì),在推出之初便受到業(yè)界人士的普遍歡迎。

為充分利用DSP快速運(yùn)行的優(yōu)點(diǎn),通常希望用戶程序能在DSP中高速運(yùn)行,這就需要運(yùn)用DSP自舉引導(dǎo)功能。本文以'C5402為例,說明自舉引導(dǎo)的特點(diǎn)及自舉表建立的步驟。

1 幾種自舉引導(dǎo)方式

1.1 自舉引導(dǎo)方式簡(jiǎn)介

眾所周知,欲獲得全速的DSP運(yùn)行速度,方法之一是在DSP芯片出廠前將用戶程序掩膜在其片內(nèi)的ROM上。這種方法對(duì)大部分應(yīng)用場(chǎng)合并不適用,且成本很高。對(duì)大多數(shù)用戶而言,可行的方法是利用DSP自舉引導(dǎo)功能。

Bootlooader(自舉引導(dǎo)程序,也稱引導(dǎo)裝載程序)是在出廠前固化在DSP芯片內(nèi)ROM中的一段程序代碼,其主要功能是在上電或復(fù)位時(shí)將用戶程序從外部加載至程序存儲(chǔ)器(片內(nèi)RAM或擴(kuò)展的RAM)中,以便實(shí)現(xiàn)高速運(yùn)行。因此,用這種方法可以以較低成本實(shí)現(xiàn)高速運(yùn)行。不同型號(hào)的DSP,其Bootlooader也不同。如TMS320C54X系列的DSP提供了四種自舉引導(dǎo)方法[2]:并行EPROM、并行I/O口、串行口及主機(jī)接口HPI自舉引導(dǎo)方式,它們適用于不同的應(yīng)用場(chǎng)合。

1.2 '5402 DSP自舉引導(dǎo)方式

新近推出的'5402 DSP片內(nèi)ROM掩膜的Bootlooader程序與TMS320C54X系列的其它DSP有較大的不同,它包括以下五種自舉引導(dǎo)方式:主機(jī)接口HPI、并行口、標(biāo)準(zhǔn)串行口、8位串行EEPROM及I/O口自舉引導(dǎo)方式。

DSP上電復(fù)位后,首先檢查其MP/MC引腳,如果該引腳為高電平,說明DSP被設(shè)置為微處理器工作方式,即從外部程序存儲(chǔ)器0FF80h地址開始執(zhí)行用戶程序;若該引腳為低電平說明DSP被設(shè)置為微計(jì)算機(jī)工作方式,即從片內(nèi)ROM的0FF80h起執(zhí)行程序。'C5402 DSP片內(nèi)4K ROM掩膜了TI設(shè)計(jì)的幾段程序,其中包括自舉引導(dǎo)程序,具體內(nèi)容如表1所示[3]。因此,為利用自舉引導(dǎo)功能,必須將DSP設(shè)置為微計(jì)算機(jī)工作方式,即MP/MC=0。

由表1可見,從片內(nèi)ROM的0FF80h地址開始存放的是中斷向量表,它實(shí)為一條分支轉(zhuǎn)移指令(BD 0F800h)。該指令使程序跳轉(zhuǎn)至0F800h,并從此開始執(zhí)行自舉引導(dǎo)程序。

表1 '5402片內(nèi)ROM分配表

起始地址 內(nèi) 容
F000h
F800h
FC00h
FD00h
FE00h
FF00h
FF80h
預(yù)留
自舉引導(dǎo)程序
256字μ律擴(kuò)充表
256字A律擴(kuò)充表
256字正弦查找表
預(yù)留
中斷向量表

在執(zhí)行自舉引導(dǎo)搬移程序之前,首先進(jìn)行初始化,其程序片段如下:

0000:F800

SSBX INTM ;INTM=1,使中斷失效

STM #0FFFFh,IFR ;清除IFR標(biāo)志

LD #0h,DP ;DP=0,數(shù)據(jù)存儲(chǔ)器頁(yè)指針為0

ORM #02B00h,ST1 ; XF=INTM=OVM=SXM=1

ORM #020h,PMST ;OVLY=1

STM #07FFFh,SWWSR ;SWWSR=07FFFh

STM #07Dh,SP ; SP=07Dh

從以上程序可看出,初始化的內(nèi)容主要包括:

①關(guān)閉所有可屏蔽中斷(INTM=1);

②將片內(nèi)DARAM映射至程序/數(shù)據(jù)存儲(chǔ)空間(OVLY=1);

③將程序、數(shù)據(jù)及I/O存儲(chǔ)空間均設(shè)置為7個(gè)等待狀態(tài)(SWWSR=07FFFh)。

初始化完成后,根據(jù)外部設(shè)定的條件,選擇不同的自舉引導(dǎo)方式,判斷條件是有先后順序的,其流程如圖1的示。

圖1中各種自舉引導(dǎo)方式各有特點(diǎn)[3]:

① 主機(jī)接口HPI自舉引導(dǎo)方式

欲執(zhí)行的程序代碼通過HPI(主機(jī)接口總線)由外部主處理器加載至片內(nèi)存儲(chǔ)器中。一旦主處理改變了被加載代碼的起始地址(存放于內(nèi)存007Fh處),便開始執(zhí)行程序。

②8位串行EEPROM自舉引導(dǎo)方式

自舉引導(dǎo)程序通過一串聯(lián)的EEPROM讀取自舉表,并按照自舉表中指定的方式加載代碼。該EEPROM與設(shè)置為clockstop模式的多通道緩沖串口McBSP1相連接。

③并行自舉引導(dǎo)方式

自舉引導(dǎo)程序通過外部并行接口總線讀取存放于數(shù)據(jù)存儲(chǔ)空間中的自舉表。自舉表的內(nèi)容包括:欲加載的各段代碼、各代碼段長(zhǎng)度、各代碼段存放的目標(biāo)地址、程序入口地址及其它配置信息。

④標(biāo)準(zhǔn)串行口自舉引導(dǎo)方式

自舉引導(dǎo)程序通過被設(shè)置為標(biāo)準(zhǔn)模式的多通道緩沖串口McBSP0讀取自舉表,并按照自舉表中指定的方式加載代碼。McBSP0及McBSP1分別支持16位及8位串行接收方式。

⑤I/O自舉引導(dǎo)方式

自舉引導(dǎo)程序通過外部并行接口總線從地址為0h的I/O口讀取自舉表。該外部并行接口總線使用了異步握手協(xié)議(利用XF及BIO引腳),使數(shù)據(jù)傳輸速度可按外部設(shè)備的要求設(shè)置。

2 并行自舉引導(dǎo)方式

在'C5402的五種自舉引導(dǎo)方式中,并行自舉引導(dǎo)廣度劃最常用的一種。欲加載的各代碼段存放在字寬為8位或16位的外部存儲(chǔ)器中,在自舉引導(dǎo)時(shí),通過外部并行接口總線將這些代碼從數(shù)據(jù)存儲(chǔ)空間傳送到程序存儲(chǔ)空間。

在并行引導(dǎo)方式中,由于可重新設(shè)置SWWSR及BSCR寄存器的內(nèi)容,所以當(dāng)從快速的外部存儲(chǔ)器EEPROM引導(dǎo)用戶程序時(shí),可采用較少的軟件等待狀態(tài)(默認(rèn)為7個(gè)等待狀態(tài))。

并行自舉引導(dǎo)方式流程圖如圖2所示。從圖2可知,自舉表首地址既可從地址為0FFFFh的I/O口讀取,也可從地址為0FFFFh的數(shù)據(jù)存儲(chǔ)器獲得。兩種方式中,后者更為方便,因在單片的外部存儲(chǔ)器EPROM或FLASH中可同時(shí)包含自舉表內(nèi)容及自舉表存放的首地址。對(duì)'C5402而言,有效的外部數(shù)據(jù)存儲(chǔ)器的地址范圍為04000h~0FFFFh。

并行自舉引導(dǎo)程序片段如下:

...

xentry .set 61H ;61h存放程序入口地址的XPC值

entry .set 62h ;62存放程序入口地址

src .set 65H ;65h存放自舉表首地址

...

0000:F831

STM #0h,@xentry ;初始化程序入口地址

STM #boot,@entry ;

PORTR #0FFFFh,@src ;從I/O口讀取自舉表的首地址

MVDK @src,AR1 ;將自舉表的首地址送至AR1口

LD *AR1+,A ;(AR1)→A,AR1=AR1+1

SUB #010Aah,A,B ;B=A-10AAh

BC par16,BEQ ;若B=0,執(zhí)行16位并行自舉程序

AND #0FFh,A ;屏蔽A高16位

SUB #08h,A,B ;B=A-08h

BC chk_data,BNEQ ;若B≠0,程序跳轉(zhuǎn)至clk_data

LD *AR1+,A ;(AR1)→A,AR1=AR1+1

AND #0FFh,A ;屏蔽A高16位

SUB #0AAh,A ;A=A-0AAh

BC par08,AEQ ;若A=0,執(zhí)行9位并行自舉程序

chk_data STM #0FFFFh,AR1 ;從數(shù)據(jù)存儲(chǔ)器讀取自舉表首地址

NOP ;避免流水線沖突

NOP ;避免流水線沖突

LD *AR1+,A ;(AR1)→A,AR1=AR1+1

STLM A,AR1 ;將A低16位內(nèi)容存入AR1中

NOP ;避免流水線沖突

NOP ;避免流水線沖突

LD *AR1+,A ;(AR1)→A,AR1=AR1+1

SUB #010AAh,A,B ;B=A-10AAh

BC par16,BEQ ;若B=0,執(zhí)行16位并行自舉程序

STM #0FFFFh,AR1 ;(0FFFFh)→AR1

NOP ;避免流水線沖突

NOP ;避免流水線沖突

LDU *AR1-,A ;(AR1)→A,AR1=AR1-1,符號(hào)位置0

AND #0FFh,A ;屏蔽A高16位

SUB #08h,A,B ;B=A-08h

BC ser_ini,BNEQ ;若B≠0,程序跳轉(zhuǎn)至ser_ini

LD *AR1+,A ;(AR1)→A,AR1=AR1+1

AND #0FFh,A ;屏蔽A高16位

SUB #0AAh,A ;A=A-0AAh

BC par098,AEQ ;若A=0,執(zhí)行8位并行自舉程序

Ser_ini

... ;標(biāo)準(zhǔn)串行口自舉引導(dǎo)程序

par08

... ;8位并行自舉搬移程序

par16

... ;16位并行自舉搬移程序

3 自舉表的建立

自舉表內(nèi)容不僅包括了欲加載的各段代碼,而且包括各段代碼長(zhǎng)度、各代碼段存放的目標(biāo)地址、程序入口地址等信息。因此若想利用自舉引導(dǎo)功能,首先必須正確建立自舉表。自舉表可由hex500格式轉(zhuǎn)換器自動(dòng)生成。Hex500實(shí)際為一通用程序,它將公共目標(biāo)文件格式——COFF文件轉(zhuǎn)換成各種EPROM或FLASH的編程格式。因此,在使用hex500工具之前,首先必須對(duì)DSP的匯編語(yǔ)言、C語(yǔ)言或兩者的混合編程語(yǔ)言進(jìn)行匯編、編譯、鏈接,生成COFF格式的.out文件,然后再通過設(shè)置適當(dāng)?shù)倪x項(xiàng)生成用戶所要求的自舉表。

為了書寫及修改方便,可將hex500的所有選項(xiàng)及輸入輸出文件名以.cmd批處理命令文件的形式保存。下面以一個(gè)DSP匯編語(yǔ)言程序example.asm為例,說明建立'C5402自舉表的具體步驟。

第一步:對(duì)example.asm進(jìn)行編譯,生成example.obj文件。不論是用Windows環(huán)境下的CCS(Code Composer Studio),還是用DOS環(huán)境下的asm500命令文件,編譯時(shí)必須加選項(xiàng)一v548,且DOS的asm500版本必須在1.2以上,否則無法生成正確的'C5402自舉表。

第二步:鏈接,生成example.out文件。

第三步:使用hex500格式轉(zhuǎn)換工具,將example.out文件轉(zhuǎn)換成example.hex文件,命令格式如下:

C:>hex500 example.emd

注:在上面的命令行中,example的擴(kuò)展名cmd一定要加上。

以下是命令文件example.cmd的內(nèi)容:

example.out /*被轉(zhuǎn)換的COFF文件名

-e 200h /*程序入口地址被定義為200h

-a /*轉(zhuǎn)換為ASCII-hex格式文件

-o example.hex /*轉(zhuǎn)換后文件名為example.hex

-memwidth 16 /*外部數(shù)據(jù)存儲(chǔ)器字寬為16位

-romwidth 16 /*ROM字寬為16位

-boot /*將COFF文件中各段均轉(zhuǎn)換至自舉表

-bootorg 8000h /*存放自舉表的首地址為8000h

如果example.asm是一個(gè)簡(jiǎn)單的求乘法累加運(yùn)算,程序內(nèi)部如下[2]:

*****************************************

* example.asm y=a1*x1+a2*x2+a3*x3+a4*x4 *

*****************************************

.title example.asm ;源程序取名為example.adm

STACK .usect STACK,10h ;為名為STACK的椎棧預(yù)留16個(gè)單元

.bss x,4 ;在數(shù)據(jù)存儲(chǔ)器中為未初始化變量(續(xù))x,a,y分別預(yù)留4,4,1個(gè)單元

.bss a,4

.bss y,1

.def start ;

.data 以下為數(shù)據(jù)段

table:word 1,2,3,4 ;在以標(biāo)號(hào)table開始的8個(gè)程序存儲(chǔ)單元中存放8個(gè)已初始化數(shù)據(jù)

.word 8,6,4,2

.text ;以下為程序段

start:STM # STACK+10,SP ;設(shè)置堆棧指針

STM # table,AR1 ;AR1指向table的首地址

STM # x, AR2 ;AR2指向存放變量x的首地址

STM # 7, AR0 ;AR0=7

LD # 0,A ;A=0

loop:LD *AR1+,A ;(AR1)→A,AR1=AR1+1

STL A,*AR2+ ;A→(AR2),AR2=AR2+1

BANZ loop,*AR0- ;若AR0≠0,循環(huán),AR0=AR0-1

CALL sum ;若AR0=0,調(diào)用sum子程序

end:B end ;

sum:LD #0,A ;A=0

STM #a,AR3 ;AR3指向存放變量a的首地址

STM #x,AR4 ;AR4指向存放變量x的首地址

RPT #3 ;

MAC AR3+,AR4+,A ;完成三次乘法累加運(yùn)算

STL A,@y ;將結(jié)果存入頂留的數(shù)據(jù)存儲(chǔ)器中

RET ;返回主程序

.end ;結(jié)束匯編命令

則生成的example.hex文件的內(nèi)容如表2所示。

表2 example.hex文件的內(nèi)容

$A8000,
10 AA 7F FF F8 00 00 00 02 00 00 1A 00 00 02 00 77 18 00
0B 77 11 00 80 77 12 00 60 77 10 00 07 E8 00 10 91 80 92
6C 88 02 09 F0 74 02 11 F0 73 02 0F E8 00 77 13 00 74 77
14 00 60 EC 03 B0 9A 80 68 FC 00
00 08 00 00 00 80 00 01 00 02 00 03 00 04 00 08 00 06 00 04
00 02 00

如果將example.hex的內(nèi)容燒寫至16位EPROM中,則其數(shù)據(jù)存儲(chǔ)器內(nèi)部組織結(jié)構(gòu)如表3所示。

表3 16位FPROM的數(shù)據(jù)組織結(jié)構(gòu)

數(shù)據(jù)區(qū)地址內(nèi) 容含 義
8000h
8001h
8002h
8003h
8004h
8005h
8006h
8007h
8008h
8009h
……
8020h
8021h
8022h
8023h
8024h
8025h
8026h
……
802Bh
802Ch
802Dh
……
0FFFFh
10AA
7FFF
F800
0000
0200
001A
0000
0200
7718
000B
……
8068
FC00
0008
0000
0080
0001
0002
……
0004
0002
0000
……
8000

16位自舉標(biāo)記
SWWSR
BSCR
程序入口XPC
程序入口地址
程序段長(zhǎng)度
存放目標(biāo)XPC
存放目標(biāo)地址
程序代碼1
程序代碼2
……
程序代碼25
程序代碼26(1Ah)
數(shù)據(jù)段長(zhǎng)度
存放目標(biāo)XPC
存放目標(biāo)地址
數(shù)據(jù)碼1
數(shù)據(jù)碼2
……
數(shù)據(jù)碼7
數(shù)據(jù)碼8
塊結(jié)束標(biāo)志
……
自舉表存放首地址

由表3的EPROM數(shù)據(jù)組織結(jié)構(gòu)可看出,在0FFFFh地址處存放的是自舉表首地址8000h。從8000h處開始是16位自舉表的內(nèi)容。自舉表的第一個(gè)字是16位自舉標(biāo)記10AA,第二、三個(gè)字分別為寄存器SWWSR及BSCR的內(nèi)容。從第四個(gè)字開始分別是程序入口地址、各代碼段長(zhǎng)度、存放各代碼段的目標(biāo)地址及各段代碼(本例含有程序段及數(shù)據(jù)段),最后為塊結(jié)束標(biāo)志0000h。這樣,一個(gè)正確的自舉表就建立起來了。

'C5402 DSP芯片為用戶提供了豐富靈活的自舉引導(dǎo)方式,用戶可根據(jù)各自的需求選擇不同的引導(dǎo)方式,其中并行自舉是最常用的引導(dǎo)方式之一。正確建立自舉表是充分利用自舉引導(dǎo)功能的前提及關(guān)鍵。



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉