【问题标题】:Why would cortex-m3 reset to address 0 in gdb?为什么 cortex-m3 会在 gdb 中重置为地址 0?
【发布时间】:2011-02-01 09:40:12
【问题描述】:

我正在为 Stellaris LM3S8962 cortex-m3 芯片构建一个交叉编译工具链。我编写的测试 C++ 应用程序将执行一段时间然后出错。当我尝试访问内存映射的硬件设备时会发生故障。目前我的工作假设是我在启动序列中缺少一些必要的芯片初始化。

我想了解的是为什么 gdb 中的执行会停止并且程序计数器设置为 0?我在 0x0 处有向量表,但第一个值是堆栈指针。我不应该以我在向量表中指定的故障处理程序之一结束吗?

(gdb) 
187     UARTSend((unsigned char *)secret, 2);
(gdb) cont

Continuing.

lm3s.cpu -- clearing lockup after double fault


Program received signal SIGINT, Interrupt.
0x00000000 in g_pfnVectors ()

(gdb) info registers 
r0             0x1      1
r1             0x32     50
r2             0xffffffff       4294967295
r3             0x0      0
r4             0x74518808       1951500296
r5             0xc24c0551       3259762001
r6             0x42052dac       1107635628
r7             0x20007230       536900144
r8             0xf85444a9       4166272169
r9             0xc450591b       3293600027
r10            0xd8812546       3632342342
r11            0xb8420815       3091335189
r12            0x3      3
sp             0x200071f0       0x200071f0
lr             0xfffffff1       4294967281
pc             0x1      0x1 <g_pfnVectors+1>
fps            0x0      0
cpsr           0x60000023       1610612771

工具链基于gcc、gdb、openocd。

【问题讨论】:

  • 不确定 pc 是否为零|1,但看看那个链接寄存器,这很有趣。我的拇指 2 有点生疏了,带有 arm 指令启动的普通 ARM 会通过并初始化所有堆栈指针,你是初始化堆栈指针还是该堆栈指针暗示系统/用户模式?您可以尝试更改所有链接寄存器。或者如果您可以从 gdb 读取 psr,请阅读该文件并找出您所处的模式。

标签: gdb cortex-m3 openocd


【解决方案1】:

GDB 很高兴地给了你一些线索:

双重故障后清除锁定

您的 CPU 处于 锁定 状态。这意味着它无法运行它的“硬故障”中断处理程序(可能它的向量中有一个 0)。

当我忘记给外围设备“供电”时,我通常会得到这些,由此产生的总线错误首先升级到“硬故障”,然后升级到锁定状态。顺便说一句,应该在您的 MCU 手册中提及。

【讨论】:

  • 我问这个问题已经有一段时间了,但我认为你是对的。我似乎记得根本原因是总线故障,因为我没有初始化 UART。很高兴您花时间在公共记录中添加信息。
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
相关资源
最近更新 更多