STM32 如何定位导致发生 hard fault 的代码段

产生 hard fault 方法:

对不可访问的内存地址进行写操作

    uint32_t *addr = (uint32_t *)0x20100000;
    *addr = 0x12;

 

方法1:

使用 RT-Thread 系统,如果出现 hard fault,会在中断服务函数 HardFault_Handler 中打印如下消息:

STM32 如何定位导致发生 hard fault 的代码段

从 log 可得知 线程 “ connect t “ 内的程序导致 hard fault,程序执行到 PC: 0x08055F22 处跳转到中断服务函数 HardFault_Handler

查看 rtthread.map 文件可知 0x08055F22 位于函数 load_data_to_toServerBuf 内

STM32 如何定位导致发生 hard fault 的代码段

 

或者可以启动 RT-Thread Studio 调试,打开 “反汇编” 视图,跳转到地址 0x08055F22 ,就可以知道 STM32 在执行到程序

g_toServerBuf[g_toServerBuf_index] = data[i+first];

 

后跳转到中断服务函数 HardFault_Handler,所以导致 hard fault 代码一般出现在这行代码的前面几行。

STM32 如何定位导致发生 hard fault 的代码段

 

 

 方法二:

在中断服务函数 HardFault_Handler 的开始位置打一个断点

STM32 如何定位导致发生 hard fault 的代码段

 

 程序运行到这里后,查看寄存器 PSP 的值,为 0x2000FA30

STM32 如何定位导致发生 hard fault 的代码段

 

 通过 PSP 的值,根据寄存器入栈顺序,就可以得到 PC 值(由于是小端编码,所以为 0x08055F6A,也就是跳到中断服务函数 HardFault_Handler 前的语句

STM32 如何定位导致发生 hard fault 的代码段

 

 接下来步骤同方法一。

 

上一篇:MacOS下SVN迁移Git踩坑记


下一篇:AT1983 [AGC001E] BBQ Hard