定时器中断,安排在 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就可以了!
我自己在跳转程序里也是这个思路,不过既然这样可以,就不需要跳转了,简单的事情想复杂了。谢谢!