为什么cortex-m3会重置为gdb中的地址0?

为什么cortex-m3会重置为gdb中的地址0?,gdb,cortex-m3,openocd,Gdb,Cortex M3,Openocd,我正在为Stellaris LM3S8962 cortex-m3芯片构建交叉编译工具链。我写的测试C++应用程序将执行一段时间,然后出错。当我尝试访问内存映射的硬件设备时,会发生故障。目前,我的工作假设是,我在启动序列中遗漏了一些基本的芯片初始化 我想了解的是,为什么gdb中的执行会停止,而程序计数器设置为0?向量表在0x0,但第一个值是堆栈指针。我不应该在向量表中指定的错误处理程序中结束吗 (gdb) 187 UARTSend((unsigned char *)secret, 2);

我正在为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
(gdb)
187 UARTSend((未签名字符*)secret,2);
(gdb)续
持续的。
lm3s.cpu——双重故障后清除锁定
程序收到信号SIGINT,中断。
0x00000000英寸g_pfinvactors()
(gdb)信息寄存器
r0 0x1 1
r1 0x32 50
r2 0xFFFFFFFF4294967295
r3 0x0 0
r4 0x74518808 1951500296
r5 0xc24c0551 3259762001
r6 0x42052dac 1107635628
r7 0x200007230 536900144
r8 0xf85444a9 4166272169
r9 0xc450591b 3293600027
r10 0xd8812546 3632342342
r11 0xb8420815 3091335189
r12 0x3
sp 0x200071f0 0x200071f0
lr 0xFFFFF1 4294967281
pc 0x1 0x1
fps0x0
cpsr 0x60000023 1610612771

该工具链基于gcc、gdb、openocd。

gdb很高兴地为您提供了一些线索:

双重故障后解除锁定

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


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

不确定pc是否为0 | 1,但看看链接寄存器,这非常有趣。我的拇指有点生疏了2,带ARM指令的正常ARM引导会执行并初始化所有堆栈指针,那么您是初始化堆栈指针还是堆栈指针意味着系统/用户模式?您可以尝试更改所有链接寄存器。或者,如果你能阅读gdb的psr,阅读它并找出你所处的模式。我问这个问题已经有一段时间了,但我认为你是对的。我似乎记得根本原因是总线故障,因为我没有初始化UART。感谢您花时间将信息添加到公共记录中。