ARM7中断疑惑?请哪个大虾帮忙看看。小弟不胜感激!

nsz   2009-5-10 15:51 楼主
在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}^                               
               

回复评论 (2)

进中断前要屏蔽中断,否则,在执行中断时,可能会有更高级的中断产生,那么此时CPU转去执行另外一个中断,在新中断执行完后,被中断的中断很可能无法正确返回
点赞  2009-5-23 23:33
明白你的意思了。
1、我不知道arm7上面的irq模式有没有自已的sp寄存器,但是看你上面的代码在进入irq模式的时候,没有初始化sp~~~
可能是这个问题。

2、你在退出irq模式之前,应该先将中断控制器里面已经产生的中断记录清空吧。不然,你刚退出irq模式, 中断控制
器那边又产生中断来了,因为中断控制器的记录不清空,他一直向arm内核发中断请求.
点赞  2009-5-23 23:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复