注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
jwsmart的个人空间 https://home.eeworld.com.cn/space-uid-325032.html [收藏] [复制] [分享] [RSS]
日志

求助!ucos ii按键中断之后 退不出来了

已有 1019 次阅读2011-5-27 12:11

程序可以进入中断但是在中断程序中一直执行打印语句,不能跳出中断,在中断中我已将srcpnd和intpnd写1清除,我怀疑是


   ; Setup IRQ handler
 ldr r0,=HandleIRQ       ;This routine is needed
 ;ldr r1,=IsrIRQ   ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c
 ldr r1, =OS_CPU_IRQ_ISR ;for ucos
 str r1,[r0]

 

中的OS_CPU_IRQ_ISR宏出了问题,才导致中断无法退出,可又不知是什么问题

 

请高手指点 不胜感激!!!

 

 

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 

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章