关于单片机的内存对齐问题

zhoushunda960 2012-02-27 04:04:46
在使用C语言编写单片机程序时,是否要考虑内存对齐?如果有内存对齐,请问是几字节对齐?在哪可以调整?
...全文
190 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmxqiyan 2012-02-28
51是8位单片机,不用考虑字节对齐。现在单片机中要求字节对齐的主要是ARM等32位单片机,它的寻址是以字(4字节)方式,可以去网上找一下ARM字节对齐来了解一下。
回复
Simality 2012-02-27
通常是以结构体中位宽最大的数据为基本步长来对齐。至于C51里面怎么搞,你可以做个实验。

首先定义一个足够大的数组
u8 Array[];

然后定义一个存储大小的变量
u8 Count;

然后定义一个混合结构体
struct
{
u8 DataByte;
u16 DataWord16;
u32 DataWord32;
}DataStruct;

想看看结构体有没有padding,用Count = sizeof(DataStruct)读一下,如果是12那就是有padding,按照u32对齐的。

想看填充在什么位置,先对结构体内的数据赋值,然后用指针把结构体内所有字节读入数组里输出看一看。如果有仿真,直接在仿真环境里查看内存地址上的数据。
回复
zhoushunda960 2012-02-27
我采用的是51核的8位单片机,应该是大端的,使用的keil的编译器。

我就是用在结构体定义上。请问是几字节对齐?我记得内存字节对齐取决于cpu寄存器长度,51核的基本上是8位的寄存器,是不是不存在内存对齐问题?
回复
Simality 2012-02-27
LZ说的是结构体内部的对齐吗?别的位置我没遇到过,结构体内部有。

我说的这个对齐方式取决于编译器,并非所有编译器都支持用伪指令更改对齐设置。写个验证小程序用指针读出结构体内容即可观察内嵌的对齐方式与大小端结构。如果不能修改对齐方式,记住默认的对齐方式即可,通常默认的都是效率最高的。
回复
发动态
发帖子
单片机/工控
创建于2007-09-28

2.6w+

社区成员

硬件/嵌入开发 单片机/工控
申请成为版主
社区公告
暂无公告