参考:
ARMV7的通用寄存器(核心寄存器、Core Register)
照例先上原文:
不是人话的翻译:
ARMV7-M有两个栈顶寄存器:
MSP(SP_main):主要的栈寄存器
PSP(SP_process):进程寄存器
栈顶指针(SP),分为主要栈寄存器和进程栈寄存器。当前的栈依赖运行模式,在线程模式下由CONTROL.SPSEL 来决定,复位完成后默认使用 PSP。
以下为是人话 的翻译:
ARMV7-M 的 R13(SP)寄存器,在物理上有两个:
MSP(SP_main):主要的栈寄存器
PSP(SP_process):进程寄存器
当我们访问R13时,实际访问的 MSP 还是 PSP 由当前运行模式和 CONTROL.SPSEL 共同决定。
在“管理者模式”下,R13 对应的物理寄存器是 MSP;
在“线程模式”下,R13对应的物理寄存器,由 CONTROL.SPSEL 决定,当 CONTROL.SPSEL == 0 时,使用MSP;当CONTROL.SPSEL == 1 时,使用 PSP。
由于ARMV7-M复位后运行在“线程模式”下,且 CONTROL.SPSEL == 0,因此,ARMV7-M复位后R13对应的物理寄存器是 MSP。
又因为我们知道,进入除了“复位例外”的其他例外后,内核处于管理者模式(ARMV7-M 的工作模式和特权等级),因而此时,R13对应的物理寄存器是MSP。