2011-02-01 68 views
2

我正在爲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。

+0

不確定pc是否爲零,但看看該鏈接寄存器,這非常有趣。我在我的thumb2上有點生疏,正常的ARM和arm指令啓動會通過並初始化所有的堆棧指針,你初始化你的堆棧指針還是這個堆棧指針暗示系統/用戶模式?你可以嘗試改變所有的鏈接寄存器。或者如果你能從gdb讀取psr,請閱讀並找出你在哪個模式。 – 2011-02-02 04:58:31

回答

4

GDB高興地給你一些線索:

清除鎖定雙誤

你的CPU是在鎖定狀態之後。這意味着它不能運行它的「硬故障」中斷處理程序(也許在其Vector中有0)。

我通常會在忘記爲電源供電時產生這些故障,導致總線錯誤首先升級爲「硬故障」,然後再鎖定狀態。在您的MCU手冊中應該提到,順便說一句。

+0

我問這個問題已經有一段時間了,但我認爲你是對的。我似乎記得,根本原因是總線故障,因爲我沒有初始化UART。很好,你花時間在公共記錄上添加信息。 – mikelong 2011-03-27 19:39:18