hardfault排故记录01

平台:

CPU :STM32f103rct6
编译器 :MDK5.20;
调试工具:ULINK2

现象:

主板上电后链接ULINK,SW接口可以链接、可以下载程序,偶尔出现cannot access target shutting down debug session错误提示。
程序运行后,进入hardfault错误处理函数。

分析

寻找产生fault原因

1 Cortex-M3/4的Fault简介
Cortex-M3/4的Fault异常是由于非法的存储器访问(比如访问0地址、写只读存储位置等)和非法的程序行为(比如除以0等)等造成的。常见的4种异常及产生异常的情况如下:
Bus Fault:在fetch指令、数据读写、fetch中断向量或中断时存储恢复寄存器栈情况下,检测到内存访问错误则产生Bus Fault。
Memory Management Fault:访问了内存管理单元(MPU)定义的不合法的内存区域,比如向只读区域写入数据。
Usage Fault:检测到未定义指令或在存取内存时有未对齐。还可以通过软件配置是否检测到除0和其它未对齐内存访问也产生该异常,默认关闭,需要在工程初始化时配置:
Hard Fault:在调试程序过程中,这种异常最常见。上面三种异常发生任何一种异常都会引起Hard Fault,在上面的三种异常未使能的情况下,默认发生异常时进入Hard Fault中断服务程序。使能前三种异常也要在初始化时配置:

cortex-m3内核出现HardFault_Handler故障的原因主要有两个方面:
1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。
2、堆栈溢出。增加堆栈的大小。

调试

1, 查看产生hardfault原因

1)在stm32f10x_it.c中的hardfault处理函数中设置断点,当发生hardfault时进入断点。

void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

2)当进入Hard Fault断点后,菜单栏Peripherals >Core Peripherals >Fault Reports打开异常发生的报告,查看发生异常的原因:
工具栏

错误报告栏
3)查看发生错误代码地址:
Cortex‐M3 在进入异常服务例程时,自动压栈了 R0‐R3, R12, LR, PSR 和 PC,并且在返回时自
动弹出它们,通过读取 PSP 的值, OS 就能够获取用户应用程序使用的堆栈,进一步地就知道了在发
生异常时,被压入寄存器的内容。

通过左侧寄存器的值可以查找SP值,可得SP的地址为0x2000AF0,再在memory框中输入SP的地址,查看堆栈里面的值依次为R0~R3R12、LR、PC、XPRS,显然堆栈后第21个字节到24字节即为LR,该地址0x0800186B即为异常前PC将要执行的下一条指令地址。再通过memory查找这个地址所对应的代码即可查找到响应错误语句。

DEBUG调试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值