我的链接注册出错了吗?

时间:2012-03-22 14:02:39

标签: c gdb embedded arm

我正在通过GDB在ARM芯片上调试一个软件。加载程序后(以及运行之前),当我info registers时,我得到:

(gdb) info registers
r0             0x0      0
r1             0x0      0
r2             0x0      0
r3             0x0      0
r4             0x0      0
r5             0x0      0
r6             0x0      0
r7             0x0      0
r8             0x0      0
r9             0x0      0
r10            0x0      0
r11            0x0      0
r12            0x0      0
sp             0x4770   0x4770
lr             0xffffffff       4294967295
pc             0x8005dc5        0x8005dc5 <Reset_Handler+1>
fps            0x0      0
cpsr           0x20     32

我发现令人担忧的一个寄存器lr设置为0xffffffff。我想这可能是我崩溃的原因。

lr启动0xffffffff是否正常?

4 个答案:

答案 0 :(得分:4)

这看起来像是在重置后很快就让调试器停止执行的情况(我基于你的描述和与PC值相关联的符号名称)。如果是这样的话,不要担心lr的初始状态 - 只是在你初始化它之前不要使用它(在你的汇编代码明确设置之前,它可能没有多大意义。由C编译器来处理函数调用)。

由于另一个人猜测您使用的是Cortex-M3处理器,因此以下是技术参考手册中有关处理器重置时行为的一些内容:

  

5.9重置

     

NVIC与核心同时重置并控制   释放重置到核心。结果,重置的行为是   可预测的。表5-7显示了重置行为。欲获得更多信息   关于重置,请参阅第6章时钟和重置。

     

表5-7重置操作

Action                                Description
=================================   ====================================================

NVIC resets, holds core in reset    NVIC clears most of its registers. The processor is 
                                    in Thread mode, priority is privileged, and the stack 
                                    is set to Main.

NVIC releases core from reset       NVIC releases core from reset.

Core sets stack                     Core reads the start SP, SP_main, from vector-table offset 0.

Core sets PC and LR                 Core reads the start PC from vector-table offset. 
                                    LR is set to 0xFFFFFFFF.

Reset routine runs                  NVIC has interrupts disabled, and NMI and Hard Fault 
                                    are not disabled.

因此,如果您正在运行M3,那就是lr设置为0xffffffff的原因。

我没有看到在复位时如何初始化其他通用寄存器 - 我不会指望它们为零。自己初始化它们。

如果您没有运行M3,则"What values are in ARM registers after a power-on reset?" note可能适用于您的设备。它说:

  

寄存器R0 - R14(包括存储寄存器)和SPSR(在所有模式下)在复位后未定义。

r14lr)。

答案 1 :(得分:3)

lr是链接寄存器。在程序执行函数调用之后,它只包含一个值。它包含返回地址的值。在ARM上,最新的返回地址在lr寄存器中,而不是在堆栈上,这样可以节省两次内存访问,因此比将返回地址推入内存,堆栈,然后将其拉回以返回要快得多。

lr可能是故意设置为该值,以便处理器可以检测到故障,如果它被加载回程序计数器。

您可以单步执行代码到第一个函数调用,输入它,然后看到它发生了变化吗?

它是什么系统?它是一个深度嵌入式微控制器,还是具有操作系统的东西?

堆栈指针看起来很低。它的价值取决于处理器。它通常设置为指向RAM的顶部。它可能会少一些,因为系统已经放置了一些东西。但是,堆栈只有18,288字节,通常高于全局和静态变量,甚至高于堆。它可能是正确的,它只取决于处理器。

为了进行比较,在STM32103的中密度系列中,这是一个嵌入式处理器,RAM为0x20000000到0x20005000

答案 2 :(得分:0)

这是皮层吗?当你处于中断状态时,它看起来像一个返回值。

答案 3 :(得分:0)

0xffffffff被认为是链接寄存器的复位值,所以我认为这可能是调试的一些早期步骤,不是它不是崩溃的原因这是一个正常值看