中断在TMS320C54x系列DSP中的应用

发布者:kappa20最新更新时间:2006-05-15 来源: 电子技术应用关键字:中断  屏蔽  触发  复位 手机看文章 扫描二维码
随时随地手机看文章

  中断是嵌入式芯片的灵魂,这是因为多数嵌入式系统对实时性都有很高的要求,即对出现事件的响应要极为迅速。中断与软件查询方式相比有着更高的执行效率。在TI公司的TMS320C54x系列(以下简称C54x系列)DSP中,同样也提供了很好的中断机制。

       1 C54x中的中断机制

  中断信号实质上是由硬件或者是软件驱动的信号,它能使DSP暂停正在执行的程序并进入中断服务程序(ISR)。在最典型的DSP系统中,如果A/D转换器需要送数据到DSP中,或者D/A转换器需要从DSP中取走数据,都是通过硬件中断向DSP发出请求的。

  C54x系列DSP支持软件中断和硬件中断。软件中断是由指令(INTR、TRAP、RESET)触发的,硬件中断是由外围器件触发的。硬件中断实际上又分为两类:一类是由DSP的片外外设(如A/D转换器)触发的,另外一类是由DSP的片内外设(如定时器中断)触发的。硬件中断又有优先级的区分,这是为了处理同一时刻有多个硬件中断源触发中断的情况。硬件中断的种类和优先级请参看具体使用的芯片资料。

  如果按照可屏蔽情况分类,中断又可分为可屏蔽中断(C54x至多支持16个)和不可屏蔽中断。可屏蔽中断受ST1寄存器中的INTM位和IMR寄存器中相应位的影响。当INTM=0时,IMR中某位为1,则开放相应的中断。其实,在C54x中硬件中断并不一定要由外围器件触发,它同样可以由指令INTR、TRAP触发,并且不受INTM的限制。有一点需要引起注意的是:指令RESET复位和硬件RS复位对IPTR和外围电路初始化是不相同的。硬件复位时IPTR总是被置为0x1FF,软件复位时则不会修改当前IPTR的值。C54x的中断处理过程分为三个阶段:

  ①中断请求。可以用硬件器件或者软件指令请求中断。如果请求的中断是可屏蔽中断,则IFR寄存器中相应的位被置为1,而不管中断是否会被响应。

  ②中断响应。对于软件中断和不可屏蔽中断,CPU是立即响应的。对于可屏蔽中断,要满足下列条件才能响应:

  ·优先级最高(同时出现多个中断时)

  ·INTM位为0

  ·IMR中相应位为1

  CPU在取到软件向量的第一个字后会产生IACK信号,对可屏蔽中断而言,IACK会清除IFR中相应位。

  ③中断处理。保护特定的寄存器,执行中断服务程序,完成后恢复寄存器。保护寄存器的原则是执行中断服务程序后能正确返回并恢复原来运行程序的环境。

  DSP中提供的中断是以中断向量表(VECT)的形式出现的(见表1)。中断向量表的长度为128个字节,每个中断分配为4个字节,一共有32个中断,具体的中断要看相应的芯片。C54x中断向量表的地址是由PMST寄存器中的IPTR构成高9位地址形成的,所以向量表的地址必须是128的倍数。硬件复位时,IPTR总是默认置为0x1FF,所以中断向量表地址为0xFF80。每个中断向量的地址按如下构成方法形成:PC=(IPTR)<<7+(Vector[n])<<2 (Vector[n]为中断向量号,在0~31之间),中断向量号左移两位是因为每个中断向量占用4个字节的缘故。中断向量表总是以汇编的形式出现的。

       

       2 扩展地址模式下的中断控制

  早期的DSP共有192K的空间(程序、数据和I/O空间各为64K),随着DSP处理能力越来越强,192K的空间已经不能满足需要。后来的C54x均提供了扩展地址模式,使程序空间扩展到8M。扩展模式下的中断控制有自己特殊的地方,有必要进行说明。

  扩展模式下程序空间的寻址是通过寄存器PC和XPC一同进行的。PC构成低16位地址位,XPC构成高7位地址位。所以保存和恢复XPC是用户必须注意的。如果用户使用的是Far Call指令,则XPC会自动保存和恢复。但在进行中断处理的时候,只有16位的PC寄存器能够自动得到保存(这是由于考虑了非扩展模式下中断的效率问题),所以XPC必须由用户自己来保存,否则在中断返回的时候往往会跳到不同的页面(由返回前后XPC值的不同引起)造成不可预测的后果。程序如表1所示。

  由于必须在长跳转之前保存XPC的值,没法使用延迟指令(如FBD),所以中断时延会增加两个周期。

  再来考虑另外一种情况:设程序运行在XPC=2的页面上,如果这个时候有中断发生并得到了CPU的响应,DSP会加载PC:PC=(IPTR)<<7+(Vector[n])<<2,XPC的值不发生变化,于是中断向量的地址为:0x20000+0xPC。这就明显地说明:中断向量表必须和应用程序在同一64K的程序空间页面内。如果应用程序不是只分布在一个程序空间页面内,那应该如何处理呢?可分三种类型共四种技巧来应对这样的情况:(1.1)描述的是OVLY为任意的情况;(2.1)~(2.2)描述的是OVLY=1的情况;(3.1)描述的是OVLY=0的情况。

  (1.1)有的应用中,一些程序一旦运行是不允许中断的。把不允许中断的程序部分放到扩展空间内,而把中断向量表和ISR以及允许中断的程序部分都放在XPC=0的页面。当调用扩展空间的程序时关闭中断使能,而当扩展空间程序返回到XPC=0的页面时再开中断。这样做的好处是不用关注XPC的值对中断向量寻址的影响。中断的时候也不需要保存XPC的值。调用过程如图1所示,Y表示需要关注XPC的值,N表示不需要关注XPC的值,数字表示调用顺序。

       


