LDR R0, =savedMSP ;//load address of savedMSP into R0
LDR R0, [R0] ;//load the MSP from savedMSP
MSR MSP, R0 ;//还原休眠之前的SP
CPSIE i ;//触发 PendSV 中断
BX LR ;//这里永远不会被执行到
halTriggerContextRestore先还原了SP,然后触发软中断进行上下文恢复,这里还原SP的作用是保证进入软中断的过程中,原先的栈内容不会被冲毁。问题,为什么halTriggerContextRestore不直接还原上下文并跳转过去而要触发中断在返回呢?原因是触发中断能够触发硬件的自动入栈和出栈,这样一方面和休眠前保持了一致,另一方面函数调用的出入栈有编译器的因素在内,LR在栈内位置未知。