OS_CPU_PendSVHandler
CPSID I ; Prevent interruption during context switch
;关总中断
MRS R0, PSP ; PSP is process stack pointer
;R0 = PSP PSP为程序堆栈指针
CBZ R0, OS_CPU_PendSVHandler_nosave ; Skip register save the first time
;如果程序堆栈指针为0,说明程序是首次运行,可以直接跳转到OS_CPU_PendSVHandler_nosave,不保存R4-R11
SUBS R0, R0, #0x20 ; Save remaining regs r4-11 on process stack
;M3进入中断时,会自动把R0~R3,R12,LR,PC,xPSR,入栈,M3的栈生长方向是从高地址向下生长,入栈后,栈指针指向R0的位置。接下来要保存R4~R11,8个32位寄存器,用的指令是STM,多个寄存器字连续保存到由R0给出的首地址中 ,并且在R0上,每存储一个后自增,所以,应该空出8个寄存器的位置,所有有SUBS R0, R0, #0x20,等价于R0 = R0 – 0X20,
STM R0, {R4-R11}
;保存R4~R11,保存后,R0的值就是栈的指针SP
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !