当前位置:网站首页>STM32 如何定位导致发生 hard fault 的代码段
STM32 如何定位导致发生 hard fault 的代码段
2022-07-06 09:16:00 【薇远镖局】
产生 hard fault 方法:
对不可访问的内存地址进行写操作
uint32_t *addr = (uint32_t *)0x20100000; *addr = 0x12;
STM32 定位导致发生 hard fault 的代码段 ~ 流程:
1、获得进入中断服务函数 HardFault_Handler 前的 PC 值(PC 值表示的是汇编指令所在的 flash 地址)
2、生成反汇编文件(内含 flash 地址及对应的汇编指令,以及汇编对应的 C 程序)或者 MAP 文件
3、在反汇编文件中,通过 PC 值找到对应的 C 程序语句;或者在 MAP 文件通过 PC 值找到对应的调用函数
获得进入中断服务函数 HardFault_Handler 前的 PC 值
方法1:
使用 RT-Thread 系统,如果出现 hard fault,会在中断服务函数 HardFault_Handler 中打印如下消息:
从 log 可得知 线程 “ connect t “ 内的程序导致 hard fault,程序执行到 PC: 0x08055F22 处跳转到中断服务函数 HardFault_Handler
方法2:
在中断服务函数 HardFault_Handler 的开始位置打一个断点
程序运行到这里后,先查看寄存器LR的值:
如果LR为0xXXXXXXX9,则进入中断前SP的值为MSP;
如果LR为0xXXXXXXXD,则进入中断前SP的值为PSP;
下图的LR为0xXXXXXXXD(截图未显示出来),所以查看寄存器 PSP 的值,为 0x2000FA30
通过 PSP 的值,根据寄存器入栈顺序,就可以得到 PC 值(由于是小端编码,所以为 0x08055F6A)
生成反汇编文件
方法1:
ELF 文件反汇编,生成汇编文件:
.arm-none-eabi-objdump.exe -l -S . tthread.elf > .aaa.c
方法2:
启动 RT-Thread Studio 或者其他 IDE 调试,打开 “反汇编” 视图
方法3:
查看 map 文件,有类似于反汇编文件的一些信息,对于 RT-Thread 功能,则是 rtthread.map
查看 rtthread.map 文件可知 0x08055F22 位于函数 load_data_to_toServerBuf 内
边栏推荐
猜你喜欢
随机推荐
yarn安装与使用
Codeforces Round #753 (Div. 3)
Machine learning -- linear regression (sklearn)
vs2019 使用向导生成一个MFC应用程序
Are you monitored by the company for sending resumes and logging in to job search websites? Deeply convinced that the product of "behavior awareness system ba" has not been retrieved on the official w
牛客Novice月赛40
wangeditor富文本组件-复制可用
分布式节点免密登录
Word typesetting (subtotal)
[CDH] cdh5.16 configuring the setting of yarn task centralized allocation does not take effect
MySQL主从复制的原理以及实现
Variable star user module
Linux Yum install MySQL
vs2019 第一个MFC应用程序
分布式節點免密登錄
機器學習--線性回歸(sklearn)
About string immutability
L2-007 family real estate (25 points)
Redis interview questions
分布式事务的实现方案