stm32 出现 hard fault 的排查记录

news/2024/10/1 19:24:09

参考链接:https://blog.csdn.net/qq_43118572/article/details/132759626

1、先验知识

先验知识1: cortex m3 在中断/异常时,会把 8 个寄存器(xPSR、PC、LR、R12 以及R3-R0)的值压入栈。入栈顺序以及入栈后堆栈中的内容如下(CM4 是从低地址到搞地质):

地址 寄存器 被保存的顺序
旧 ISP(N-0) 原先已压入栈的内容 -
(N-4) xPSR 2
(N-8) PC 1
(N-12) LR 8
(N-16) R12 7
(N-20) R3 6
(N-24) R2 5
(N-28) R1 4
新 SP(N-32) R0 3

先验知识2: 在 Keil 项目的 Options for Target 'Target 1' 的Target 选项,将 Floating Port Hardware 选项设置为 Not Use,这样的好处是在后续查看堆栈寄存器信息时,不会看到其他浮点寄存器,好根据地址推断存储的是哪个寄存器的值。
> 参考链接:https://blog.csdn.net/qq_20553613/article/details/80118444

在这里插入图片描述

先验知识3: map 文件可以查看符号表(Symbol Table)。符号表可用于确定变量或函数在内存中的位置。

2、正文

由于 arm/cortex 仅支持对齐访问,否则会出现 hard fault。我们以下述访问不对齐的代码为例,产生 Hard Fault 并进行逐一排查:(假设我们不知道是哪里出现 hard fault)

int main(void)
{int a = 1;int b = 1;int c = a + b;int *p = (int *)0xF000 0000;int d = *p;while (*p) {  // line 11(*p)++;  // 将在此处陷入 Hard Fault  line12}return 0;
}

Step 1:查看 map 我们可以发现栈顶位置为 0x2000 0660

Step 2:当程序陷入异常时,我们能发现当前使用的是 MSP,SP 对应的地址为 0x2000 0640,所以压入了 32/4 = 8 个寄存器(一个寄存器 32 位,即 4 个字节)。根据物理地址,发现上次压入的 PC 值为 0x0800 0336。换而言之,陷入异常的上一条指令地址为 0x0800 0336

Step 3:点击导航栏的 “Disasembly Window”,打开反汇编界面。右键并选择 “Disassembly at Address” 选项,输入 0x0800 0336 并输入 “go to”,就会跳转到该条指令。

备注: Call Stack 跟 Memory 窗口可以查看很多信息

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29535.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

stm32 将外部 Flash挂载在 SPI 出现数据传输时好时不好的排查过程

现象: 将外部 Flash 挂载在 SPI,在 hardware_init() -> read_jedec_id() 里的 result = spi->wr(spi, cmd_data, sizeof(cmd_data), recv_data, sizeof(recv_data)) 中, recv_data 的值经常不一致,result 的值偶尔为 SFUD_SUCCESS, 大部分会 Error。备注: 正常情况…

(8)ILA介绍

一、ILA简介二、ILA使用 在IP Catalog中选择搜索ila,选择第一个:接下来进行一些参数的配置: 配置好后生成即可: 一般情况下选择额ooc模式,可以节省资源。 在IP Sources中可以看到生成的ila ip核,比较重要的是这个.veo文件,这个相当于是ila的一个例化的模板,将该模板直接…

文件IO笔试题

文件IO 笔试题 作业:设计程序,获取当前系统时间,把时间转换为特定格式”yy年mm月dd日 星期x tt:mm:ss”,并每隔1s写入到本地磁盘中一个叫做log.txt的文本中,如果文本不存在则创建。 代码: /***************************************************************************…

BGP小实验

目录拓扑图环境介绍复盘实验总结配置R3R4R1R2 拓扑图环境介绍每台路由器上都有looback0,比如R4是4.4.4.4/32,直连接口地址为10.1.34.4/24,其他路由器直连和looback口地址类似,R4上还有looback1,地址为44.44.44.44/24。 R3和R4是EBGP邻居关系,AS123内路由器是IBGP邻居关系…

Vue入门到关门之Vue3学习

一、常用API 注意:本文项目均使用脚手架为 Vite 1、setup函数 (1)介绍 如果在项目中使用配置项API,那么写起来就和vue2的写法是一样的;但是如果在项目中写的是组合式API,那么组件中所用到的:数据、方法等等,均要配置在setup中。此外,setup() 钩子也是在组件中使用组合…

sso-单点登录

单点登录 项目组成 基于spring-boot-2.1.8.RELEASE,使用redis完成完成 session记录。sso-basesso-serversso-client1sso-client2 sso-baseTokenFilter: 拦截获取是否登录,并获取登录用户设置到线程变量中TokenUtil:从redis获取指定key判断是否登录,以及登录用户;写入sessi…

Vue入门到关门之Vue2高级用法

一、在vue项目中使用ref属性 ref 属性是 Vue.js 中用于获取对 DOM 元素或组件实例的引用的属性。通过在普通标签上或组件上添加 ref 属性,我们可以在 JavaScript 代码中使用 this.$refs.xxx 来访问对应的 DOM 元素或组件实例。放在普通标签上,通过 this.$refs.名字---》取到的…