我正在爲Stellaris LM3S8962 cortex-m3芯片構建一個交叉編譯工具鏈。我寫的測試C++應用程序會執行一段時間然後出錯。當我嘗試訪問內存映射的硬件設備時,會發生此故障。目前我的工作假設是我在啓動序列中缺少一些重要的芯片初始化。爲什麼cortex-m3在gdb中重置爲地址0?
我想明白的是爲什麼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是否爲零,但看看該鏈接寄存器,這非常有趣。我在我的thumb2上有點生疏,正常的ARM和arm指令啓動會通過並初始化所有的堆棧指針,你初始化你的堆棧指針還是這個堆棧指針暗示系統/用戶模式?你可以嘗試改變所有的鏈接寄存器。或者如果你能從gdb讀取psr,請閱讀並找出你在哪個模式。 – 2011-02-02 04:58:31