1

在 STM32F4 上,如何读取 CPU 寄存器?

这些寄存器是否映射到内存中的任何位置?

如果没有,您能否提供一个简单的汇编代码来将寄存器(例如 LR)读入局部变量?

谢谢。

4

3 回答 3

3

使用 Keil 工具链,我使用了这种方法:

register int R0 __asm("r0");

其中'R0'现在被编译器识别为变量。

搜索“命名寄存器变量”,例如:

http://www.keil.com/support/man/docs/armcc/armcc_chr1359125006491.htm

于 2013-12-27T15:04:15.930 回答
2

首先,如果您只是想查看程序执行情况,您应该只下载 IAR Embedded Workbench for ARM ( IAR EWARM ) 大小限制版本(没有试用结束日期)。

  • 您可以创建一个新项目,将代码拖放到其中,甚至在模拟器中运行它(例如,在 Project->Options->Debugger 中选择“Simulator”)。然后你可以配置所有你想要的寄存器

但是如果你真的想用代码来做......这取决于你想读取哪些寄存器,想用它们做什么,以及编译器决定将它们用于什么。

将使用通用寄存器,但是编译器决定要使用它们,因此您需要了解底层程序集以了解它们代表的内容。

您的局部变量通常存储在 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.

于 2013-09-10T16:52:53.507 回答
1

Eclipse 有一个很好的工具,叫做 EmbSys Registers。它真的很方便,即使有时它会滞后

于 2013-11-06T14:13:37.760 回答