产生 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 前的语句
接下来步骤同方法一。