ARM Cortex-M3 - 为什么我(似乎)在PUSH指令上收到UsageFault?

时间:2016-05-10 14:41:21

标签: assembly cortex-m3

我在诊断某个情况下push指令中出现的INVSTATE UsageFault的原因时遇到了一些问题。

以下是我所知道的:

  1. 如果这段代码来自一个“新鲜的”'启动,它按预期运行。
  2. 如果这段代码在软件RESET之后运行,我会遇到强制硬故障(除非我读错了)表明自己是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的指令。

    这就是我被困的地方。软件重置后可能会有什么不同可能导致此问题?这甚至是真正的问题吗?

    从这里往哪里的任何方向都会很棒!

0 个答案:

没有答案