Cortex-M4自定义HardFault_Handler

时间:2016-01-10 01:54:58

标签: gdb arm embedded cortex-m

我正在为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中),直到生成异常并在我的自定义处理程序中捕获它。但是,单步处理程序中的指令只是放在处理程序的开头。

这是我的处理程序:

.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

1 个答案:

答案 0 :(得分:1)

.thumb需要由.thumb_func替换。

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

如果没有此指令,指针的地址将处于arm模式(偶数地址),这本身会导致异常。换句话说,我的例外被抢先一个例外。

添加.thumb_func以明确标识此符号为拇指模式功能,以便链接器可以做正确的事情。

.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