在ARM7下写了一个定时器中断程序。下面代码是进入IRQ中断后然后为了可重入中断,就切换到系统模式下。但是在切换的时候出现问题?如何直接MSR CPSR_C,#SYS32_MODE(1)就出现SIGBUS错误。切换代码改成MSR CPSR_C,#(SYS32_MODE|NO_INT)(2)就行了。我的疑惑是为什么(1)种会出错?而修改成(2)这种,那这个中断不就屏蔽IRQ和FIQ中断 这样不就不是可重入中断了吗?
[code]
.equ NO_INT ,0xC0
.equ SYS32_MODE ,0x1F
.equ FIQ32_MODE ,0x11
.equ IRQ32_MODE ,0x12
IRQ_ISR_Handler:
//计算返回地址
sub lr,lr,#4
stmfd sp!,{lr}
mrs r14,spsr
//保存相关寄存器和spsr
stmfd sp!,{r12,r14}
//切换到系统模式
msr cpsr_c,#(NO_INT|SYS32_MODE)
//保存相关寄存器
stmfd sp!,{r0-r11,lr}
//调用C源程序W90P710_IRQ_ISR
bl W90P710_IRQ_ISR
ldmfd sp!,{r0-r11,lr}
//切换到IRQ模式
msr cpsr_c,#(NO_INT|IRQ32_MODE)
ldmfd sp!,{r12,r14}
msr spsr,r14
ldmfd sp!,{pc}^
进中断前要屏蔽中断,否则,在执行中断时,可能会有更高级的中断产生,那么此时CPU转去执行另外一个中断,在新中断执行完后,被中断的中断很可能无法正确返回
明白你的意思了。
1、我不知道arm7上面的irq模式有没有自已的sp寄存器,但是看你上面的代码在进入irq模式的时候,没有初始化sp~~~
可能是这个问题。
2、你在退出irq模式之前,应该先将中断控制器里面已经产生的中断记录清空吧。不然,你刚退出irq模式, 中断控制
器那边又产生中断来了,因为中断控制器的记录不清空,他一直向arm内核发中断请求.