在STM32平台下,移植了uCOS V291的核。然后在网上下载了一个移植文件:
- os_cpu_c.c
- os_cpu_asm.asm
本人并没有非常详细地去看任务切换过程的具体实现。只是大致有了一个了解。
当在后台程序中调用OSCtxSw()或OSIntCtxSw()进行任务切换时,其操作都是触发一个软中断PendSV_Handler(),让软中断来进行切换任务栈。如下:
OSCtxSw
LDR R0, =NVIC_INT_CTRL
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
BX LR
OSIntCtxSw
LDR R0, =NVIC_INT_CTRL
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
BX LR
PendSV_Handler()中断处理函数如下:
PendSV_Handler
CPSID I
MRS R0, PSP
CBZ R0, OS_CPU_PendSVHandler_nosave
SUBS R0, R0, #0x20
STM R0, {R4-R11}
LDR R1, =OSTCBCur ; OSTCBCur-&g