程序清单:ucOS-II基于ARM920T的中断处理过程 |
UCOS_IRQHandler//中断入口地址,在中断向量表初始化时被设置 /* 此时已处于中断模式(在ARM处理器中,当中断发生时,CPU自动保存CPSR到SPSR_irq,并切换到中断模式),因此sp为中断模式下的栈指针(如上所说,ARM具有中断模式栈) */ ;保存现场,先将任务的现场保存到中断栈中 stmfd sp!,{r0-r3,r12,lr} ;调用相关函数 bl OSIntEnter bl C_IRQHandler ;调用OSIntExit函数,该函数判断是否有更高优先级的任务进入就绪 bl OSIntExit ;if(OSIntCtxSwFlag == 1) _IntCtxSw() ldr r0,=OSIntCtxSwFlag ldr r1,[r0] cmp r1,#1 ;有更高优先级的任务进入了就绪状态,则进行中断级的任务切换,返回执行新的任务 beq _IntCtxSw /*不进行任务切换,返回被中断的任务*/ ;恢复现场 ldmfd sp!,{r0-r3,r12,lr} ;下面的指令令pc = lr-4实现中断返回,同时将spsr_irq的值复制到CPSR,实现模式切换(即返回到用户模式) subs pc,lr,#4 |