打印

由结构体想到--ARM与51编程注意的地方

[复制链接]
3595|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyboy|  楼主 | 2009-5-23 12:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面谈到的例子都是在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,小皇帝绝杀,真猛呀,哈哈)

相关帖子

沙发
mohanwei| | 2009-5-23 15:36 | 只看该作者

如果不涉及通信,一般不用关注的

涉及通信,可以自己固定采用大端还是小端,另一方可以采用ReadULONG,ReadFLOAT,WriteFLOAT……等自编的函数操作字节流。

使用特权

评论回复
板凳
耕在此行| | 2009-5-23 19:16 | 只看该作者

呵呵 ARM没搞过

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

356

帖子

0

粉丝