首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于C语言设置TMS320 DSP中断向量表(2)

基于C语言设置TMS320 DSP中断向量表(2)

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
{
RAM0rg = 0x2ff800 ,  len = 0x400
}
SECTIONS
{
  “.vector”:  {} > RAM0
}
      主程序中必须包含头文件intpt40.h。函数set_ivtp()使用预定义的参量DEFAULT才能被调要,这样设置IVTP寄存器可使.vector段按命令文件中定义定位。中断向量可使用函数install_int_vector()来安装,如下所示:
#include
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;
继承事业,薪火相传
返回列表