主题 : UCOSII处理中断代码OS_CPU_IRQ_ISR出错 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 33032
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
贡献值: 0 点
综合积分: 8 分
注册时间: 2010-11-24
最后登录: 2011-03-02
楼主  发表于: 2010-11-30 20:06

 UCOSII处理中断代码OS_CPU_IRQ_ISR出错

下面是随板子的一段UCOS处理中断的代码,当发生中断的时候,AXD会报错,如代码的红色部分,为什么呢
OS_CPU_IRQ_ISR    

    STMFD   SP!, {R1-R3}            ; We will use R1-R3 as temporary registers
;----------------------------------------------------------------------------
;   R1--SP
;    R2--PC
;   R3--SPSR
;------------------------------------------------------------------------
    MOV     R1, SP
    ADD     SP, SP, #12             ;Adjust IRQ stack pointer
    SUB     R2, LR, #4              ;Adjust PC for return address to task

    MRS     R3, SPSR                ; Copy SPSR (Task CPSR)
    
  

    MSR     CPSR_cxsf, #SVCMODE|NOINT   ;Change to SVC mode

                                    ; SAVE TASK''S CONTEXT ONTO OLD TASK''S STACK
                                    
    STMFD   SP!, {R2}                ; Push task''s PC
    STMFD   SP!, {R4-R12, LR}        ; Push task''s LR,R12-R4
    
    LDMFD   R1!, {R4-R6}            ; Load Task''s R1-R3 from IRQ stack
    STMFD   SP!, {R4-R6}            ; Push Task''s R1-R3 to SVC stack
    STMFD   SP!, {R0}                ; Push Task''s R0 to SVC stack
    
    STMFD   SP!, {R3}                ; Push task''s CPSR
    
    LDR     R0,=OSIntNesting        ;OSIntNesting++
    LDRB    R1,[R0]
    ADD     R1,R1,#1
    STRB    R1,[R0]
    
    CMP     R1,#1                   ;if(OSIntNesting==1){
    BNE     %F1
    
    LDR     R4,=OSTCBCur            ;OSTCBHighRdy->OSTCBStkPtr=SP;
    LDR     R5,[R4]
    STR     SP,[R5]                 ;}
    
1
    MSR    CPSR_c,#IRQMODE|NOINT    ;Change to IRQ mode to use IRQ stack to handle interrupt
    
    LDR     R0, =INTOFFSET
    LDR     R0, [R0]
      
    LDR     R1, IRQIsrVect
    MOV     LR, PC                          ; Save LR befor jump to the C function we need return back
    LDR     PC, [R1, R0, LSL #2]            ; Call OS_CPU_IRQ_ISR_handler();  
    
    MSR        CPSR_c,#SVCMODE|NOINT   ;Change to SVC mode
    BL         OSIntExit           ;Call OSIntExit
    
    LDMFD   SP!,{R4}               ;POP the task''s CPSR
    MSR        SPSR_cxsf,R4
    LDMFD   SP!,{R0-R12,LR,PC}^       ;POP new Task''s context

IRQIsrVect DCD HandleEINT0