在ADS环境下,结构体字节对齐的方法

ADS 环境下,有“ ALIGN 、“ __align(x) 、“ __packed ”关键字用于字节对齐处理。 ALIGN 用于汇编语言, __align(x) 用于 C 语言, __packed 用于不使用字节对齐。

预编译指令 #pragma pack(X)不行

 可以
直接在定义前用type qualifier __align()
eg:

__align(4) struct{
      int i;
      char c;
};
4字节对齐,占8字节。

__pack关键字反而是"打包"的意思,表示不使用字节对齐
__packed struct{
      int i;
      char c;
};
仅占5字节

情参考下边文章

http://blog.21ic.com/user1/516/33973.html

 http://hi.baidu.com/%CE%F7204/blog/item/0bc9e10326dea2ed08fa9308.html

http://blog.csdn.net/panqihe/archive/2007/10/13/1822807.aspx

ARM 数据对齐   -----  ADS1.2 编译

 

一、        问题来源 <!--[endif]-->

且看下面一段代码:

char    buff[8] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xab, 0xbc, 0xcd};

int      v32, *p32;

short   v16, *p16;

p32 = (int*)&( buff[1] );  

p16 = (short*)&( buff[1] ); 

v32 = *p32; 

v16 = *p16; 

我们来看看在ADS1.2 编译后,执行的结果如下:

v32 = 0x12785634

v16 = 0x1234

不管数据模式是大端结构,还是小端结构,结果都不对。

 

二、 分析原因 <!--[endif]-->

默认情况下, ADS 编译器使用的是数据类型的自然边界对其方式。数据的自然对其方式是指:如果该数据类型是 n 个字节的,那么该数据类型就按 n 字节对齐。例如:

    1. Usigned char 1 字节的,那么数据就按 1 字节对齐。

定义两个变量如下: usigned char  a08,b08;

如果 a08 所在的地址为, 0x80000002 ,则 b08 所在的地址为 0x80000003 ,两个变量是连续分配的。

    2 Usigned short 2 字节的,那么数据就按 2 字节对齐。

              定义两个变量如下: usigned char   a08;

                           Usigned short  a16;

如果 a08 所在的地址为 0x80000002 ,那么 a16 所在的地址为 0x80000004 a16 不会分配到 0x80000003 ,默认情况下,编译器为 usigned short 类型的变量分配到 2 的倍数的地址处。

    2 usigned long 4 字节的,那么数据就按 4 字节对齐。

              定义两个变量如下: usigned char   a08;

                           Usigned long    a32

            如果 a08 所在的地址为 0x80000005 ,那么 a16 所在的地址为 0x80000008 a32 不会分配到 0x80000006 ,默认情况下,编译器为 usigned long 类型的变量分配到 4 的倍数的地址处。

 

三、 解决办法 <!--[endif]-->

  如果我们想要让编译器不使用自然边界对齐,让任何类型的变量都紧接着上一变量的地址进行分配,可以使用 __packed 关键字。

       (未完)

 

 

 

四、 使用 __packed 的注意事项 <!--[endif]-->

1 __packed 对局部变量无效。

2 、声明为 __packed 的变量,必须使用 __packed 的指针变量来指向其地址。

   如:

      __packed  u16  u16a;

      __packed  u16  *pu16;

      pu16 = (u16 *)&u16a;

3 、声明为 __packed 的结构

      声明为 __packed 的结构仅仅

4 、声明为 __packed 的结构变量

 

五、 后记 <!--[endif]-->

以上内容未经测试,由 ADS 编译器手册及相关资料理解总结所得。

不建议使用 __packed 来节省数据大小,因为这需要付出减低执行效率和浪费代码空间的代价。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值