基于C语言设置TMS320 DSP中断向量表
作者:佚名; 更新时间:2014-12-05

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

关键词: C语言,中断,中断向量表,DSP。


Setting TMS320 DSP Interrupt Vectors Table in C
Abstract  Along with the development of DSP chip, the exploiture of DSP in C not only accelerate the evolution of DSP ,but also make the program easy to modify and transplant. This is a practice application that setting TMS320 DSP interrupt vectors table in C.

Key Words  C language, Interrupts, Interrupt vector table, 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      不包括微计算机/程序引导模式下的TMS320C26
TMS320C26      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”  ;为复位和中断向量定义已命名的段
.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指令为复位向量保留的位置在程序引导方式下不能使用,因为复位会启动程序引导功能。使用.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的并行运行

核心期刊快速发表
Copyright@2000-2030 论文期刊网 Corporation All Rights Reserved.
《中华人民共和国信息产业部》备案号:ICP备07016076号;《公安部》备案号:33010402003207
本网站专业、正规提供职称论文发表和写作指导服务,并收录了海量免费论文和数百个经国家新闻出版总署审批过的具有国内统一CN刊号与国际标准ISSN刊号的合作期刊,供诸位正确选择和阅读参考,免费论文版权归原作者所有,谨防侵权。联系邮箱:256081@163.com