当前位置: 首页 > news >正文

ARM Coretex-M核心单片机(STM32)分析hardfault的原因

1. 前提基础知识(ARM M核异常 压栈流程)

M核栈增长方向是地址逐渐减小的(TIPS:有的架构的处理器是增大的例如8051内核,而有的像ARM A核心是可设置的 可以增大也可以减小)
ARM Coretex-M核心常用的有M0 M3 M4,下图第一个为M3的压栈情况,M4带FPU和浮点寄存器的并不一样
M3的假设hardfault ISR里边就有个while(1);语句,那看SP的栈顶值,从栈顶开始数算第一个向上高地址方向数到第六个就是LR的值,把或者值读出来赋值给PC(定义个函数指针),就可以跳转到问题发生处了,然后结合hardfault状态寄存器(0XE000ED2C,SCB->HSFR)的值 大概能分析出产生hardfault的原因
图1

图2

在这里插入图片描述

**下图为M4核的压栈情况,因为带有浮点寄存器所以压栈的内容也多 **
M4核心

ARM CM4核心带浮点处理器FPU的,压栈的东西还不一样


进入hardfult后看MSP或者SP的值,看下边第二章图如果hardfult里边啥都没有,就只有个while(1){} 可以用第二张图判断SP+20里边存储的就是LR寄存器的值,也就是产生hardfault前导致的问题的地方,把这个值像第一张图一样写给PC就能定位到因为哪里产生的hardfault,

现在还在推出来个类似的公式解决方法,发现函数里边写的东西越多函数栈指针会变化,也就不能直接取*(SP+24)|(SP+23)|(SP+22)|*(SP+21),拼凑出来的值就是LR的值可以直接赋值给PC,定义个函数指针给赋值了,在调用在hardfault里边直接就可以跳过去

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

还在研究公式化的方法

ARM官方给出的hardfault 原因分析方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结下来就是利用处理异常时候会进行压栈处理,也会把LR的值压进去,然后分析栈中的LR的值,设置PC跳到导致产生hardfault的地方,然后结合上边的hardfault状态寄存器进行分析问题的具体原因
在这里插入图片描述


http://www.mrgr.cn/news/92448.html

相关文章:

  • Docker快速使用指南
  • TFChat:腾讯大模型知识引擎(DeepSeek R1)+飞书机器人实现AI智能助手
  • 浅显易懂HashMap的数据结构
  • Ubuntu+deepseek+Dify本地部署
  • Python在实际工作中的运用-通用格式CSV文件自动转换XLSX
  • 基于Kerberos认证对接华为云Elasticsearch
  • JVM 简单内存结构及例子
  • k8s中pod的调度策略之pod的亲和性调度与反亲和性调度 一文搞懂 k8s中创建的pod如何调度?
  • 蓝桥杯练习代码
  • 【最大通过数——二分】
  • 机试刷题_NC17 最长回文子串【python】
  • 细说STM32F407单片机RS485收发通信实例及调试方法
  • 模拟算法.
  • Mellanox的LAG全称是什么?网卡的创建机制如何?(Link Aggregation Group 链路聚合组)
  • 在nodejs中使用ElasticSearch(三)通过ES语义检索,实现RAG
  • 本地部署阿里的万象2.1文生视频(Wan2.1-T2V-1.3B)模型
  • 仿真环境下实现场景切换、定位物体和导航行走
  • 指标异动拆解:数据分析师的实战指南
  • Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(七)
  • 如何搭建起成熟的团队知识文档管理系统