我正在通过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
是否正常?
答案 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
(在所有模式下)在复位后未定义。
(r14
是lr
)。
答案 1 :(得分:3)
lr是链接寄存器。在程序执行函数调用之后,它只包含一个值。它包含返回地址的值。在ARM上,最新的返回地址在lr寄存器中,而不是在堆栈上,这样可以节省两次内存访问,因此比将返回地址推入内存,堆栈,然后将其拉回以返回要快得多。
lr可能是故意设置为该值,以便处理器可以检测到故障,如果它被加载回程序计数器。
您可以单步执行代码到第一个函数调用,输入它,然后看到它发生了变化吗?
它是什么系统?它是一个深度嵌入式微控制器,还是具有操作系统的东西?
堆栈指针看起来很低。它的价值取决于处理器。它通常设置为指向RAM的顶部。它可能会少一些,因为系统已经放置了一些东西。但是,堆栈只有18,288字节,通常高于全局和静态变量,甚至高于堆。它可能是正确的,它只取决于处理器。
为了进行比较,在STM32103的中密度系列中,这是一个嵌入式处理器,RAM为0x20000000到0x20005000
答案 2 :(得分:0)
这是皮层吗?当你处于中断状态时,它看起来像一个返回值。
答案 3 :(得分:0)
0xffffffff被认为是链接寄存器的复位值,所以我认为这可能是调试的一些早期步骤,不是它不是崩溃的原因这是一个正常值看