STM32--内存对齐
来自帖子 http://www.amobbs.com/forum.php?mod=viewthread&tid=5600177
举例吧:
u8 array[n]; // 这是1字节对齐的,与n取值无关。
u16 array[n]; // 这是2字节对齐的,与n取值无关。
u32 array[n]; // 这是4字节对齐的,与n取值无关。
你把u16型数组的长度改为256可用,那仅仅是连接器的偶然,知识要严谨不能依赖偶然;既然整个数组的起始地址不能保证是4字节对齐,你在此数组的52索引处也同样不能保证4字节对齐。
而你定义的结构体必须4字节对齐,因为其成员是float类型。
keil mdk中,你要查看一下__align()的用法,这是解决你问题的关键字;
iar ewarm中,你查看一下#pragma data_alignment的用法,这是解决你的问题的关键;
楼主依据以上知识点去实验,了解对齐的知识;真理不怕检验。
只能说楼主的知识储备不过关,不怪编译器不行。
float型数据是4字节的,但你定义u16的数组,要对齐完全靠运气,如果换成u32,那就不会有对不齐的问题了。
stm32的密集存储节省了不少内存呢,arm9不管u8、u16还是u32,都是要占用4字节的空间,地址值是能被4整除的。
或者,你把结构体和你的数组用一个共用体包起来,就不担心对齐的问题了,这样保证数组的开始的地址是能被4整除的。
浙公网安备 33010602011771号