读取STM32上的CPU寄存器

时间:2013-08-23 12:54:58

标签: cpu-registers stm32

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

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

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

感谢。

3 个答案:

答案 0 :(得分: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()是纯组装函数,复制main中使用的LR(存储在堆栈中)上面的函数参数)来注册R0(用于返回值)。当lr_return_func返回时,该LR将被存储在x中(例如,一些寄存器返回到main中)。

可以在线进行,但你需要先确定你的局部变量使用哪个寄存器。因此,如果您确定x存储在R4中,那么您的内联汇编会希望将LR复制到R4,并且完成...基本上将您的LR存储在x中。

答案 1 :(得分:2)

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

register int R0 __asm("r0");

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

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

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

答案 2 :(得分:1)

Eclipse有一个很好的工具,叫做EmbSys寄存器。 虽然有时它会滞后,但它真的很方便