打印
[MM32软件]

HardFault异常

[复制链接]
94|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HardFault异常
HardFault (硬件错误,也有译为硬错误)是在MCU上编写程序中所产生的错误,硬件错误处理几乎是最高优先级,它的优先级为-1,只有复位和不可屏蔽中断(NMI)可以对其进行抢占。当它发生时,表示处理器出现了问题,需要采取紧急修复措施。

造成HardFault错误的可能原因较多,如何在代码量较大的情况下,快速定位造成的HardFault的问题代码,就成为比较关键的问题。

本文将以MM32F0130系列MCU为例,Keil-MDK开发环境,总结HardFault的调试、定位方法。在其它Cortex-M0 (M3,M4)内核处理器,和其它开发环境下,也可作为参考。


使用特权

评论回复
沙发
小夏天的大西瓜|  楼主 | 2025-2-25 12:51 | 只看该作者
1可能的原因

《ARM Cortex-M0权威指南》中提到,关于 Cortex M0内核主要有以下几点引起HardFault的原因:
非法存储器访问

非对齐数据访问

从总线返回错误

异常处理中的栈被破坏

程序在某些 C 函数中崩溃

意外地试图切换至 ARM 状态

在错误的优先级上执行系统服务调用指令(SVC)


从软件角度,产生HardFault的可能原因有:
数组越界

野指针

未初始化硬件却开始操作,或无中断服务函数等

任务堆栈溢出

中断服务函数设置错误

时钟异常

注意:只有复位和NMI可以抢占优先级固定的 HardFault 处理程序。HardFault可以抢占除复位、NMI 或其它硬故障之外的任何异常。

使用特权

评论回复
板凳
小夏天的大西瓜|  楼主 | 2025-2-25 12:52 | 只看该作者
2可能出现的异常

如果在执行NMI或HardFault处理程序时,或者在一个使用MSP的异常返回时出栈的却是PSR的时候系统产生一个总线错误,处理器进入一个锁定状态。当处理器处于锁定状态时,它不执行任何指令。处理器保持处于锁定状态,直到下面任何一种情况出现:
出现复位

调试器将锁定状态终止,出现中止仿真的现象

出现一个NMI,以及当前的锁定处于HardFault处理程序中



注意:如果锁定状态出现在NMI处理程序中,后面的NMI就无法使处理器离开锁定状态。

在应用程序中,处理器处于锁定状态,会一直在void HardFault_Handler(void)函数中执行。
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}


下面将在MM32F0130上运行的数组越界代码为例,具体阐述定位步骤:
void StackTest(void)
{
    int data[3],i;
    for(i=0; i<10000; i++)
    {
    data[i]=1;
    }
}

使用特权

评论回复
地板
小夏天的大西瓜|  楼主 | 2025-2-25 12:52 | 只看该作者
处理建议

根据上述的定位手段可以查找是哪一种情况造成的异常,在编程过程中需要避免出现上述异常情况,但是在恶劣复杂的环境下,可能会小概率触发HardFault中断,可以在函数中添加复位或者跳转指令,具体的实现方式需根据应用和使用环境来评估。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

225

主题

1962

帖子

2

粉丝