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

MDK调试错误之HardFault_Handler

  HardFault_Handler栈溢出检查机制,适用于所有CM3芯片,造成主栈(MSP)溢出的原因有很多,如过多的定义局部变量,递归调用,中断嵌套等都有可能会导致主栈溢出,stm32不具备MPU,没有对内存进行保护的硬件机制,而软件检测栈溢出又有其局限性

 

  STM32出现HardFault_Handler故障的原因主要有两个方面:

    1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。

    2、堆栈溢出。增加堆栈的大小。大多数是因为中断嵌套

      寄存器均是32位,且STM32是小端模式(参考Cortex-M3权威)

 

  

 

  实现原理:1、将主栈的栈底定位在0x20000000处,当主栈溢出时将导致数据被push到低于0x20000000的非法区域,从而触发HardFault异常

       2、由于进入HardFault_Handler后栈有可能已经溢出了,C语言的运行环境可能已不存在,故HardFault_Handler需要改用汇编来实现

       在HardFault_Handler中先根据LR的值判断当前使用的栈是主MSP还是PSP,然后检查 if(BFSR==0x00000092)    if(MMAR==0x1FFFFFFC)   if(SP<0x20000000)

         这三个条件是否同时满足,如果同时满足则可判断主栈确实溢出了,否则可判断出不是因为栈溢出而触发的HardFault异常

 

  出现问题时排查的方法:DEBUG,下断点单步看程序停在哪

             

  另一种方法:

  默认的HardFault_Handler处理方法不是B .这样的死循环么?楼主将它改成BX LR直接返回的形式

    然后在这条语句打个断点,一旦在断点中停下来,说明出错了,然后再返回,就可以返回到出错的位置的下一条语句那儿

  __asm void wait()

  {       

    BX lr

  }

   void HardFault_Handler(void)

   {    

     /* Go to infinite loop when Hard Fault exception occurs */   

        wait();

  }

             

 

 

 

 

转载于:https://www.cnblogs.com/wujichaomx/p/3721782.html

相关文章:

  • Dom4j
  • Java基础work4
  • NIO入门系列之第9章:字符集
  • 新语言学习
  • Leetcode | Permutations II
  • C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息
  • 跳前端坑前,先看看这个!!
  • AWR报告导出
  • Outlook 2010如何更改脱机缓存数据OST文件位置?
  • read和write函数
  • mysql数据库开发规范
  • iOS开发UI篇—字典转模型
  • 金蝶kis记账王云盘版怎么安装与注册
  • cocos2d-x中Node中重要的属性
  • Linux磁盘知识,分区与文件系统
  • 0x05 Python数据分析,Anaconda八斩刀
  • Apache Spark Streaming 使用实例
  • css选择器
  • mysql常用命令汇总
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpriteKit 技巧之添加背景图片
  • Yii源码解读-服务定位器(Service Locator)
  • 翻译--Thinking in React
  • 判断客户端类型,Android,iOS,PC
  • 数据仓库的几种建模方法
  • 算法-图和图算法
  • 因为阿里,他们成了“杭漂”
  • AI算硅基生命吗,为什么?
  • Hibernate主键生成策略及选择
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # C++之functional库用法整理
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #mysql 8.0 踩坑日记
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (2)STM32单片机上位机
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (论文阅读11/100)Fast R-CNN
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (五)MySQL的备份及恢复
  • .net 使用ajax控件后如何调用前端脚本
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET学习教程二——.net基础定义+VS常用设置
  • @Autowired和@Resource的区别
  • @Builder用法
  • @ModelAttribute 注解
  • @ModelAttribute注解使用