程序可以进入中断但是在中断程序中一直执行打印语句,不能跳出中断,在中断中我已将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
|