<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          ‘C5402DSP自舉引導方法的分析與研究

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

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

          本文引用地址:http://www.ex-cimer.com/article/242263.htm

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

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

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

          1 幾種自舉引導方式

          1.1 自舉引導方式簡介

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

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

          1.2 '5402 DSP自舉引導方式

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

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

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

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

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

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

          0000:F800

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

          STM #0FFFFh,IFR ;清除IFR標志

          LD #0h,DP ;DP=0,數(shù)據(jù)存儲器頁指針為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ù)存儲空間(OVLY=1);

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

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

          圖1中各種自舉引導方式各有特點[3]:

          ① 主機接口HPI自舉引導方式

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

          ②8位串行EEPROM自舉引導方式

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

          ③并行自舉引導方式

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

          ④標準串行口自舉引導方式

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

          ⑤I/O自舉引導方式

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

          2 并行自舉引導方式

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

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

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

          并行自舉引導程序片段如下:

          ...

          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ù)存儲器讀取自舉表首地址

          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,符號位置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

          ... ;標準串行口自舉引導程序

          par08

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

          par16

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

          3 自舉表的建立

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

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

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

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

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

          C:>hex500 example.emd

          注:在上面的命令行中,example的擴展名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ù)存儲器字寬為16位

          -romwidth 16 /*ROM字寬為16位

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

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

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

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

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

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

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

          STACK .usect STACK,10h ;為名為STACK的椎棧預留16個單元

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

          .bss a,4

          .bss y,1

          .def start ;

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

          table:word 1,2,3,4 ;在以標號table開始的8個程序存儲單元中存放8個已初始化數(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 ;完成三次乘法累加運算

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

          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ù)存儲器內(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位自舉標記
          SWWSR
          BSCR
          程序入口XPC
          程序入口地址
          程序段長度
          存放目標XPC
          存放目標地址
          程序代碼1
          程序代碼2
          ……
          程序代碼25
          程序代碼26(1Ah)
          數(shù)據(jù)段長度
          存放目標XPC
          存放目標地址
          數(shù)據(jù)碼1
          數(shù)據(jù)碼2
          ……
          數(shù)據(jù)碼7
          數(shù)據(jù)碼8
          塊結(jié)束標志
          ……
          自舉表存放首地址

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

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



          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();