4

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

我正在用 C/C++ 编写。

µVision 和相关的编译器不允许您为这个仅限 Thumb-2 的内核进行内联汇编(而且我不确定这是否是个好主意)。

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

谢谢,

4

2 回答 2

5

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

register uint32_t msp __asm("msp");
register uint32_t psp __asm("psp");
于 2010-06-01T15:56:09.137 回答
1

对于这样的事情,我通常使用一个小的装配标注来做到这一点。

您可以使用特殊寄存器访问指令(MRS / MSR)访问任一 SP。我认为对于 uVision,MSP 是SP_main,而 PSP 是SP_process

我的 ARM 程序集有点生锈,但我认为它是这样的:

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

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

于 2010-06-01T13:40:50.363 回答