.macro vector_stub, name, mode, correction=0//定义vector_stub有3个参数.align5vector_stub irq, IRQ_MODE,4//这三个参数值代入 vector_stub中vector_ irq://定义 vector_ irq/*计算返回地址(在arm流水线中,lr=pc+8,但是pc+4只译码没有执行,所以lr=lr-4)*/sub lr, lr, #4@ @ Save r0, lr_...
.macro vector_stub, name, mode, correction=0//定义vector_stub有3个参数.align5vector_stub irq, IRQ_MODE,4//这三个参数值代入 vector_stub中vector_ irq://定义 vector_ irq/*计算返回地址(在arm流水线中,lr=pc+8,但是pc+4只译码没有执行,所以lr=lr-4)*/sub lr, lr, #4@ @ Save r0, lr_...
ldr lr,[pc,lr,lsl #2]//如果进入中断前是usr,则取出PC+4*0的内容,即__irq_usr @如果进入中断前是svc,则取出PC+4*3的内容,即__irq_svcmovs pc,lr//跳转到下面某处,且目标寄存器是pc,指令S结尾,最后会恢复cpsr..long __irq_usr @0(USR_26/USR_32).long __irq_invalid @1(FIQ_26/FIQ_32)...
asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs) //irq:中断号 *regs:发生中断前的各个寄存器基地址 { struct pt_regs *old_regs = set_irq_regs(regs); /*根据irq中断号,找到哪个中断, *desc =irq_desc[irq]*/ struct irq_desc *desc = irq_desc + irq; // ...