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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_15647227/article/details/52404262