U-boot中IRQ的处理程序如下:<br /> <br />1 ldr sp , IRQ_STACK_START<br /> <br />2 sub sp, sp, #S_FRAME_SIZE <br />3 stmia sp, {r0 - r12} ;@ Calling r0-r12<br />4 add r8, sp, #S_PC<br />5 stmdb r8, {sp, lr}^ ; @ Calling SP, LR<br />6 str lr, [r8, #0] ; @ Save calling PC<br />7 mrs r6, spsr<br />8 str r6, [r8, #4] ; @ Save CPSR<br />9 str r0, [r8, #8] ; @ Save OLD_R0<br />10 mov r0, sp<br /> <br />11 bl do_irq<br /><br />12 ldmia sp, {r0 - lr}^ ;@ Calling r0 - lr<br />13 mov r0, r0<br />14 ldr lr, [sp, #S_PC] ;@ Get PC<br />15 add sp, sp, #S_FRAME_SZ<br />16 subs pc, lr, #4 <br /><br />其中: S_FRAME_SIZE=72, S_PC=60.<br /> do_irq为一C函数,函数原型为:void do_irq(struct pt_reg *pt_regs)<br /><br />仔细看了看,有几个问题百思不得其解,向大家讨教:<br /><br />1. 第10句,为什么要保存IRQ模式下的SP?而保存之后似乎又没有使用这个保存量。至于后面第13句的mov ro ro就更不能理解了,不知何意?<br /><br />2. 为什么要用第5句保存用户模式下的SP和LR?是为了利于在中断中返回用户模式进行中断嵌套么?<br /><br />3. 第7和8句保存了SPSR入栈,但是后面的程序并没有使用到这个栈内的SPSR,依然是直接利用SUBS从SPSR来返回用户模式,不知怎么理解? <br /><br />谢谢~ |
|