一种TMS320 DSP中断向量表设置和实现

出处:互联网 发布于:2011-09-04 11:04:06

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

  1、引言

  数字信号处理(Digital Signal Processing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法,这些信号由数字序列表示。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛的应用。德州仪器、Freescale等半导体厂商在这一领域拥有很强的实力。

  DSP(digital signal processor)是一种独特的微处理器,是以数字信号来处理大量信息的器件。其工作原理是接收模拟信号,转换为0或1的数字信号。再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。它不仅具有可编程性,而且其实时运行速度可达每秒数以千万条复杂指令程序,远远超过通用微处理器,是数字化电子世界中日益重要的电脑芯片。它的强大数据处理能力和高运行速度,是值得称道的两大特色。   DSP微处理器(芯片)一般具有如下主要特点:

  (1)在一个指令周期内可完成乘法和加法;

  (2)程序和数据空间分开,可以同时访问指令和数据;

  (3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;

  (4)具有低开销或无开销循环及跳转的硬件支持;

  (5)快速的中断处理和硬件I/O支持;

  (6)具有在单周期内操作的多个硬件地址产生器;

  (7)可以并行执行多个操作;

  (8)支持流水线操作,使取指、译码和执行等操作可以重叠执行。

  当然,与通用微处理器相比,DSP微处理器(芯片)的其他通用功能相对较弱些。

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

  2、中断向量表的定位

  中断服务程序的地址(中断向量)要装载到存储器的合适区域。一般这些向量都定位在0x0开始的程序存储器中。但有些处理器要求或者可以在其他的存储区域安装中断向量。

  对于微处理器模式下的TMS320C25、TMS320C26、TMS320C28、TMS320C30、TMS320C31,中断向量定位于0x0开始的地址。对于微计算机/程序引导模式下的TMS320C31的中断向量定位于0x809fc1,TMS320C26的中断向量定位于0xffa0。中断向量表的定位是与PMST寄存器的IPTR位有关,有效的中断向量表的基地址是0x0,0x800,0x1000,0x1800,0x2000,…0xf800。

  TMS320C4X的复位向量定位在四个地址之一,这四个地址由外部引脚RESETLOC0和RESETLOC1决定。TMS320C4X的中断向量可存在于任何512字范围的存储器中,中断向量表的地址由中断向量表指针(IVTP)寄存器决定。自陷向量表的地址由自陷向量表指针(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保留的字。例如,微计算机/程序引导模式下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指令对向量表进行如下的定义:

  .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语言是一种计算机程序设计语言。它既具有语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,不仅仅是在软件开发上,而且各类科研都需要用到C语言,具体应用比如单片机以及嵌入式系统开发。

  C是结构式语言。结构式语言的显着特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。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芯片的开发速度。
 



  
关键词:DSP

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!