2013-03-15 32 views
4

我正在使用JTAG連接器和gdb在裸機ARM(v5TE兼容)上運行程序。程序從管理員模式下的某些SDRAM運行,並僅使用分支指令。軟件中斷異常或未定義的指令異常?

在某個時候發生異常。用ctrl + C停止gdb我可以看到CPSR指示了一個未定義的異常模式,但程序計數器指示了一個軟件中斷異常(0xffff0008)。根據ARM ARM,當發生未定義的指令異常時,PC_und應該是0xffff00040x00000004。我的程序發生了什麼,SWI發生了什麼,或者是一個未定義的指令異常?

編輯讓我更清楚的問題:

我的程序的目的是測試自定義板的硬件。當出現硬件問題時,RAM中的程序可能會產生損壞(如下所示),這是產生異常的原因。當硬件正常時,測試軟件可以毫無問題地運行。我的RAM地址範圍從0到0x40000000,程序在0x1000到0x2000之間加載。管理員模式堆棧指針被設置爲0xff0。中斷向量只包含斷點。從未定義例外模式

(gdb) c 
Continuing. 
^C^C 
Program received signal SIGTRAP, Trace/breakpoint trap. 
0xffff0008 in ??() 

寄存器:

(gdb) i r 
r0    0x52878 338040 
r1    0x2020000 33685504 
r2    0x2020000 33685504 
r3    0x2020000 33685504 
r4    0x2020000 33685504 
r5    0x2020000 33685504 
r6    0x2020000 33685504 
r7    0x2020000 33685504 
r8    0x2020000 33685504 
r9    0x2020000 33685504 
r10   0x2020000 33685504 
r11   0x2020000 33685504 
r12   0x2020000 33685504 
sp    0x2020000 0x2020000 
lr    0xffff0008 4294901768 
pc    0xffff0008 0xffff0008 
fps   0x0 0 
cpsr   0x800000db 2147483867 

寄存器從管理程序模式:

(gdb) set $cpsr=0xd3 
(gdb) i r 
r0    0x52878 338040 
r1    0x2020000 33685504 
r2    0x2020000 33685504 
r3    0x2020000 33685504 
r4    0x2020000 33685504 
r5    0x2020000 33685504 
r6    0x2020000 33685504 
r7    0x2020000 33685504 
r8    0x2020000 33685504 
r9    0x2020000 33685504 
r10   0x2020000 33685504 
r11   0x2020000 33685504 
r12   0x2020000 33685504 
sp    0xff3ffffe 0xff3ffffe 
lr    0x1020 4128 
pc    0xffff0008 0xffff0008 
fps   0x0 0 
cpsr   0xd3 211 

這裏是在地址周圍的RAM(損壞)程序由主管指出鏈接寄存器:

(gdb) x/5i 0x1020-8 
0x1018 <_start+24>: bic r0, r0, #135168 ; 0x21000 
0x101c <_start+28>: strbcs r0, [r0], #1025 
0x1020 <_start+32>: mcr 15, 0, r0, cr1, cr0, {0} 
0x1024 <_start+36>: ldr r1, [pc, #120] ; 0x10a4 <skip_intreg_reset+100> 
0x1028 <_start+40>: ldr r2, [r1, #8] 

(gdb) x/4w 0x1018 
0x1018 <_start+24>: 0xe3c00a01 
0x101C <_start+28>: 0xfec00401 
0x1020 <_start+32>: 0xee010f10 
0x1024 <_start+36>: 0xe59f1078 
從程序對象文件

轉儲:

18: e3c00a01 bic r0, r0, #4096 ; 0x1000 
    1c: e3c00001 bic r0, r0, #1 ; 0x1 
    20: ee010f10 mcr 15, 0, r0, cr1, cr0, {0} 
    24: e59f1078 ldr r1, [pc, #120] ; a4 <skip_intreg_reset+0x64> 
    28: e5912000 ldr r2, [r1] 
+0

當swi發生時,它是在拇指模式還是手臂模式? – 2013-03-15 13:39:56

+0

它是在ARM模式 – 2013-03-15 13:41:06

+0

你可以轉儲/後發生異常的代碼? – 2013-03-15 13:43:10

回答

4

這是一個社區維基答案。

  • 錯誤的量表進行初始化:

    問題是由兩個不同的問題引起的。 ARM具有可選擇的高位和低位矢量,高位爲0xffff0000是默認值,而代碼已初始化,就好像向量表位於0x00000000一樣。高量表包含在下面的說明(無限循環上例外):

0xffff0000: b 0xffff0020 
0xffff0004: b 0xffff0004 
0xffff0008: b 0xffff0008 
0xffff000c: b 0xffff000c 
0xffff0010: b 0xffff0010 
0xffff0014: b 0xffff0014 
0xffff0018: b 0xffff0018 
0xffff001c: b 0xffff001c 
  • 板上的SDRAM的問題引起在RAM中的節目內容被破壞併產生未定義例外。之後,程序停止響應,因爲它處於無限循環,並且OP停止了gdb。當gdb以ctrl+C停止時,使用的JTAG調試器(peedi)實際上跳轉到下一條指令,這就是爲什麼pc0xffff0008,即使cpsr指出位於0xffff0004的未定義異常。