C++ Freertos硬件故障分析-堆栈寄存器
我在freertos hardfault处理程序和它的分析上遇到了麻烦,通过将堆栈寄存器加载到ram中来找出故障原因 它是用汇编写的。有没有办法把它翻译成c代码并执行C++ Freertos硬件故障分析-堆栈寄存器,c++,c,assembly,freertos,cortex-m3,C++,C,Assembly,Freertos,Cortex M3,我在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" &
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" ); }
从
该函数仅检索指向堆栈的指针,在堆栈中存储异常之前的所有寄存器内容(即,对于ARM Cortex M7,您可以找到有关异常帧的更多信息) 然后它调用函数
prvGetRegistersFromStack
,该函数已在C
中写入,您可以从定义的变量(r0
,r1
等)中检查所有寄存器
其中一个寄存器,pc
,存储导致硬故障的指令地址。您可以检查内存映射以找出是哪个函数导致了它
在该函数之后,在您所指的页面中,有一个名为“使用寄存器值”的部分,它解释了如何从指令地址设置断点
不需要翻译任何东西,FreeRTOS已经为您完成了。嗨,谢谢。问题是,即使中断被禁用,prvGetRegistersFromStack也会跳回重置处理程序(我在攻击代码之前调用uu disable_fault_irq();u disable_irq())。这是因为我从未使用过寄存器加载器函数(prvGetRegistersFromStack)