下面谈到的例子都是在KEIL环境下
问题一:C51,ARM 结构体对齐问题
看到前面有人问如何将变量连续放在内存空间,有很多人说用结构体。让我们看看结构体在51和ARM是怎样的。
typedef struct
{
char b; //1字节
short a; //2字节
}BBB;
unsigned short i;
i=sizeof(BBB);
51(i=3) ARM(i=4) 不一样!51显然是按单字节对齐的,变量都是连续放在内存空间的;ARM按结构体对齐默认规则对齐的,char后面多出了一个空闲字节,显然变量b,a不连续了。 当然了你可以将ARM指定为一个字节对齐,这样变量空间地址就连续了。如下:
#pragma pack(1) //指定一个字节对齐 typedef struct
{
char b;
short a;
}BBB; #pragma pack() //恢复默认对齐方式
结构体对齐规则两条,不想多讲,网上多的是 1. 数据类型的自身对齐值 2.结构体自身对齐值
问题二: int 变量的长度问题 int 在51占2个字节, 在ARM占4个字节 ,最好不用int变量,用short代替
问题三: 字节在内存排序问题 51: 大端模式 ARM: 大多数都是小端,但有的可以大小端选择 在大端存储格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中 在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节
在移植的时候,这个地方是要注意的!
暂时想到的就是这么多,欢迎大家补充!!!(今天上午看了NBA,小皇帝绝杀,真猛呀,哈哈)
|