完整的PendSV处理程序示例
- PendSV_Handler:
- CPSID I ; 禁用中断
- MRS R0, PSP ; 获取当前任务堆栈指针
-
- ; 判断是否是第一次上下文切换
- CBZ R0, PendSV_NoSave ; 如果PSP为0,跳过保存
-
- ; 保存当前任务上下文
- SUBS R0, R0, #0x20 ; 为R4-R11预留32字节空间
- STM R0!, {R4-R11} ; 保存寄存器
-
- LDR R1, =CurrentTCB
- LDR R2, [R1]
- STR R0, [R2] ; 保存堆栈指针到当前TCB
- PendSV_NoSave:
- ; 切换任务
- LDR R1, =CurrentTCB
- LDR R2, =NextTCB
- LDR R3, [R2]
- STR R3, [R1] ; 更新CurrentTCB
-
- ; 恢复新任务上下文
- LDR R0, [R3] ; 获取新任务堆栈指针
- LDM R0!, {R4-R11} ; 恢复寄存器
- MSR PSP, R0 ; 更新PSP
-
- ORR LR, LR, #0x04 ; 设置返回使用PSP
- CPSIE I ; 启用中断
- BX LR ; 返回到新任务
|