很久很久没有记录过debug了,今天有空就正好记录一下
嵌入式开发,stm32F407的MCU的开发板。
遇到如下问题:
变量的地址竟然为奇数!!!导致程序运行到写入该地址的数据时,发生HardFault!
程序运行到断点位置就会进入hardFault,如图所示
师傅告诉我:这个地址是奇数有问题啊!要注意字节对齐!!!
STM32出现硬件错误可能有以下原因:
(1)数组越界操作;
(2)内存溢出,访问越界;
(3)堆栈溢出,程序跑飞;
(4)中断处理错误;
首先疑问,为什么指针是奇数的操作(例如复制之类的),一操作就会HardFault呢?
参考链接: https://bbs.csdn.net/topics/120017042
参考链接 :https://www.cnblogs.com/getyoulove/p/3678768.html
【从奇数边界去访问unsignedshort型变量,显然不符合对齐的规定。 在x86上,类似的操作只会影响效率,但是在MIPS或者sparc上,可能就是一个error,因为它们要求必须字节对齐.】
查了些资料感觉并没有解决什么实质性问题,感觉这个问题的根本原因涉及到编译器、汇编等深层的东西,有点深,暂时略过点,之后有空了再多查查资料补充吧。
说下我的理解:
就是ARM不可以读取奇数地址!(简单粗暴的结论)
最后解决bug办法:
将程序里的出现奇数地址的结构体1字节对齐删除,不按照一字节对齐。(当时我也是手贱,拿到demo程序后将所有的结构体全部按照1字节对齐了,结果就出现问题了....)