【debug】stm32 指针奇数地址问题导致HardFault

很久很久没有记录过debug了,今天有空就正好记录一下

嵌入式开发,stm32F407的MCU的开发板。

遇到如下问题:

变量的地址竟然为奇数!!!导致程序运行到写入该地址的数据时,发生HardFault!

程序运行到断点位置就会进入hardFault,如图所示

 

师傅告诉我:这个地址是奇数有问题啊!要注意字节对齐!!!

STM32出现硬件错误可能有以下原因:

        (1)数组越界操作;

        (2)内存溢出,访问越界;

        (3)堆栈溢出,程序跑飞;

        (4)中断处理错误;

首先疑问,为什么指针是奇数的操作(例如复制之类的),一操作就会HardFault呢?

参考链接:https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/53942?IAR-What-is-the-problem-of-using-of-address-of-unaligned-structure-member-

参考链接: https://bbs.csdn.net/topics/120017042

参考链接 :https://www.cnblogs.com/getyoulove/p/3678768.html

【从奇数边界去访问unsignedshort型变量,显然不符合对齐的规定。 在x86上,类似的操作只会影响效率,但是在MIPS或者sparc上,可能就是一个error,因为它们要求必须字节对齐.】

查了些资料感觉并没有解决什么实质性问题,感觉这个问题的根本原因涉及到编译器、汇编等深层的东西,有点深,暂时略过点,之后有空了再多查查资料补充吧。

 

说下我的理解:

就是ARM不可以读取奇数地址!(简单粗暴的结论)

 

最后解决bug办法:

将程序里的出现奇数地址的结构体1字节对齐删除,不按照一字节对齐。(当时我也是手贱,拿到demo程序后将所有的结构体全部按照1字节对齐了,结果就出现问题了....)

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值