(2.1) DSP中影响存储器映射的因素有三个:OVLY、DROM和MP/MC。OVLY是Overlay的简写。当OVLY=1时,数据空间里的一部分RAM变为重叠区域(Overlay Memory)。这部分重叠区域同时映射在每一页程序空间的上部。具体示例如图2所示(MP/MC=0,C5416)。

        

  可见OVLY=1的时候,数据空间的DARAM0~3被映射到程序空间的每一页上。基于这样的特点,可以把中断向量表" style="text-decoration:underline;color:blue">中断向量表定位到数据空间的重叠区域DARAM0~3中,置OVLY为1。当有中断发生时,不管程序运行于DSP的哪个程序页面空间,只用PC寻址都能够正确地取到中断向量表,而不会受XPC的影响。中断程序ISR可以放到任何一个程序页面中,但这时跳转到ISR的指令只能用长跳转指令(FB等),跳转之前注意将XPC压入堆栈,程序同表1。示意图如图3所示。

         

  (2.2) 如果片内RAM比较大,分给数据空间的RAM也比较多(如C5416有64K的RAM可以作为数据空间),数据空间可能会有余量。这时可以把中断向量表和ISR都全部放进数据空间的Overlay Memory区域,并把OVLY置1。这样不仅在任何程序页面空间都能够正确地取到中断向量表,同时用短跳转指令(BD等)就可以实现跳转到ISR,不再需要对XPC进行保存和还原。程序请参看表2。

         

  (3.1) 在扩展模式下,虽然程序空间扩为8M,但如果OVLY=1,则程序空间中存在大量的重叠区域,如C5416在OVLY=1的情况下真正可用的程序空间最大为4.03M。有的场合需要的程序空间大于4.03M,就必须使用OVLY=0的情况。这个时候程序空间不存在重叠区域,但可以模拟出来。方法是:把中断向量表拷贝到会发生中断的每一页程序空间,如图4所示。这样,中断的时候就能正确找到中断向量表而实现中断跳转。

  比较上面的四种方法,方法(2.1)更为适应普遍的情况。它不限制ISR的地址范围,而中断向量表只占0x80的空间,把它放到数据空间的重叠区域是很容易做到的。笔者正在做的项目正是采用了这种方法。

          

       3 DSP/BIOS下中断的管理

  DSP/BIOS是TI近来推出的准实时操作系统,它同样支持扩展地址模式,只是需要将Global Settings中的函数调用模式设置为Far就可以了。需要强调的是:BIOS只支持OVLY=1的扩展模式,而不支持OVLY=0的扩展模式。扩展模式下在BIOS Code中会多出一个段“.bios:.norptb”,这个段会被自动放入Overlay Memory之中,具体原因请参看参考文献[4]。BIOS管理的线程有四种类型:HWI、SWI、TSK以及IDL。上面所提到的所有中断属于优先级最高的HWI线程。每个中断向量都是以HWI模块的Object形式存在,可以用BIOS下的Configuration Tool来配置每个中断向量所触发的函数。在Configuration Tool中,会发现System的MEM模块下有一个名为VECT的Object,它实质上是用来给中断向量表分配存储空间的,用户可以自己配置中断向量表的地址(必须是128的倍数)。地址的分配方法可以参考上面提到的几种应对技巧。下面就BIOS下的中断做出几点说明:

  ·在Object的属性框中填写中断函数名时,如果中断函数是由C语言编写的,则需要在函数名前加下划线(C语言和汇编语言相互调用的需要)。汇编语言则不需要。

  ·在编写中断函数的时候不能再用关键字interrupt来说明中断函数,因为BIOS已经自动包括了这个功能。如果再用interrupt,则会造成致命后果。

  ·如果中断函数是用汇编语言编写的,中断函数应夹在BIOS的API HWI_enter和HWI_exit之间。这样,在中断处理的时候会正确保存和恢复一些需要使用的寄存器,并妥善处理线程间的关系以及中断函数中对BIOS API的调用;如果中断函数是用C语言编写的,则必须使用HWI Dispatcher属性,作用和前面是一样的。如果想了解更多东西可以参看参考文献[5]。

  ·在BIOS中的SWI(软件中断)模块下,用户可以自己添加软件中断对象。但是必须从概念上分清楚,这里添加的软件中断和在前面提到的软件中断(即由INTR、TRAP、RESET触发的中断)是完全不同的概念。这里的软件中断并不属于中断向量表里的中断向量(显然中断的个数也不会存在限制),并且它可以带两个参数(前面的中断函数是不能带参数的)。所以从几个方面看这里的软件中断函数更象是通常意义上的一般函数。

  在刚开始使用DSP/BIOS的时候可能会觉得比较麻烦,需要理解的东西也很多。但当你熟悉了以后会发现,它能帮你节省不少时间去处理底层的东西,而使你将更多的精力放在算法的实现上。

  本文全面介绍了C54x系列DSP的中断机制,以及中断在使用过程中的一些技巧,阐述了整个中断的响应过程和一些比较容易出错的地方。希望通过共享使大家更快更好地掌握C54x的中断处理。

       参考文献

