; PendSV_Handler
PendSV_Handler
LDR R2, =OSTcbCurr ; 不必关中断。嵌套中断发生时会自动保存 R0~R3 到 MSP 并恢复
LDR R0, [R2] ; 如果发生咬尾的多个 PendSV,上半段相当于把已弹出的 {R4-R11} 再次压栈
; CBZ R0, PendSV_Handler_1 ; if(OSTcbCurr == NULL) 跳转至 PendSV_Handler_1
CMP R0, #0
BEQ PendSV_Handler_1
MRS R3, PSP ; PSP 位置存储了自动压栈内容。
SUBS R3, R3, #32 ; PSP -= 8。新位置存储 R4-R11。向高地址增长时才可借用 ! 更新 R3
STR R3, [R0] ; OSTcbCurr->StkPtr = PSP
; STM R3, {R4-R11} ; 此时 PUSH 使用的是 MSP,要修改 PSP 指向的内容,要用 STM
STM R3!, {R4