STM32 -O2编译进入HardFault_Handler 问题定位

1、问题现象

代码O0编译运行正常,O2编译会运行进入HardFault_Handler。

2、引起HardFault_Handler的常见原因

1). 越界操作数组。
2). 使用非法指针(如空指针)。

3、进入HardFault_Handler中断后,查看CFSR寄存器

我使用的是STM32F4系列单片机,它的内核是cortex-M4,故参考cortex-M4 device generic user guide。在4.3.10查看CFSR寄存器(Configurable Fault Status Register)的详细描述,CFSR寄存器由UFSR、BFSR、MMFSR组成,进入HardFault_Handler中断,读取CFSR寄存器的值,查看异常的位,对照指南中各个位的描述即可确定引起HardFault_Handler的原因。

在这里插入图片描述
在这里插入图片描述
keil在调试模式下,可以通过Peripherals->Core Peripherals->Fault Reports很方便地查看UFSR、BFSR、MMFSR三个寄存器的值,可以看到是发生了UNALIGNED错误。
在这里插入图片描述
在这里插入图片描述
查看指南对UFSR寄存器的描述,发现是发生了访问非对齐地址内存。
在这里插入图片描述
最后通过汇编调试,发现运行完LDM指令后就会进入HardFault_Handler
在这里插入图片描述

4、定位到LDM指令引起

LDM指令不支持访问非对齐地址内存,故只要将LDM指令访问的全局变量进行4字节对齐即可。
例如char test attribute((aligned(4)));//使该变量的地址起始值按照4字节对齐

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值