TMS320F24x的实时多中断任务处理
表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第三级中断,完成