在 STM32F4 上,如何读取 CPU 寄存器?
这些寄存器是否映射到内存中的任何位置?
如果没有,您能否提供一个简单的汇编代码来将寄存器(例如 LR)读入局部变量?
谢谢。
在 STM32F4 上,如何读取 CPU 寄存器?
这些寄存器是否映射到内存中的任何位置?
如果没有,您能否提供一个简单的汇编代码来将寄存器(例如 LR)读入局部变量?
谢谢。
使用 Keil 工具链,我使用了这种方法:
register int R0 __asm("r0");
其中'R0'现在被编译器识别为变量。
搜索“命名寄存器变量”,例如:
http://www.keil.com/support/man/docs/armcc/armcc_chr1359125006491.htm
首先,如果您只是想查看程序执行情况,您应该只下载 IAR Embedded Workbench for ARM ( IAR EWARM ) 大小限制版本(没有试用结束日期)。
但是如果你真的想用代码来做......这取决于你想读取哪些寄存器,你想用它们做什么,以及编译器决定将它们用于什么。
将使用通用寄存器,但是编译器决定要使用它们,因此您需要了解底层程序集以了解它们代表的内容。
您的局部变量通常存储在 GPR 中,因此在这种情况下读取局部变量的值(在 c 代码中)本质上是执行寄存器读取。
读取特殊用途的寄存器,例如 LR,可能需要汇编。例如,您可以编写一个纯汇编函数,返回调用函数的 LR,然后从 c 代码调用该函数。
例如,从main
,可以执行x = lr_return_func();
,其中lr_return_func()
是一个纯汇编函数,它将 LR 中使用的main
(存储在函数参数上方的堆栈中)复制到寄存器 R0(用于返回值)。当lr_return_func
返回时,这个 LR 将被存储在x
(例如一些寄存器返回到 main 中)。
您可以使用 in-line 执行此操作,但您需要确定您的局部变量首先使用哪个寄存器。因此,例如,如果您确定将x
其存储在 R4 中,那么您的内联程序集将希望将 LR 复制到 R4,并完成......基本上将您的 LR 存储在x
.
Eclipse 有一个很好的工具,叫做 EmbSys Registers。它真的很方便,即使有时它会滞后