我在诊断某个情况下push
指令中出现的INVSTATE UsageFault的原因时遇到了一些问题。
以下是我所知道的:
INVSTATE
UsageFault
。< / LI>
醇>
以下是指令在新启动之前运行的寄存器:
(gdb) info registers
r0 0x8001000 134221824
r1 0x8020000 134348800
r2 0x8020000 134348800
r3 0x40022014 1073881108
r4 0x0 0
r5 0x0 0
r6 0x0 0
r7 0x20009fc0 536911808
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x0 0
sp 0x20009fc0 0x20009fc0
lr 0x8000259 134218329
pc 0x8000178 0x8000178 <wait_for_busy>
xPSR 0x81000000 -2130706432
...这里它们就在软件复位后的指令之前:
(gdb) info registers
r0 0x8001000 134221824
r1 0x8020000 134348800
r2 0x8020000 134348800
r3 0x40022014 1073881108
r4 0x4028 16424
r5 0x0 0
r6 0x20009a90 536910480
r7 0x20009fc0 536911808
r8 0x4028 16424
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x0 0
sp 0x20009fc0 0x20009fc0
lr 0x8000259 134218329
pc 0x8000178 0x8000178 <wait_for_busy>
xPSR 0x81000000 -2130706432
更多事实:
0x2000A000
。lr
包含期望值(分支到此func后的指令)。 pc
之后和之后的说明是:
(gdb) disassemble 0x08000178
Dump of assembler code for function wait_for_busy:
0x08000178 <+0>: push {r7}
0x0800017a <+2>: sub sp, #12
0x0800017c <+4>: add r7, sp, #0
0x0800017e <+6>: ldr r3, [pc, #28] ; (0x800019c <wait_for_busy+36>)
0x08000180 <+8>: str r3, [r7, #4]
0x08000182 <+10>: nop
如果我在0x08000178
,然后nexti
中断,我会进入异常处理程序。现在注册:
(gdb) info register
r0 0x8001000 134221824
r1 0x8020000 134348800
r2 0x8020000 134348800
r3 0xe000ed04 -536810236
r4 0x4028 16424
r5 0x0 0
r6 0x20009a90 536910480
r7 0x20009fc0 536911808
r8 0x4028 16424
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x0 0
sp 0x20009f78 0x20009f78
lr 0xfffffff1 -15
pc 0x8000368 0x8000368 <Stub_Handler+2>
xPSR 0x81000003 -2130706429
框架是:
0x20009f98: 0x08001000 0x08020000 0x08020000 0x40022014
0x20009fa8: 0x00000000 0x08000259 0x08000178 0x81000200
HFSR的值是(下图),表明存在强制硬故障:
(gdb) x/1wx 0xE000ED2C
0xe000ed2c: 0x40000000
CSFR的值是(下面),表明INVSTATE
UsageFault:
(gdb) x/1wx 0xE000ED28
0xe000ed28: 0x00020000
INVSTATE
的说明是:
当此位设置为1时,为异常返回而堆叠的PC值指向尝试非法使用EPSR的指令。
这就是我被困的地方。软件重置后可能会有什么不同可能导致此问题?这甚至是真正的问题吗?
从这里往哪里的任何方向都会很棒!