STM32 如何定位导致发生 hard fault 的代码段
作者:互联网
产生 hard fault 方法:
对不可访问的内存地址进行写操作
uint32_t *addr = (uint32_t *)0x20100000; *addr = 0x12;
方法1:
使用 RT-Thread 系统,如果出现 hard fault,会在中断服务函数 HardFault_Handler 中打印如下消息:
从 log 可得知 线程 “ connect t “ 内的程序导致 hard fault,程序执行到 PC: 0x08055F22 处跳转到中断服务函数 HardFault_Handler
查看 rtthread.map 文件可知 0x08055F22 位于函数 load_data_to_toServerBuf 内
或者可以启动 RT-Thread Studio 调试,打开 “反汇编” 视图,跳转到地址 0x08055F22 ,就可以知道 STM32 在执行到程序
g_toServerBuf[g_toServerBuf_index] = data[i+first];
后跳转到中断服务函数 HardFault_Handler,所以导致 hard fault 代码一般出现在这行代码的前面几行。
方法二:
在中断服务函数 HardFault_Handler 的开始位置打一个断点
程序运行到这里后,查看寄存器 PSP 的值,为 0x2000FA30
通过 PSP 的值,根据寄存器入栈顺序,就可以得到 PC 值(由于是小端编码,所以为 0x08055F6A,也就是跳到中断服务函数 HardFault_Handler 前的语句
接下来步骤同方法一。
标签:HardFault,函数,中断,fault,hard,代码段,Handler 来源: https://www.cnblogs.com/god-of-death/p/14991698.html