TI中文支持网
TI专业的中文技术问题搜集分享网站

关于中断的问题

定时器中断,安排在 INT12位置,在中断入口处安排一下代码,工作正常。

但是,问题是来了, 进入中断之前的 B0,必然消失,那么 该 如何保护 呢?

中断程序中保护了,但是在此处已经被破坏!

INT12:        MVKL  _timer0_isr__Fv , B0 ; load destination function address to b0        MVKH _timer0_isr__Fv, B0

        B B0
        NOP 3 ; fill delay slot         NOP
        NOP
        NOP
        NOP

hongkun ma:

; 如果 ISR 程序在 1M范围内,可以直接用 B lable; 如果 ISR 程序超出 1M范围内,用 Branch Using a Register,就要保存此 Register

; 中断入口处只有8个字节的指令(最多14),不够保存必要的寄存器

找到了 笨办法:采用跳转办法

1、ISR 采用C编程:interrupt void timer0_isr(void);

2、中断向量处:

INT12:

STW .D2T2 B3,*B15–[2]      ;保存 B3 ,SP-=8; MVKL _INT12_JUMPER__Fv,B3 ; load destination function address to b3 MVKH _INT12_JUMPER__Fv,B3 B B3 NOP 5 ; fill delay slot NOP NOP NOP

3、跳转处 _INT12_JUMPER__Fv

;进来之前;SP = SP -8,B3 已经保存_INT12_JUMPER__Fv:

MVC .S2 IRP,B3 STW .D2T2 B3,*+SP[1]   ;保存 IRP

MVKL $C$L1,B3   MVKH $C$L1,B3 MVC .S2 B3,IRP              ;在IRP中装载 返回地址(返回到本跳转程序),便于跳转程序接管

MVKL _timer0_isr__Fv,B3  ;  MVKH _timer0_isr__Fv,B3 B B3                                             ;转到 真的 ISR  NOP 5 ; fill delay slot $C$L1: LDW .D2T2 *+SP[1],B3                  ;IRP 装载到 B3 NOP 4 MVC .S2 B3,IRP                             ;IRP也恢复,确保万无一失,虽然似乎不用 B B3                                                ;跳转到 应用程序中断发生的地方继续执行 LDW .D2T2 *+SP[2],B3                  ;恢复B3|| ADD .L2 8,SP,SP                         ;恢复SP NOP 4

经过 simulator 测试验证,工作机制正常,没有问题。

Tony Tang:

C ISR的关键字interrupt编译后的函数应该是会保护这些寄存器的,你可以看一下编译产生的汇编文件。

hongkun ma:

回复 Tony Tang:

是的。保护B0就可以了!

我自己在跳转程序里也是这个思路,不过既然这样可以,就不需要跳转了,简单的事情想复杂了。谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » 关于中断的问题
分享到: 更多 (0)