rdarda 发表于 2006-9-15 15:51:27

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:

rdarda 发表于 2006-9-18 09:51:51

不好意思 自己没看清 首先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]
查看完整版本: uClinux2.4内核arm IRQ中断源代码中不解的地方