这里设置了标准中断异常(IRQ)和快速中断异常(FIQ)的中断入口,其余异常都设置为死循环,当发生这些异常的时候,必须使系统复位才能退出死循环。
3.2 移植中断任务切换
中断任务切换(OSIntCtxSw)和任务切换函数(OSCtxSw)比较相似,主要有以下几步组成:
1)调用OSTask SwHook()
2)OSPrioCur=OSPrioHighRdy
3)OSTCBCur=OSTCBHighRdy
4)SP=OSTCBHighRdy->OSTCBStkPtr
//获取高优先级的任务堆栈指针
5)从高优先级的任务的堆栈中弹出高优先级的任务上下文
6)执行高优先级的任务
3.3 移植中断服务程序
以IRQ中断为例中断服务程序(OS_CPU_IRQ_ISR)主要依据上面所描述的“uCOS II中断响应的过程”编写,其主要代码如下:
……
LDR R0,OS_IntNesting
LDRB R1,[R0]
ADD R1,R1,#1
STRB R1,[R0]
CMP R1,#l
BNE OS_CPU_IRQ_ISR_1
LDR R4,OS_TCBCur
LDR R5,[R4]
STR SP,[R5]
OS_CPU_IRQ_ISR_1:
MSR CPSR_c,#(NO_INT | IRQ32_MODE)
//切换到SVC模式
LDR R0,OS_CPU_IRQ_ISR_Handler
MOV LR,PC
BX R0
MSR CPSR_c,#(NO_INT | SVC32_MODE)
//切换到SVC模式
LDRR0,OS_IntExit //OSIntExit()
MOV LR,PC
BX R0
……
在代码中省略了现场工作寄存器的保护与恢复及工作模式的切换。 |