我对freertos hardfault处理程序及其分析感到沮丧,通过将堆栈寄存器加载到ram中来找出错误原因。
它写在assambly中。有没有办法可以将其转换为c代码并执行?
static void HardFault_Handler(void) { __asm volatile ( " tst lr, #4 \n" " ite eq \n" " mrseq r0, msp \n" " mrsne r0, psp \n" " ldr r1, [r0, #24] \n" " ldr r2, handler2_address_const \n" " bx r2 \n" " handler2_address_const: .word prvGetRegistersFromStack \n" ); }
来自
答案 0 :(得分:1)
该函数仅检索指向堆栈的指针,其中存储了异常之前的所有寄存器内容(即,对于ARM Cortex M7,您可以找到有关异常帧here的更多信息)。
然后它调用函数prvGetRegistersFromStack
,该函数已经写在C
中,您可以在其中检查已定义变量(r0
,r1
等所有寄存器上)。
其中一个寄存器pc
存储导致硬故障的指令的地址。您可以检查内存映射,以找出导致它的功能。
在该函数之后,在您所指的页面中,有一个名为“使用寄存器值”的部分,它解释了如何从指令地址设置断点。
没有必要翻译任何东西,FreeRTOS已经为你完成了。