uClinux2.4内核arm IRQ中断源代码中不解的地方
ENTRY(vector_IRQ)@
@ save mode specific registers
@
ldr r13, .LCsirq
sub lr, lr, #4
str lr, @ save lr_IRQ
mrs lr, spsr
str lr, @ save spsr_IRQ
@
@ now branch to the relevent MODE handling routine
@
mrs r13, spsr @ switch to SVC_32 mode
bic r13, r13, #MODE_MASK @ preserve F and T bits
orr r13, r13, #MODE_SVC|I_BIT
msr spsr_c, r13 @ switch to SVC_32 mode
and lr, lr, #15
ldr lr,
movs pc, lr @ Changes mode and branches
.LCtab_irq: .word __irq_usr @0(USR_26 / USR_32)
.word __irq_invalid @1(FIQ_26 / FIQ_32)
.word __irq_invalid @2(IRQ_26 / IRQ_32)
代码如上 主要不理解的地方是 msr spsr_c,r13 add lr,lr,#15地方 在网上大家都认为这里的lr=spsr也就是跳转到中断之前哪个模式下的cpu状态寄存器,但是我觉得在msr spsr_c,r13后cpu进入的是svc_32模式这时候的lr应该是svc_lr而不是上面的irq_lr了呀,而且movs中的s标志位也只是修改ALU标志位对mode标志位无影响的...希望高手们给点启示....小弟先谢上 :roll: 不好意思 自己没看清 首先msr spsr_c,r13是改变spsr而不是cpsr所以模式也暂时不会改变。而在以后的movs pc,lr的时候cpsr会载入spsr中的直由此而进入相应的模式(这里代码中对spsr进行了修改所以在movs pc,lr后会进入svc模式),movs指令当后面跟的是pc时情况比较特殊把会copy spsr to cpsr。。。基本上如此 :cry::cry::cry:
页:
[1]