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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于C語(yǔ)言設(shè)置TMS320 DSP中斷向量表

          基于C語(yǔ)言設(shè)置TMS320 DSP中斷向量表

          作者: 時(shí)間:2008-10-14 來(lái)源:網(wǎng)絡(luò) 收藏

          摘要: 隨著芯片應(yīng)用的不斷深入,用開(kāi)發(fā)芯片,不僅可以使芯片的開(kāi)發(fā)速度大大提高,也使得程序的修改和移植變得十分方便。設(shè)置TMS320系列DSP向量表是高級(jí)語(yǔ)言開(kāi)發(fā)DSP的一個(gè)具體應(yīng)用。

          1、引言

          DSP(數(shù)字信號(hào)處理器)自二十世紀(jì)70年代末80年代初誕生以來(lái),得到了突飛猛進(jìn)的發(fā)展,在信號(hào)處理、通訊、雷達(dá)等方面應(yīng)用越來(lái)越廣泛,而且開(kāi)發(fā)手段和開(kāi)發(fā)設(shè)備也越來(lái)越多樣化。其中在DSP開(kāi)發(fā)應(yīng)用中起著越來(lái)越重要的作用,以C語(yǔ)言編寫的DSP應(yīng)用程序具有可讀性、可移植性,易于維護(hù)和修改。另外在DSP應(yīng)用系統(tǒng)中,是完成數(shù)據(jù)傳遞、實(shí)時(shí)處理等的重要手段,因而用C語(yǔ)言完成對(duì)DSP設(shè)置是DSP開(kāi)發(fā)的重要內(nèi)容。

          DSP中斷的設(shè)置主要包括中斷服務(wù)程序的編寫,的設(shè)置,中斷寄存器的初始化等內(nèi)容。本文以TI公司TMS320系列DSP為例,說(shuō)明用C語(yǔ)言設(shè)置的方法。并給出實(shí)例進(jìn)行說(shuō)明。

          2、的定位

          中斷服務(wù)程序的地址(中斷向量)要裝載到存儲(chǔ)器的合適區(qū)域。一般這些向量都定位在0x0開(kāi)始的程序存儲(chǔ)器中。但有些處理器要求或者可以在其他的存儲(chǔ)區(qū)域安裝中斷向量。

          對(duì)于微處理器模式下的TMS320C25、TMS320C26、TMS320C28、TMS320C30、TMS320C31,中斷向量定位于0x0開(kāi)始的地址。對(duì)于微計(jì)算機(jī)/程序引導(dǎo)模式下的TMS320C31的中斷向量定位于0x809fc1,TMS320C26的中斷向量定位于0xffa0。TMS320C5X復(fù)位向量定位在0x0,其他中斷向量可以定位于任何2K字的程序存儲(chǔ)器中,中斷向量表的定位是與PMST寄存器的IPTR位有關(guān),有效的中斷向量表的基地址是0x0,0x800,0x1000,0x1800,0x2000,…0xf800。

          TMS320C4X的復(fù)位向量定位在四個(gè)地址之一,這四個(gè)地址由外部引腳RESETLOC0和RESETLOC1決定。TMS320C4X的中斷向量可存在于任何512字范圍的存儲(chǔ)器中,中斷向量表的地址由中斷向量表指針(IVTP)寄存器決定。另外,TMS320C4X的自陷(trap)中斷向量可存放在512字范圍的存儲(chǔ)器中,自陷向量表的地址由自陷向量表指針(TVTP)寄存器決定。有效的中斷或者自陷向量表的基地址是0x0,0x200,0x400,0x800,0xa00,0xc00,0xe00,0x1000,0x1200…0xfffffe00,如表1所示。

          有兩種方法可以初始化中斷向量表,下面講解這兩種方法:

          方法一:利用已命名的ASM段

          生成向量表的最直接方法就是用匯編指令.sect來(lái)生成一個(gè)表。這個(gè)表包含中斷向量的地址和跳轉(zhuǎn)指令。
          表1
          處理器 向量表基地址 說(shuō)明
          TMS320C2X 0x0 不包括微計(jì)算機(jī)/程序引導(dǎo)模式下的TMS320C26
          TMS320C26 0xffa0 微計(jì)算機(jī)/程序引導(dǎo)模式
          TMS320C30 0x0
          TMS320C31 0x0 微處理器模式
          TMS320C31 0x809fc1 微計(jì)算機(jī)/程序引導(dǎo)模式
          TMS320C4X 復(fù)位 0x0,0x7fffffff,0x80000000,0xfffffff 外部引腳RESETLOC0和RESETLOC1決定
          中斷向量 任意512字范圍 IVTP寄存器決定
          自陷向量 任意512字范圍 TVTP寄存器決定
          TMS320C5X 復(fù)位 0x0
          中斷向量 任意2K字?jǐn)?shù)據(jù)頁(yè) PMST寄存器的IPTR位決定
          在微計(jì)算機(jī)/程序引導(dǎo)模式下TMS320C2X、TMS320C5X和TMS320C31 從中斷向量的位置處執(zhí)行代碼,因而要用跳轉(zhuǎn)指令來(lái)代替中斷向量,如TMS320C31用24位指令BR來(lái)實(shí)現(xiàn):
          INT1: BR _c_int01
          在微處理器模式下TMS320C30、TMS320C31和TMS320C4X,中斷向量是下一條存取指令的地址,因而中斷服務(wù)程序的地址用匯編指令.word存儲(chǔ)在中斷向量處。例如,TMS320C4X中斷1 可用匯編語(yǔ)言定義如下:
          INT1: .word _c_int01
          因?yàn)橹袛喾?wù)的標(biāo)識(shí)符在匯編語(yǔ)言模塊外部被聲明,所以標(biāo)識(shí)符必須用.ref或.global來(lái)聲明。下面的例子是一個(gè)匯編語(yǔ)言模塊(vecs.asm)定義了一個(gè)包含TMS320C5X跳轉(zhuǎn)指令的段。
          .ref _c_int0, _c_int1 ;在外部定義中斷向量
          .sect “vectors” ;聲明一個(gè)一命名的段
          RS: b _c_int0 ;轉(zhuǎn)至復(fù)位向量
          I1: b _c_int1 ;轉(zhuǎn)至中斷向量1

          處理保留和未使用的區(qū)域

          有時(shí)中斷向量表中包含保留的地址,例如微計(jì)算機(jī)/程序引導(dǎo)模式下的TMS320C26或者TMS320C4X和TMS320C5X的復(fù)位和中斷向量不連續(xù)的情形。TMS320C31也會(huì)發(fā)生這種情形,系統(tǒng)中并不是所有的中斷都能被用到。為了處理向量映象中的保留地址,就要使用匯編指令.space。注意對(duì)于定點(diǎn)設(shè)備.space保留的是位,對(duì)于浮點(diǎn)設(shè)備.space保留的字。例如,微計(jì)算機(jī)/程序引導(dǎo)模式下TMS320C26,假設(shè)所有中斷都是可用的
          .sect “vectors” ;為復(fù)位和中斷向量定義已命名的段
          .space 2*16 ;保留的空間
          b _c_int1 ;INT0
          b _c_int2 ;INT1
          b _c_int3 ;INT2
          b _c_int4 ;TINT
          b _c_int5 ;RINT
          b _c_int6 ;XINT
          b _c_int7 ;TRAP

          注意.space指令為復(fù)位向量保留的位置在程序引導(dǎo)方式下不能使用,因?yàn)閺?fù)位會(huì)啟動(dòng)程序引導(dǎo)功能。使用.space時(shí)vectors段鏈接到0xfa00,不使用.space指令該段鏈接到0xfa02。

          但是,如果定時(shí)器和自陷中斷向量被使用時(shí),可用.space指令對(duì)向量表進(jìn)行如下的定義:

          .sect “vectors” ;為復(fù)位和中斷向量定義已命名的段
          .space 2*4*16 ;保留的和3個(gè)未使用的向量
          b _c_int4 ;TINT
          .space 2*2*16 ;2個(gè)未使用的向量
          b _c_int7 ;TRAP

          注意在中斷和自陷向量表中未使用的部分可用來(lái)存儲(chǔ)數(shù)據(jù)。但為了保證中斷處理的正確,一定要確保中斷和自陷向量不被破壞。

          鏈接到存儲(chǔ)器映象

          已命名段產(chǎn)生后,TMS320鏈接器就會(huì)把向量表鏈接到存儲(chǔ)器的合適位置,共分三步進(jìn)行:
          1.鏈接匯編語(yǔ)言模塊;
          2.根據(jù)中斷向量表的定位定義鏈接器的MEMORY段;
          3.在鏈接器的SECTIONS命令中,定位這些已命名的段。

          下面是TMS320C5X的命令文件,將vectors定位到040h。
          -c
          vecs.obj
          main.obj
          -l rts50.lib
          MENORY
          {
          PAGE0:VECTORS:origin = 0000h, length = 003fh
          ROM :origin = 0040h, length = 007cfh
          }
          SECTIONS
          {
          “vectors” :{} > VECTORS
          .text :{} > ROM
          .
          }

          方法二:安裝一個(gè)運(yùn)行時(shí)的向量

          這種方法在開(kāi)發(fā)和調(diào)試時(shí)很有用的,這種方法是用C語(yǔ)句在裝載中斷服務(wù)程序地址時(shí)建立一個(gè)運(yùn)行時(shí)的向量。該方法適用于微處理器模式下的TMS320C30和TMS320C31,以及TMS320C4X,因?yàn)樗鼈冎挥玫刂?,而不用跳轉(zhuǎn)指令作為中斷向量。其重點(diǎn)就是將中斷服務(wù)程序的地址放到合適的存儲(chǔ)器空間,例如,TMS320C30地址0x1對(duì)應(yīng)于外部中斷0(INT0),在該地址安裝中斷服務(wù)程序c_int01。使用如下語(yǔ)句“
          *((void (**) () )0x1) = c_int01;

          這里,0x1被轉(zhuǎn)換成指向函數(shù)的指針,因?yàn)樗瘮?shù)c_int01的地址。

          3、向量表指針

          TMS320C4X和TMS320C5X都可以不將中斷向量表放在0x0開(kāi)始的位置。這兩個(gè)系列的DSP都是由寄存器來(lái)確定中斷向量的位置。TMS320C4X的復(fù)位向量地址是由處理器的引腳確定的四個(gè)地址中的一個(gè)。中斷能夠被正確的處理,首先必須在接收到中斷之前對(duì)中斷向量表進(jìn)行初始化。下面幾個(gè)例子是用來(lái)說(shuō)明初始化與中斷有關(guān)的寄存器的方法。

          例1:在C中嵌入?yún)R編語(yǔ)句
          這個(gè)例子,利用在C語(yǔ)言中嵌入?yún)R編語(yǔ)句來(lái)設(shè)置TMS320C4X的中斷向量,其起始地址為0x0,方法是通過(guò)將IVTP寄存器的值設(shè)置為0x0。
          asm(“ PUSH R0”);
          asm(“ LDI 0h, R0”);
          asm(“ LDPE R0, IVTP”);
          asm(“ POP R0”);

          例2:利用TMS320C4X的PRTS
          這個(gè)例子,利用TMS320C4X的并行運(yùn)行
          支持庫(kù)來(lái)設(shè)置中斷向量表,起始地址為0x02ff800,利用PRTS庫(kù)函數(shù)set_ivtp()設(shè)置IVTP寄存器的值使向量表定位于RAM0存儲(chǔ)器的開(kāi)始地址。當(dāng)使用PRTS時(shí),不需要用戶命名中斷向量段,而是在運(yùn)行時(shí)使用PRTS函數(shù)install_int_vector()將向量定位在預(yù)先定義的段.vector中。這種方法要求向量在運(yùn)行時(shí)安裝,以防止程序和數(shù)據(jù)被修改。另外,首先要把PRTS庫(kù)鏈接到程序,并在命令文件中預(yù)先定義.vector段,把.vector段定位在ROM0存儲(chǔ)器的開(kāi)始地址。命令文件如下所示:
          -l prts40.lib
          MEMORY
          {
          RAM0:org = 0x2ff800 , len = 0x400
          }
          SECTIONS
          {
          “.vector”: {} > RAM0
          }
          主程序中必須包含頭文件intpt40.h。函數(shù)set_ivtp()使用預(yù)定義的參量DEFAULT才能被調(diào)要,這樣設(shè)置IVTP寄存器可使.vector段按命令文件中定義定位。中斷向量可使用函數(shù)install_int_vector()來(lái)安裝,如下所示:
          #include intpt40.h>
          void c_int99(void)
          {
          for( ; ; );
          }
          void main(void)
          {
          set_ivtp(DEFAULT);
          install_int_vector((void *) c_int99,2);

          例3:鏈接時(shí)指定TMS320C4X或TMS320C5X的符號(hào)

          當(dāng)TMS320C5X的編輯器中沒(méi)有PRTS庫(kù)而不能設(shè)置向量表指針時(shí),還有一個(gè)方便的方法可以達(dá)到同樣的目的。那就是使用在鏈接時(shí)指定符號(hào)的方法。
          這種方法的主要思想是利用包含復(fù)位和中斷向量的匯編語(yǔ)言段(.sect)以及用鏈接器映射中斷向量在內(nèi)存中的分布。C程序可以獲得這個(gè)地址并把它裝載到中斷向量表指針(TMS320C4X的IVTP寄存器或者TMS320C5X的PMST寄存器)。

          本例為TMS320C5X芯片,中斷向量定位于匯編語(yǔ)言模塊中,標(biāo)號(hào)IVECS指向中斷向量表的基地址,下面說(shuō)明如何獲取中斷向量地址。
          .def IVECS
          .ref _c_int0, _c_int1, _c_int2
          .sect “reset”
          b _c_int0
          .sect “vectors”
          IVECS .space 2
          b _c_int1
          b _c_int2
          在鏈接器中,用鏈接器指定的標(biāo)號(hào)初始化鏈接器定義的變量。如下所示:
          –c
          vecs.obj
          –lrts50.lib
          _vecTable = IVECS
          MEMORY
          {
          PAGE 0: VECTORS: origin = 00000h, length = 0003fh
          ROM: origin = 00040h, length = 007CFh
          P_RAM: origin = 00800h, length = 023FFh
          . . .
          }
          SECTIONS
          {
          ”reset” > VECTORS
          ”vectors” > P_RAM
          .text: > ROM
          .cinit: > ROM
          .bss: > RAMB0_D
          .stack: > INT_RAM
          }
          在C程序中,將vecTable聲明為外部的無(wú)符號(hào)指針:
          extern unsigned int *vecTable;
          將它裝載到PMST寄存器中。
          unsigned int *pmst = (unsigned int *) 0x07;
          *pmst |= (unsigned int) vecTable;

          4、結(jié)束語(yǔ)

          隨著DSP芯片性能價(jià)格比的不斷提高,DSP芯片會(huì)在更多的領(lǐng)域內(nèi)得到更為廣泛的應(yīng)用。利用高級(jí)語(yǔ)言特別是C語(yǔ)言開(kāi)發(fā)的DSP應(yīng)用系統(tǒng)將會(huì)得到不斷推廣,從而可以提高DSP芯片的開(kāi)發(fā)速度。

          參考文獻(xiàn)
          1 張雄偉,曹鐵勇編著.DSP芯片的原理與開(kāi)發(fā)應(yīng)用(第2版).北京:電子工業(yè)出版社,2001
          2 Setting Up TMS320 DSP Interrupts. Texas Instruments Co. ,1995




          關(guān)鍵詞: C語(yǔ)言 中斷 中斷向量表 DSP

          評(píng)論


          相關(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); })();