关键词:TMS320F240 实时多中断任务 ISR GISR SISR
引言
TMS320F240内部集成了完善的外围设备,包括2个10位的A/D转换器和1个串口通信接口模块(SCI),以及其独有的、可提供3个16位的定时器,3个单比较单元和3个全比较单元的事件管理器(event manager)单元。F240芯片采用多个中断源共享DSP内核同一中断级的中断结构,与常用的数学控制芯片相比,它提供了更多的中断源,可以满足对复杂控制对象的实时多中断任务处理要求,使得用户能更加方便、灵活地编写中断处理程序。
1 TMS320F240中断系统的特点及中断响应过程
1.1 TMS320F240的中断系统的特点
TMS320F240芯片中断系统的基本特点是:通过赋予每个中断源以不同的优先级,使多个中断源可以共享DSP内核中同一中断级,从而提供更多的中断源和更灵活的中断处理方法。具体而言,在F240器件中,所有的中断请求都是送至DSP内核进行处理的。对可屏蔽中断,DSP内核只提供了6个可屏蔽的中断级(INT1~INT6)。而F240的可屏蔽中断源大大超过了6个(例如:仅F240器件的3个通用定时器就有12个可屏蔽中断源,用户可使用的中断源则多达36个)。所以,在F240中,这6个中断级中的每一个都会被多个中断源共享,即F240在实现多中断任务时,基本上都会出现多中断源共享DSP内核同一中断的情况。当多于一个的硬件中断被触发挂起时,F240将根据优先级别的高低顺序执行相应的中断服务子程序。F240器件可以识别下列4种类型的中断源:
①复位中断;
②由6个外部引脚(XINT1、XINT2、XINT3、PDPINT、RS以及NMI引脚)产生的外部中断;
③由片内外设模块,包括事件管理模块(EV)、A/D转换模块(ADC)、串行通信模块(SCI)等产生的外设中断;
④由INTR指令、NMI指令或TRAP指令等引起的软件中断等。
其中,除了软件中断、两个外部硬件中断RS和NMI是不可屏蔽中断之外,其余的都是可屏蔽中断。相对于可屏蔽中断而言,不可屏蔽中断涉及的寄存器较少,处理方法较为简便。文中主要对可屏蔽中断的多中断任务处理进行详细分析。
1.2 TMS320F240多级中断寄存器的结构
在TMS320F240的程序空间中,中断向量占据了0000h~0003fh的地址空间。中断向量地址被分为两个地址单元,从而双字的转移指令可存放在这些单元中。为了处理多中断源共享DSP内核同一中断级的问题,DSP内部提供了多级中断控制寄存器以满足需要。
(1)CPU总中断级寄存器
①中断屏蔽寄存器(IMR)。它包含用于使能或禁止每一中断级(INT1~INT6)的屏蔽位,地址为0004h,各位情况如图1所示。它用来屏蔽外部和内部硬件中断(NMI和RS除外)。当要屏蔽某硬件中断时,就把相应位清0;当要开放某硬件中断时,就把相应位置1,并且它的每一位不受硬件复位的影响。在图1中,0表示一般情况下读的数为0,R表示读,W表示写,-0表示复位后这位为0。
②中断标志寄存器(IFR)。它包含用以指示INT1~INT6中断级中,已经发送至CPU的可屏蔽中断请求的标志位,地址为0006h,各位情况如图2所示。当有一个可屏蔽中断到达CPU时,IFR的相应标志位就置1,表明相应中断(INT1~INT6)正在被挂起或正在等待响应。将1写入到相应的标志位,可清除相应位,并清除其中断请求。在图2中,0表示一般情况下读的数为0,R表示读,W1C表示写1时把这位清为0,-0表示复位后这位为0。
(2)外设备中断源分级控制寄存器
由外设产生的每一个特定中断源,DSP都提供两个相应的分级控制寄存器,包括一个子标志位中断控制寄存器和一个子屏蔽位中断控制寄存器。
对于由事件管理器产生的中断事件,每个中断源都有相应的中断控制寄存器,如图3所示。
①三组事件中断子屏蔽寄存器(EVIMRA/EVIMRB/EVIMRC),用以屏蔽对应的事件管理器中断。EVIMRi(i=A,B,C)各位的意义基本与IMR一致。
②三组事件中断子标志寄存器(EVIFRA/EVIFRB/EVIFRC),用以指示对应的事件管理器中断。EVIFRi(i=A,B,C)各位的意义基本与IFR一致。
对于系统模块中断,其各个中断事件的中断屏蔽位和中断标志位由各个专用的分级模块寄存器提供。如SCI中断,其扫收中断RXINT的屏蔽与使能由SCI模块内的控制寄存器SCICLT2的中断位RX/BKEN设置。当接收中断产生后,SCI的接收状态寄存器SCIRXST的RXRDY位置1,以表示接收中断产生。
图4 可屏蔽中断的多中断任务响应处理示意图
另外,值得注意的是,DSP内核的ST0状态寄存器中还有一个中断总屏蔽位-INTM。INTM为0时,开中断,允许没有被屏蔽的中断使能;INTM为1时,则禁止所有可屏蔽中断。
1.3 TMS320F240的中断响应过程
(1)TMS320F240中断响应过程
当有中断事件发生时,F240器件分三个阶段进行中断处理。
①接收中断请求。由软件中断(来自程序代码)或硬件中断(来自引脚或片内外设)提出中断请求,将主程序挂起。
②响应中断。如果中断是可屏蔽的,当这些可屏蔽中断的应用条件满足时,F240器件响应中断;对于不可屏蔽的硬件中断和软件中断,F240器件将立即作出响应。
③执行中断服务子程序。一时中断被响应,F240器件便转移到其相应的中断子程序ISR(Interrupt Service Routine)。F240按用户放置在预定地址(向量存储单元)处的转移指令,执行用户写好的中断服务程序。
在完成对多中断任务的实时处理时,对不同级别的中断源响应,直接进入相应的ISR进行处理即可。对共享DSP内核中同一中断优先级的多中断源,DSP则利用内部的多级中断控制寄存器,对每一个中断源发出的中断请求都用多个中断标志进行标识。图4是一个多中断源共享INT3级中断的多中断任务请求响应处理过程示意图。当接收到一个中断信号(TPINT2/TOFINT3)时,相应的中断源子标志寄存器(EVIFRB)中的标志位被置位,用以指示中断已被请求。如果中断源子屏蔽寄存器(EVIMRB)中的屏蔽位也被设置为开中断,则该信号被送至仲裁逻辑器,仲裁逻辑可能同时从一个或多个中断控制寄存器接收到类似的多中断任务信号。仲裁逻辑通过比较这些竞争中断请求的优先级,将具有最高优先级的中断送至CPU。CPU的总中断级标志寄存器IFR中与所接收的中断优先级相对应的中断标志位将被置位,指示中断被挂起。如果总中断级屏蔽寄存器IMR中相应的屏蔽位为1,并且DSP中断总屏蔽位INTM为0,则CPU响应该中断并执行相应的中断服务子程序。
(2)中断向量偏移地址
为了更好地处理多中断源复用的问题,DSP采用了向量偏移地址的方法。因为采用中断标志分辨的方法需要进行多次条件判断才能把涉及到的具体中断源分辨出来;而采用中断向量偏移地址的方法,只需两条指令即可完成分辨任务,减少了程序存储器的存储开销,节约了CPU的时钟开销。
DSP控制器为事件管理模块的每一个中断都分配了一个不同的中断向量偏移地址。当某个事件管理模块发出了请求信号,分自动地将该中断的向量偏地址写入到对应的事件管理中断向量寄存器(EVIVRA/EVIVRB/EVIVRC)中。而对于由系统外设模块产生的中断,DSP控制器将分配的中断向量偏移地址写入到系统中断向量寄存器(SYSIVR)中。用户可以通过读取该寄存器来取得外设中断的中断向量偏移地址。所以在编程开发时,先要编好一个中断向量表,对于没有用到的中断也应该编上,并让它返回到一个空位置,以免发生意外情况。这里,给出事件管理器B组的INT3级中断向量寄存器的结构示意图,如表1所列。关于每一个中断级的中断向量寄存器(IVR)单元和每一中断事件的偏移量的详细信息,见F240的数据手册。
表1 TMS320F240 INT3级中断控制向量表
中断源名称 | DSP内核中断级向量地址 | 外设向量寄存器地址 | 外设向量偏移地址 | 是否可屏蔽 | 控制器模块 | 中断功能 |
TPINT2 | INT3(0006H) 事件管理器中断组B |
EVIVRB(7433H) | 002AH | 可 | EV.GPT2 | 定时器2周期中断 |
TCINT2 | 002CH | 可 | EV.GPT2 | 定时器2比较中断 | ||
TUFINT2 | 002DH | 可 | EV.GPT2 | 定时器2下溢中断 | ||
TOFINT2 | 002EH | 可 | EV.GPT2 | 定时器2上溢中断 | ||
TPINT3 | 002FH | 可 | EV.GPT3 | 定时器3周期中断 | ||
TCINT3 | 0030H | 可 | EV.GPT3 | 定时器3比较中断 | ||
TUFINT3 | 0031H | 可 | EV.GPT3 | 定时器3下溢中断 | ||
TOFINT3 | 0032H | 可 | EV.GPT3 | 定时器3上溢中断 |
2 TMS320F240实时多中断任务处理的软件实现
由于F240器件采用了多个中断源共享内核同一中断级的中断方式,不仅提供了更多的中断源,而且使得用户能方便地处理各种中断源的中断请求。
如图5所示,当系统有多中断任务产生时,一旦有中断任务被响应,则CPU终止当前正在执行的程序代码,转移至中断服务子程序并执行。中断服务子程序主要分两个步骤完成。
①转移至通用中断服务子程序(GISR-G功Interrupt Service Routine)。当中断级中的某一个中断被响应时,CPU将转移至相应的向量地址,并根据该地址转移至GISR。例如,若INT3中的一个中断被响应,则程序计数器(PC)值被存入栈顶,然后PC机中装入程序寄存器地址0006h。地址0006h和0007h中包含一条转移指令。该指令使CPU转移至GISR。
②转移至特定中断服务子程序(SISR-Special Interrupt Service Routine)。当一个外设中断请求被响应时,外设产生一个相应于该特定中断事件的向量地址偏移量。该偏移量通常被锁存在系统中断向量寄存器(SYSIVR)或事件管理中断向量寄存器(EVIVRA/EVIVRB/EVIVRC)中。GISR必须读取存储在IVR中的值,确定具体的子中断源,并据此产生转移至SISR的转移目标地址,然后进行特定的中断处理。
在对SISR进行处理完毕之后,ISR以一条返回指令RET结束。该指令将把返回地址从堆栈弹出。然后,CPU继续执行被中断的代码序列。
如果对于某一中断级,并没有多中断源共享的情况,则直接在GISR中进行中断处理即可。此时,没有必要进入SISR进行子中断源的判断。另外,进入中断后,INTM位自动置1,以防止其它的可屏蔽中断。若想允许中断嵌套,则要在ISR中清除INTM位(CLRC INTM),在全局上重新使能可屏蔽中断,使得新的ISR得以嵌套。
图6 中断服务程序结构框图
下面结合一个具体的机器人DSP控制程序,给出DSP实时多中断任务处理的实例。在本机器人DSP控制程序中,一共要完成四个中断实时处理任务,并且涉及到了多个中断源共享DSP内核同一中断级的中断方式。中断服务程序结构框图如图6所示。串行中断SCI占用了INT1第一级中断,完成DSP与上位机的通信任务。定时器T1中断占用了INT2第二级中断,完成传感器的位置信息采集和PID控制任务。而定时器T2中断和定时器T3中断则共用了INT3第三级中断,完成产生两路PWM波形的任务。定时器T2和定时器T3各自周期中断的向量偏移地址分别为002BH和002FH。当有INT3级中断申请时,在对应的中断服务程序(ISR)中判断中断的向量偏移地址,以此来确定具体是产生了定时器T2中断还是定时器T3中断,再转入定时器T2/T3相应的子中断服务程序。在中断服务程序中,需要根据在中断程序中对各种寄存器的使用情况,编写中断保护和中断恢复代码,即在进入ISR时,要对这些寄存器变量进行堆栈保护;在ISR完成时,要对这些寄存器变量进行堆栈恢复。另外,在编写中断服务程序时,要注意对各寄存器的中断标志位和中断屏蔽位进行适当的处理,为进入下一次中断做准备。以下即为给出的机器人中断服务程序的核心代码,主要对两个定时器中断源共享INT3中断级的中断处理进行详尽地阐述。对于INT1和INT2这两个中断任务,由于无多中断源共享的问题,在进行中断处理时比较简单,直接进入相应的ISR即可。相应的中断处理程序请见网络补充版。
结语
在利用DSP进行数字化控制的过程中,必然要使用到较多的中断才能圆满完成对复杂控制系统的控制任务。F240作为DSP TMS320F24x系列的典型代表,掌握F240的中断处理方法,对TMS320F24x系列的TMS320F241/F243/C242以及TMS320LF2406/LF2407等芯片同样具有参考意义。因此,这种处理方法还具有一定的通用性。笔者将该处理方法应用到基于TMS320F240的主从遥控作业机器人控制系统的软件开发中。经实践证明,这能够满足机器人的实时多中断任务处理的要求,并取得了良好的实际效果。