Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Freertos硬件故障分析-堆栈寄存器_C++_C_Assembly_Freertos_Cortex M3 - Fatal编程技术网

C++ Freertos硬件故障分析-堆栈寄存器

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" &

我在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" ); }


该函数仅检索指向堆栈的指针,在堆栈中存储异常之前的所有寄存器内容(即,对于ARM Cortex M7,您可以找到有关异常帧的更多信息)

然后它调用函数
prvGetRegistersFromStack
,该函数已在
C
中写入,您可以从定义的变量(
r0
r1
等)中检查所有寄存器

其中一个寄存器,
pc
,存储导致硬故障的指令地址。您可以检查内存映射以找出是哪个函数导致了它

在该函数之后,在您所指的页面中,有一个名为“使用寄存器值”的部分,它解释了如何从指令地址设置断点


不需要翻译任何东西,FreeRTOS已经为您完成了。

嗨,谢谢。问题是,即使中断被禁用,prvGetRegistersFromStack也会跳回重置处理程序(我在攻击代码之前调用uu disable_fault_irq();u disable_irq())。这是因为我从未使用过寄存器加载器函数(prvGetRegistersFromStack)