现在位置:首页 >> ARM基础学习 >> ADS学习
ARM数据对齐  -----  ADS1.2编译
作者:phantom 时间:2009/8/14 文章来源:来自网络

 

一、问题来源

且看下面一段代码:

 

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

 

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

 

 

 

二、分析原因

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

 

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

 

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

 

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

 

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

 

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

 

                           Usigned short  a16;

 

            如果a08