ace指令为复位向量保留的位置在程序引导方式下不能使用,因为复位会启动程序引导功能。使用.space时vectors段链接到0xfa00,不使用.space指令该段链接到0xfa02。 但是,如果定时器和自陷中断向量被使用时,可用.space指令对向量表进行如下的定义: .sect “vectors” ;为复位和中断向量定义已命名的段 .space 2*4*16 ;保留的和3个未使用的向量 b _c_int4 ;TINT .space 2*2*16 ;2个未使用的向量 b _c_int7 ;TRAP 注意在中断和自陷向量表中未使用的部分可用来存储数据。但为了保证中断处理的正确,一定要确保中断和自陷向量不被破坏。 链接到存储器映象 已命名段产生后,TMS320链接器就会把向量表链接到存储器的合适位置,共分三步进行: 1. 链接汇编语言模块; 2. 根据中断向量表的定位定义链接器的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 . } 方法二:安装一个运行时的向量 这种方法在开发和调试时很有用的,这种方法是用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(“ LDPE R0, IVTP”); asm(“ POP R0”); 例2:利用TMS320C4X的PRTS 这个例子,利用TMS320C4X的并行运行支持库来设置中断向量表,起始地址为0x02ff800,利用PRTS库函数set_ivtp()设置IVTP寄存器的值使向量表定位于RAM0存储器的开始地址。当使用PRTS时,不需要用户命名中断向量段,而是在运行时使用PRTS函数install_int_vector()将向量定位在预先定义的段.vector中。这种方法要求向量在运行时安装,以防止程序和数据被修改。另外,首先要把PRTS库链接到程序,并在命令文件中预先定义.vector段,把.vector段定位在ROM0存储器的开始地址。命令文件如下所示: -l prts40.lib MEMORY { RAM0:org = 0x2ff800 , len = 0x400 } SECTIONS { “.vector”: {} > RAM0 } 主程序中必须包含头文件intpt40.h。函数set_ivtp()使用预定义的参量DEFAULT才能被调要,这样设置IVTP寄存器可使.vector段按命令文件中定义定位。中断向量可使用函数install_int_vector()来安装,如下所示: #include <intpt40.h> void c_int99(void) { for( ; ; ); } void main(void) { set_ivtp(DEFAULT); install_int_vector((void *) c_int99,2); 例3:链接时指定TMS320C4X或TMS320C5X的符号 当TMS320C5X的编辑器中没有PRTS库而不能设置向量表指针时,还有一个方便的方法可以达到同样的目的。那就是使用在链接时指定符号的方法。 这种方法的主要思想是利用包含复位和中断向量的汇编语言段(.sect)以及用链接器映射中断向量在内存中的分布。C程序可以获得这个地址并把它装载到中断向量表指针(TMS320C4X的IVTP寄存器或者TMS320C5X的PMST寄存器)。 本例为TMS320C5X芯片,中断向量定位于汇编语言模块中,标号IVECS指向中断向量表的基地址,下面说明如何获取中断向量地址。 .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 在链接器中,用链接器指定的标号初始化链接器定义的变量。如下所示: –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声明为外部的无符号指针: extern unsigned int *vecTable; 将它装载到PMST寄存器中。 unsigned int *pmst = (unsigned int *) 0x07; *pmst = (unsigned int) vecTable; 4、 结束语 随着DSP芯片性能价格比的不断提高,DSP芯片会在更多的领域内得到更为广泛的应用。利用高级语言特别是C语言开发的DSP应用系统将会得到不断推广,从而可以提高DSP芯片的开发速度。
参考文献
1 张雄伟,曹铁勇编著.DSP芯片的原理与开发应用(第2版).北京:电子工业出版社,2001 2 Setting Up TMS320 DSP Interrupts. Texas Instruments Co. ,1995 上一页 [1] [2]
Tags:
|