重复:32位类型的指针(如int、uint、float等)指向的地址必须是4字节对齐的(能够被4整除),否则在访问该指针指向的内容时(无论是存还是取)会进入Hard_fault!!!
比如以下代码必然出错:
int *pp=(int *)0x20000002;
int datap=*pp;
INFO("datap=%d",datap);
原因就是pp指针指向的地址不可被4整除;
所以,在实际编程时候一定要注意以下两点:
1.在给32位类型的指针赋值时,一定要注意所赋的值是否是4字节对齐的
2.在将短类型的指针强转成为长类型的指针时(如将8位、16位转换成32位,或将8位转换成16位),一定要注意短类型的指针指向的地址是否是(长类型)字节对齐的,如8-16,则需要是2字节对齐的,8/16-32则需要是4字节对齐的。
以上描述的是字节/内存对齐问题,该问题一般不会出现,但是如果不注意或者没有这个知识点的话,一旦出问题你会相当难以排查,就像我最近遇到的问题一样:
当时问题就是程序莫名进入Hard_fault,最终经过大量的测试定位到是这个函数出了问题,并且是该函数中的fmc_word_program函数出错,但即便是这时(精确定位到了具体函数)也还对于问题的解决毫无头绪,后面我把传入的data指针的值打印出来看了发现不能被4整除,才猜测是否是应该要4字节对齐的,因为fmc_word_program函数是按照字写入的,所以其传入的地址值是否是必须要4字节对齐,然后测试了下果然是这个原因。