我在freertos hardfault处理程序和它的分析上遇到了困难,通过将堆栈寄存器加载到ram中来找出错误的原因。
它是在汇编中写的。有没有一种方法可以将其转换为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" ); }
1条答案
按热度按时间ac1kyiln1#
该函数仅检索指向堆栈的指针,其中存储了异常之前的所有寄存器的内容(即对于ARM Cortex M7,您可以找到有关异常帧here)的更多信息。
然后它调用函数
prvGetRegistersFromStack
,该函数已经用C
编写,您可以从定义的变量(r0
,r1
等)中检查所有寄存器。其中一个寄存器
pc
存储导致硬故障的指令的地址。您可以检查内存Map,以找到哪个函数导致了它。在您所参考的页面中,在该函数之后有一个称为“使用寄存器值”的部分,该部分解释了如何从指令地址设置断点。
不需要翻译任何东西,FreeRTOS已经为您完成了。