Embedded 访问C/C+中Cortex-M3的MSP和PSP寄存器+;使用Keil';sµ;视野

Embedded 访问C/C+中Cortex-M3的MSP和PSP寄存器+;使用Keil';sµ;视野,embedded,cortex-m3,Embedded,Cortex M3,我需要访问Cortex-M3处理器的MSP和PSP寄存器(主寄存器和进程堆栈寄存器) 我在用C/C++写东西 µVision和相关编译器不允许您为这个仅Thumb-2内核进行内联组装(我也不确定这是否是个好主意) 我需要这样做,以便能够提取svc指令的立即值,而不管它是在线程模式还是处理程序模式下执行的 谢谢,对于这样的事情,我通常使用一个小的集合调用来完成 您可以使用特殊寄存器访问指令(MRS/MSR)访问任一SP。我认为使用uVision时,MSP是SP\u main,PSP是SP\u进程

我需要访问Cortex-M3处理器的MSP和PSP寄存器(主寄存器和进程堆栈寄存器)

我在用C/C++写东西

µVision和相关编译器不允许您为这个仅Thumb-2内核进行内联组装(我也不确定这是否是个好主意)

我需要这样做,以便能够提取svc指令的立即值,而不管它是在线程模式还是处理程序模式下执行的


谢谢,

对于这样的事情,我通常使用一个小的集合调用来完成

您可以使用特殊寄存器访问指令(MRS/MSR)访问任一SP。我认为使用uVision时,MSP是SP\u main,PSP是SP\u进程

我的手臂总成有点生锈了,但我想应该是这样的:

MRS   R0, SP_process   // R0 holds retval
BX    LR                // return

从您的问题来看,您似乎已经理解了MSP和PSP之间的区别,并且知道如何确定要读取哪一个(通过LR)。

我目前无法访问Keil编译器来验证这一点,但根据文档,您应该能够使用编译器的“命名寄存器变量”功能:


谢谢你,迈克尔。我没有意识到我可以做内联汇编。编译器拒绝执行块内联汇编,因为这显然需要Arm模式指令,而Cortex-M3只执行Thumb-2。当然,Keil有一个限制。GCC允许在Cortex-M3上进行内联组装。
register uint32_t msp __asm("msp");
register uint32_t psp __asm("psp");