保存现场几种场景

保存现场几种场景
场景一普通函数调用 (如 main调用fun)触发机制由BLBranch with Link等跳转指令在软件层面主动触发。谁来完成编译器自动生成的代码来完成。保存了哪些寄存器R4-R11如果被调用的函数fun内部使用了这些寄存器它会在函数的开头入口处用PUSH指令将它们压栈在返回前用POP恢复。LRBL指令执行时CPU硬件会自动将返回地址存入LR。但若fun内部还有嵌套调用它也会把LR压栈保存。原理这确保了函数调用前后调用者main的R4-R11内容保持不变保证了程序的确定性。场景二异常/硬件中断 (如外部中断、SysTick)触发机制由外部事件或内部外设在硬件层面异步触发。谁来完成CPU硬件自动完成一部分程序员/编译器完成另一部分。保存了哪些寄存器分两步进行。硬件自动压栈 (8个寄存器)当异常发生时Cortex-M4内核会自动将以下8个寄存器压入当前使用的栈中PSP或MSP组成一个“栈帧”。R0-R3,R12,LR,PC,xPSR这在硬件上保证了中断处理函数可以作为普通的C函数来编写。软件可选保存如果中断服务程序ISR需要用到R4-R11编译器会像普通函数一样在ISR的入口处生成代码来保存它们。特殊点中断嵌套与返回。处理异常时LR寄存器会被赋一个特殊值EXC_RETURN用于指示异常返回时使用哪个栈指针MSP或PSP以及返回到线程模式还是处理模式从而支持嵌套中断。场景三FreeRTOS任务切换触发机制由SysTick时钟滴答或任务主动阻塞在软件层面主动触发PendSV可挂起服务调用异常来执行。谁来完成CPU硬件自动完成一部分FreeRTOS的移植层代码 (port.c)完成其余部分。保存了哪些寄存器这是保存最完整、最彻底的一种场景。硬件自动压栈触发PendSV异常后硬件首先自动保存了和场景二相同的R0-R3,R12,LR,PC,xPSR到当前任务的栈中。软件强制保存所有剩余寄存器紧接着在PendSV的中断服务函数通常是xPortPendSVHandler中FreeRTOS的汇编代码会主动将当前任务的所有其他通用寄存器包括R4-R11全部压栈保存。原理因为任务切换是完全独立的上下文切换当前任务的执行现场所有寄存器的值必须被完整地保存到它自己的任务栈中等到下一次它获得CPU时才能精确地恢复现场继续执行。总结