1 TMS320C54x DSP Reference Set Volume 1: CPU and Peripherals. Texas Instruments,2001.3


2 Interrupt Handing Using Extended Addressing of the TMS320C54x Family. Texas Instruments,1999.7

3 TMS320 DSP/BIOS User’s Guide. Texas Instruments,2002.11

4 DSP/BIOS and TMS320C54x Extended Addressing. Texas Instruments, 2000.11

5 TMS320C5000 DSP/BIOS Application Programming Inter-face Reference Guide. Texas Instruments,2002.10



  
关键字:中断  屏蔽  触发  复位 引用地址:中断在TMS320C54x系列DSP中的应用

上一篇:基于FPGA的IJF数字基带编码的实现
下一篇:数字信号处理技术在电力网无功补偿中的应用

推荐阅读最新更新时间:2024-05-02 20:24

STM32基础设计(3)---中断串口通信
本文介绍,通过中断方式运用STM32串口USART1。 首先,总结全文,设计步骤主要如下: 1,初始化GPIO 2,初始化USART1 3,初始化NVIC(嵌套向量中断控制器) 4,编写中断服务函数 5,编写主函数 详细步骤如下: 1,初始化GPIO void IO_Init() { GPIO_InitTypeDef Uart_A; GPIO_InitTypeDef led; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC| RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRema
[单片机]
关于AT89C51系统时钟中断的应用
功能强大的时钟中断 在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。 下面以6MHz时钟的AT89C51系统为例,说明时钟中断的应用。 定时器初值与中断周期时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的标志位
[单片机]
8051单片机的中断发送
最近使用c8051做开发,串口程序移入工程时,整个程序竟然不跑了,加断点,调试,发现在串口查询发送出了问题,程序在查询发送完毕的时候,竟然死在这,就是while(TI0==0)这地方,用其它型号单片机没有这种情况,c8051F120单片机强大无比,但也复杂,用起来不顺手,下面就搜集了有关串口中断发送的资料,改为中断发送解决程序死的问题。 有关串口发送的程序例子: 假设要发送一组数据 Send 一般采用查询发送(循环发送)方式: unsigned char Send ; //发送量 unsigned char i; //循环量 for(i = 0; i 10; i++
[单片机]
51单片机扩展中断的四种方法
MCS—51系列单片机内部只有两个外部中断源输入端,当外部中断源多于两个时 ,就必须进行扩展,下面介绍两种简单的扩展方法: 一、采用硬件请求和软件查询的方法: 这种方法是:把各个中断源通过硬件“或非(高有效,如CD4002)”(与,低有效)门引入到单片机外部中断源输入 端(INT0或INT1),同时再把外部中断源送到单片机的某个输入输出端口,这 样当外部中断时,通过“或非”(与)门引起单片机中断,在中断服务程序中再通 过软件查询,进而转相应的中断服务程序。显然,这种方法的中断优先级取决于 软件查询的次序。其硬件连接和软件编程如下: Void zhongduan (void) interrupt 0 using 3
[单片机]
51单片机扩展<font color='red'>中断</font>的四种方法
MSP430中断服务函数的定义
//为了保证代码可以在IAR编译器的任何版本中都能正确得到编译,所以作以下的条件编译。 #ifdef __IAR_SYSTEMS_ICC__ //如果编译器是IAR, 那么以下将被编译。 #if __VER__ = 200 #pragma vector=USART0RX_VECTOR //在IAR2.0以上中断函数声明。 __interrupt void SPI0_rx (void) #else //在IAR2.0以下中断函数声明。 interrupt void SPI0_rx (void) #endif //IAR中断函数声明结束。 { } 在上述中 USART0RX_VECTOR是定义
[单片机]
51单片机扩展中断的简便方法
MCS—51系列单片机内部只有两个外部中断源输入端,当外部中断源多于两个时,就必须进行扩展,下面介绍两种简单的扩展方法: 一、采用硬件请求和软件查询的方法: 这种方法是:把各个中断源通过硬件“或非”门引入到单片机外部中断源输入端(INT0或INT1),同时再把外部中断源送到单片机的某个输入输出端口,这样当外部中断时,通过“或非”门引起单片机中断,在中断服务程序中再通过软件查询,进而转相应的中断服务程序。显然,这种方法的中断优先级取决于软件查询的次序。其硬件连接和软件编程如下: Voidzhongduan(void)interrupt0using3//中断函数 { EX0=0;//关中断 If(P0_0=1)
[单片机]
一种430软复位方法
最近在搞430的FLASH的自定义法(利用串口)程序烧写,烧写完成后断电复位,reset按键就可以运行新的程序。但是和学长交流了一下,这种方法不够好,希望有一种软复位的方式。于是百度了一下,都是些对看门狗进行写入特殊值使得430的cpu复位。反正个人是没有采用。 因为在搞程序的烧写下载,所以看了一下430的BSL。看到里面有一段话,关于从C代码中启动BSL的方法。如下: 3.7.1 从一个外部应用中启动BSL 将程序计数器设定到内存为位置0x1000 来启动BSL。堆栈一直被复位,而RAM 被清空。应该注意的是,GIE 位未被禁用,所以如果不需要中断的话,这一步应该通过调用应用来完成,并且如果它们被使用的话,这一步应该从“
[单片机]
Vishay推出超小型商用版汽车级IHLE®集成式电场屏蔽电感器
器件降低成本,节省电路板空间,1 cm距离处电场可减小-20 dB 宾夕法尼亚、MALVERN — 2022年3月2日 — 日前,Vishay Intertechnology, Inc.宣布,推出新型商用版汽车级5 mm x 5 mm x 3.4 mm 2020外形尺寸器件---IHLE-2020CD-51和IHLE-2020CD-5A,扩充IHLE系列超薄、大电流电感器,其集成式电场屏蔽可减小EMI。Vishay Dale IHLE-2020CD-51和IHLE-2020CD-5A 外型尺寸在市场上同类器件中处于先进水平,不需要单独板级法拉第(Faraday)屏蔽,从而降低成本,节省电路板空间。 该电感器 采用铜
[电源管理]
Vishay推出超小型商用版汽车级IHLE®集成式电场<font color='red'>屏蔽</font>电感器
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved