我正在为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
答案 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