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();

  }

             

MDK调试错误之HardFault_Handler,布布扣,bubuko.com

时间: 2024-10-10 21:17:55

MDK调试错误之HardFault_Handler的相关文章

MDK调试错误

Undefined symbol assert_failed (referred from dma.o). 链接过程中出现assert_param函数未定义的错误 解决方法: 在Options->C/C++->preprocessor Symboles有Define:项中输入USE_STDPERIPH_DRIVER,重新编译链接,无警告无错误. 或其实,出现这种现象是由于你使用的main文件模板时将以下的函数删掉了!所以直接加上相应的函数就OK! 1 #ifdef USE_FULL_ASSER

MDK常见错误详解集合

错误代码及错误信息 错误释义 error 1: Out of memory 内存溢出 error 2: Identifier expected 缺标识符 error 3: Unknown identifier 未定义的标识符 error 4: Duplicate identifier 重复定义的标识符 error 5: Syntax error 语法错误 error 6: Error in real constant 实型常量错误 error 7: Error in integer consta

c3p0私有属性checkoutTimeout设置成1000引发的调试错误:

checkoutTimeout设置成1000引发的调试错误: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not

关于codeblocks调试错误

对于出血编程者,当代码有错误时,可能大家一般都是在程序的变量操作之后输出变量的值,但是这种方法较麻烦,工作量较大,也无法很快的找出错误,因此运用编程软件调试错误就显得尤为重要,刚才写啦一个代码,运用直接观察法和输出关键变量的方法找啦很久都没能改正,后来就试着用编程软件的查错来找问题,结果很快就改正啦,在此分享一下吧^...^ 先说一下小细节,一般大家的codeblocks可能使这种界面,但是调试程序的时候要用到manager,其实很简单,我们到view-manager勾选上就好啦,正确的是这样的

Android调试错误-No resource identifier found for attribute &#39;showAsAction&#39;

今天在研究有米广告技术时,第一次编译他们提供的Android示例工程,结果出现如下错误: [2014-11-29 11:28:25 - com.youmi.android.offerdemo.YoumiOffersAdsDemo] W/ResourceType(15184): Bad XML block: header size 201 or total size 0 is larger than data size 0[2014-11-29 11:28:25 - com.youmi.andro

C# net core程序调试错误集(持续更新)

目录 C#程序调试错误集 1.依赖注入错误An unhandled exception has occurred while executing the request. 1.1 出错现象 1.1.1原因是net core在调用ValueController的时候,发现UnitOfWork没有进行依赖注入. 1.2 出错现象 1.2.1 原因是net core在调用UnitOfWork的时候,发现IPBoxContext没有进行依赖注入. 1.3 解决方法 C#程序调试错误集 1.依赖注入错误A

STM32 ~ MDK环境下调试程序 HardFault_Handler 相关

STM32出现HardFault_Handler故障的原因主要有两个方面: 1.内存溢出或者访问越界.这个需要自己写程序的时候规范代码,遇到了需要慢慢排查. 2.堆栈溢出.增加堆栈的大小. 出现问题时排查的方法: 1.添加软件断点,一旦在调试过程中出现Hard Fault 则会停在__breakpoint(0)处. void HardFault_Handler(void) { if (CoreDebug->DHCSR & 1) { //check C_DEBUGEN == 1 -> D

JAVA程序调试错误集

这边文章是我记录调试JAVA程序的错误,每次遇到都会更新! 错误1.HTTP Status 405 - HTTP method GET is not supported by this URL 解决办法:删除super.doGet(request, response); 错误2. HTTP Status 404 - /Simple/GetAddress ------------------------------------------------------------------------

Xcode真机调试错误之&quot;Please valify your...clock not set&quot;

乍一看错误信息是证书过期,其实是描述证书错乱了. Xcode->Preferences->Account  将选中其中一个描述文件 show in finder,将里面的全都删除. 最后将你项目本身需要的调试文件download下来,add进去就好了.