我需要访问 Cortex-M3 处理器的 MSP 和 PSP 寄存器(主堆栈寄存器和进程堆栈寄存器)。
我正在用 C/C++ 编写。
µVision 和相关的编译器不允许您为这个仅限 Thumb-2 的内核进行内联汇编(而且我不确定这是否是个好主意)。
我需要这样做,以便我可以提取 svc 指令的立即值,而不管它是在线程还是处理程序模式下执行。
谢谢,
我目前无法访问 Keil 编译器来验证这一点,但根据文档,您应该能够使用编译器的“命名寄存器变量”功能:
register uint32_t msp __asm("msp");
register uint32_t psp __asm("psp");
对于这样的事情,我通常使用一个小的装配标注来做到这一点。
您可以使用特殊寄存器访问指令(MRS / MSR)访问任一 SP。我认为对于 uVision,MSP 是SP_main,而 PSP 是SP_process。
我的 ARM 程序集有点生锈,但我认为它是这样的:
MRS R0, SP_process // R0 holds retval
BX LR // return
从您的问题来看,您似乎已经了解了 MSP 和 PSP 之间的区别,并且知道如何确定要阅读哪一个(通过 LR)。