由于内存字节对齐导致的硬件错误

最近在调试STM32程序的时候,经常进到HardFault_Handler这个中断里。产生这个中断的原因一般和内存有关系,像是数组越界、堆栈溢出之类的。

检查了好几天终于发现了问题的所在,产生问题的原因是程序在运行函数指针所指向的时候,由于指针指向的地址不对而引发HardFault_Handler中断。

令我匪夷所思的地方就来了,在我的程序中并没有对这个指针进行一些无效的赋值,于是我开始调试对这个指针赋值的那段代码,然后发现了一个让人始料未及的事情。赋值的那段代码是没有问题的,但是在完成赋值操作之后,这个函数指针所指向的地址竟然和我赋值给它的地址不一样。内心一阵万马奔腾的景象。

然而为什么会产生这个原因呢?好吧到最后我也没有想明白是什么原因。不过解决方法不知道是凑巧还是什么,我在网上找HardFault_Handler相关的资料的时候,发现有人提到了内存字节对齐。于是我想到了在我的程序中有一些数据结构被我设置成1字节内存对齐。是使用#pragma pack (1) 来实现的,但是我并没有加#pragma pack () 取消自定义内存对齐指令,导致其之后的数据结构都是1字节对齐。在我加上了#pragma pack ()之后程序就没有进HardFault_Handler中断了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值