[英]Software interrupt exception or undefined instruction exception?
我正在使用JTAG連接器和gdb在裸機ARM(兼容v5TE)上運行程序。 該程序在管理員模式下從某些SDRAM運行,並僅使用arm指令。
在某些時候發生異常。 使用ctrl + CI停止gdb可以看到CPSR指示未定義的異常模式,但程序計數器指示軟件中斷異常( 0xffff0008
)。 根據ARM ARM,當發生未定義的指令異常時, PC_und
應為0xffff0004
或0x00000004
。 我的程序發生了什么,發生了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]
這是社區維基的答案。
問題是由兩個不同的問題引起的:
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
ctrl+C
停止gdb時,使用的JTAG調試器(peedi)實際上會跳轉到下一條指令,這就是為什么pc
為0xffff0008
即使cpsr
指示位於0xffff0004
的未定義異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.