基于C语言设置TMS320 DSP中断向量表_第1页
基于C语言设置TMS320 DSP中断向量表_第2页
基于C语言设置TMS320 DSP中断向量表_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于C语言设置TMS320DSP中断向量表

摘要:随着DSP芯片应用的不断深入,用C语言开发DSP芯片,不仅可以使DSP芯片的开发速度大大提高,也使得程序的修改和移植变得十分方便。C语言设置TMS320系列DSP中断向量表是高级语言开发DSP的一个具体应用。关键词:C语言,中断,中断向量表,DSP。SettingTMS320DSPInterruptVectorsTableinCAbstractAlongwiththedevelopmentofDSPchip,theexploitureofDSPinCnotonlyacceleratetheevolutionofDSP,butalsomaketheprogrameasytomodifyandtransplant.ThisisapracticeapplicationthatsettingTMS320DSPinterruptvectorstableinC.KeyWordsClanguage,Interrupts,Interruptvectortable,DSP.1、

引言DSP(数字信号处理器)自二十世纪70年代末80年代初诞生以来,得到了突飞猛进的发展,在信号处理、通讯、雷达等方面应用越来越广泛,而且开发手段和开发设备也越来越多样化。其中C语言在DSP开发应用中起着越来越重要的作用,以C语言编写的DSP应用程序具有可读性、可移植性,易于维护和修改。另外在DSP应用系统中,中断是完成数据传递、实时处理等的重要手段,因而用C语言完成对DSP中断设置是DSP开发的重要内容。

DSP中断的设置主要包括中断服务程序的编写,中断向量表的设置,中断寄存器的初始化等内容。本文以TI公司TMS320系列DSP为例,说明用C语言设置中断向量表的方法。并给出实例进行说明。2、

中断向量表的定位中断服务程序的地址(中断向量)要装载到存储器的合适区域。一般这些向量都定位在0x0开始的程序存储器中。但有些处理器要求或者可以在其他的存储区域安装中断向量。对于微处理器模式下的TMS320C25、TMS320C26、TMS320C28、TMS320C30、TMS320C31,中断向量定位于0x0开始的地址。对于微计算机/程序引导模式下的TMS320C31的中断向量定位于0x809fc1,TMS320C26的中断向量定位于0xffa0。TMS320C5X复位向量定位在0x0,其他中断向量可以定位于任何2K字的程序存储器中,中断向量表的定位是与PMST寄存器的IPTR位有关,有效的中断向量表的基地址是0x0,0x800,0x1000,0x1800,0x2000,…0xf800。TMS320C4X的复位向量定位在四个地址之一,这四个地址由外部引脚RESETLOC0和RESETLOC1决定。TMS320C4X的中断向量可存在于任何512字范围的存储器中,中断向量表的地址由中断向量表指针(IVTP)寄存器决定。另外,TMS320C4X的自陷(trap)中断向量可存放在512字范围的存储器中,自陷向量表的地址由自陷向量表指针(TVTP)寄存器决定。有效的中断或者自陷向量表的基地址是0x0,0x200,0x400,0x800,0xa00,0xc00,0xe00,0x1000,0x1200…0xfffffe00,如表1所示。有两种方法可以初始化中断向量表,下面讲解这两种方法:方法一:利用已命名的ASM段生成向量表的最直接方法就是用汇编指令.sect来生成一个表。这个表包含中断向量的地址和跳转指令。表1处理器

向量表基地址

说明TMS320C2X

0x0

不包括微计算机/程序引导模式下的TMS320C26TMS320C26

0xffa0

微计算机/程序引导模式TMS320C30

0x0

TMS320C31

0x0

微处理器模式TMS320C31

0x809fc1

微计算机/程序引导模式TMS320C4X

复位

0x0,0x7fffffff,0x80000000,0xfffffff

外部引脚RESETLOC0和RESETLOC1决定

中断向量

任意512字范围

IVTP寄存器决定

自陷向量

任意512字范围

TVTP寄存器决定TMS320C5X

复位

0x0

中断向量

任意2K字数据页

PMST寄存器的IPTR位决定在微计算机/程序引导模式下TMS320C2X、TMS320C5X和TMS320C31从中断向量的位置处执行代码,因而要用跳转指令来代替中断向量,如TMS320C31用24位指令BR来实现:INT1:BR_c_int01在微处理器模式下TMS320C30、TMS320C31和TMS320C4X,中断向量是下一条存取指令的地址,因而中断服务程序的地址用汇编指令.word存储在中断向量处。例如,TMS320C4X中断1可用汇编语言定义如下:INT1:.word_c_int01

因为中断服务的标识符在汇编语言模块外部被声明,所以标识符必须用.ref或.global来声明。下面的例子是一个汇编语言模块(vecs.asm)定义了一个包含TMS320C5X跳转指令的段。.ref

_c_int0,_c_int1

;在外部定义中断向量.sect“vectors”

;声明一个一命名的段RS:b_c_int0;转至复位向量

I1:b_c_int1;转至中断向量1

处理保留和未使用的区域有时中断向量表中包含保留的地址,例如微计算机/程序引导模式下的TMS320C26或者TMS320C4X和TMS320C5X的复位和中断向量不连续的情形。TMS320C31也会发生这种情形,系统中并不是所有的中断都能被用到。为了处理向量映象中的保留地址,就要使用汇编指令.space。注意对于定点设备.space保留的是位,对于浮点设备.space保留的字。例如,微计算机/程序引导模式下TMS320C26,假设所有中断都是可用的.sect“vectors”;为复位和中断向量定义已命名的段.space2*16;保留的空间b

