在STM32F4上,如何读取CPU寄存器?
这些寄存器是否映射到内存中的任何位置?
如果没有,您能否提供一个简单的汇编代码,用于将寄存器(例如LR)读入局部变量?
感谢。
答案 0 :(得分:2)
首先,如果你只是试图查看程序执行,你应该只下载IAR Embedded Workbench for ARM( IAR EWARM )大小限制版本(没有试用结束日期) 。
但是如果你真的想在代码中做到这一点......那么它取决于你想要阅读的寄存器,你想要用它们做什么,以及编译器决定使用它们的内容对于。
通用寄存器将被使用,但编译器决定它想要使用它们,因此您需要了解底层程序集以了解它们代表什么。
您的局部变量通常存储在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寄存器。 虽然有时它会滞后,但它真的很方便