ARM 7的IRQ中断嵌套:
一、引用的周立功的《ARM微控制器基础与实战(第2版)》
1、当进入 IRQ 后,当要退出中断时,对向量地址寄存器写 0,通知VIC 中断结束。才会响应新的IRQ中断。
2、汇编程序示例
IRQ_EINT0
… … …
… … …
… … …
LDR R0,= VICVectAddr (1)
MOV R1,# 0 (2)
STR R1,[R0] (3)
SUBS PC,LR,# 4 ;IRQ中断返回 (4)
END
3、C语言程序示例
void _irq IRQ_Eint3(void)
{
… … …
… … …
… … …
VICVectAddr = ox00;
}
二、分析推断
1、C语言程序最终也会由编译器编译成汇编程序
2、若按汇编程序示例,IRQ中断的嵌套是发生在(3)执行后,而(4)没执行时。因若(3)没执行,则处理器不会响应新的IRQ中断。若(4)执行则已IRQ中断返回。
3、那么要想从时序上彻底禁止IRQ中断嵌套,则应:
汇编程序示例
IRQ_EINT0
MRS R0,CPSR ;中断模式的CPSR
ORR R0, R0, # NoInt(ox80)
MSR CPSR_c,R0 ;中断模式的CPSR的 I = 1,禁止IRQ中断
… … …
… … …
LDR R0,= VICVectAddr (1)
MOV R1,# 0 (2)
STR R1,[R0] (3)
SUBS PC,LR,# 4 ;IRQ中断返回 (4)
END
这样只有当(4)执行完后,即IRQ中断返回后,才重新开放中断。从而彻底禁止了IRQ中断嵌套。 |