_c_int1

;INT0b

_c_int2

;INT1b

_c_int3

;INT2b

_c_int4

;TINTb

_c_int5

;RINTb

_c_int6

;XINTb

_c_int7

;TRAP注意.space指令为复位向量保留的位置在程序引导方式下不能使用,因为复位会启动程序引导功能。使用.space时vectors段链接到0xfa00,不使用.space指令该段链接到0xfa02。但是,如果定时器和自陷中断向量被使用时,可用.space指令对向量表进行如下的定义:.sect“vectors”

;为复位和中断向量定义已命名的段.space2*4*16

;保留的和3个未使用的向量b

_c_int4;TINT.space2*2*16

;2个未使用的向量b

_c_int7;TRAP注意在中断和自陷向量表中未使用的部分可用来存储数据。但为了保证中断处理的正确,一定要确保中断和自陷向量不被破坏。

链接到存储器映象已命名段产生后,TMS320链接器就会把向量表链接到存储器的合适位置,共分三步进行:1.

链接汇编语言模块;2.

根据中断向量表的定位定义链接器的MEMORY段;3.

在链接器的SECTIONS命令中,定位这些已命名的段。下面是TMS320C5X的命令文件,将vectors定位到040h。-cvecs.objmain.obj-lrts50.libMENORY{PAGE0:VECTORS:origin=0000h,length=003fhROM:origin=0040h,length=007cfh}SECTIONS{“vectors”:{}>VECTORS.text

:{}>ROM.}方法二:安装一个运行时的向量这种方法在开发和调试时很有用的,这种方法是用C语句在装载中断服务程序地址时建立一个运行时的向量。该方法适用于微处理器模式下的TMS320C30和TMS320C31,以及TMS320C4X,因为它们只用地址,而不用跳转指令作为中断向量。其重点就是将中断服务程序的地址放到合适的存储器空间,例如,TMS320C30地址0x1对应于外部中断0(INT0),在该地址安装中断服务程序c_int01。使用如下语句“*((void(**)())0x1)=c_int01;这里,0x1被转换成指向函数的指针,因为它包含函数c_int01的地址。3、

向量表指针TMS320C4X和TMS320C5X都可以不将中断向量表放在0x0开始的位置。这两个系列的DSP都是由寄存器来确定中断向量的位置。TMS320C4X的复位向量地址是由处理器的引脚确定的四个地址中的一个。中断能够被正确的处理,首先必须在接收到中断之前对中断向量表进行初始化。下面几个例子是用来说明初始化与中断有关的寄存器的方法。例1:在C中嵌入汇编语句这个例子,利用在C语言中嵌入汇编语句来设置TMS320C4X的中断向量,其起始地址为0x0,方法是通过将IVTP寄存器的值设置为0x0。asm(“

PUSH

R0”);asm(“

LDI

0h,R0”);asm(“

LDPER0,IVTP”);asm(“

POP

R0”);例2:利用TMS320C4X的PRTS这个例子,利用TMS320C4X的并行运行支持库来设置中断向量表,起始地址为0x02ff800,利用PRTS库函数set_ivtp()设置IVTP寄存器的值使向量表定位于RAM0存储器的开始地址。当使用PRTS时,不需要用户命名中断向量段,而是在运行时使用PRTS函数install_int_vector()将向量定位在预先定义的段.vector中。这种方法要求向量在运行时安装,以防止程序和数据被修改。另外,首先要把PRTS库链接到程序,并在命令文件中预先定义.vector段,把.vector段定位在ROM0存储器的开始地址。命令文件如下所示:-lprts40.libMEMORY{RAM0:org=0x2ff800,len=0x400}SECTIONS{“.vector”:{}>RAM0}主程序中必须包含头文件intpt40.h。函数set_ivtp()使用预定义的参量DEFAULT才能被调要,这样设置IVTP寄存器可使.vector段按命令文件中定义定位。中断向量可使用函数install_int_vector()来安装,如下所示:#include<intpt40.h>voidc_int99(void){for(;;);}voidmain(void){

set_ivtp(DEFAULT);install_int_vector((void*)c_int99,2);例3:链接时指定TMS320C4X或TMS320C5X的符号当TMS320C5X的编辑器中没有PRTS库而不能设置向量表指针时,还有一个方便的方法可以达到同样的目的。那就是使用在链接时指定符号的方法。这种方法的主要思想是利用包含复位和中断向量的汇编语言段(.sect)以及用链接器映射中断向量在内存中的分布。C程序可以获得这个地址并把它装载到中断向量表指针(TMS320C4X的IVTP寄存器或者TMS320C5X的PMST寄存器)。本例为TMS320C5X芯片,中断向量定位于汇编语言模块中,标号IVECS指向中断向量表的基地址,下面说明如何获取中断向量地址。.defIVECS.ref_c_int0,_c_int1,_c_int2.sect“reset”b

_c_int0.sect“vectors”IVECS.space2b

_c_int1b

_c_int2在链接器中,用链接器指定的标号初始化链接器定义的变量。如下所示:–cvecs.obj–lrts50.lib_vecTable=IVECSMEMORY{PAGE0:VECTORS:origin=00000h,length=0003fhROM:origin=00040h,length=007CFhP_RAM:origin=00800h,length=023FFh...}SECTIONS{”reset”>VECTORS”vectors”>P_RAM.text:>ROM.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论