Cortex-M4 定制 HardFault_Handler

Cortex-M4 custom HardFault_Handler

我正在为 Cortex M4 编写自定义 HardFault_Handler -- 但由于未知原因,我无法单步执行处理程序中的任何指令。

当我使用 gdb 中断时,我卡在了处理程序的第一条指令处。 n 不会继续执行下一条指令,gdb 会再次开始旋转,直到我中断。 OpenOCD 显示我反复停止,但似乎我的异常处理程序中的任何代码都没有被执行...但每次我中断时,我都在异常处理程序中。

...
Info : halted: PC: 0x08000240
Info : halted: PC: 0x08000240
Info : halted: PC: 0x08000240
Info : halted: PC: 0x08000240
...

我知道如果我在 main 处中断,我可以单步执行代码(在 C 中)直到我生成异常并在我的自定义处理程序中捕获它。但是,单步执行处理程序中的指令只是将 be 置于处理程序的开头。

这是我的处理程序:

.syntax unified
.thumb
.global HardFault_Handler

  .section  .text.HardFault_Handler,"ax",%progbits
HardFault_Handler:
  .size  HardFault_Handler, .-HardFault_Handler

Infinite_Loop:
  mov r0, #0x1
  mov r1, #0x2
  mov r2, #0x3
  b  Infinite_Loop

.thumb需要替换为.thumb_func

该指令确保函数指针对拇指模式有效。 Thumb 模式指令的地址为奇数,而 arm 模式指令的地址为偶数。该指令将 add 1 to the address 的函数指针(即异常向量指针)。

如果没有这个指令,指针的地址会处于arm模式(偶地址),这本身就会引发异常。换句话说,我的异常被异常抢占了。

添加 .thumb_func 以将此符号明确标识为 thumb-mode 函数,以便链接器可以做正确的事情。

.syntax unified
.thumb_func
.global HardFault_Handler

  .section  .text.HardFault_Handler,"ax",%progbits
HardFault_Handler:
  .size  HardFault_Handler, .-HardFault_Handler

Infinite_Loop:
  mov r0, #0x1
  mov r1, #0x2
  mov r2, #0x3
  b  Infinite_Loop