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

原创 2007年10月13日 10:25:00
 

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

 

一、        问题来源

且看下面一段代码:

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所在的地址为0x80000002,那么a16所在的地址为0x80000004a16不会分配到0x80000003,默认情况下,编译器为usigned short类型的变量分配到2的倍数的地址处。

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

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

                           Usigned long   a32

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

 

三、解决办法

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

       (未完)

 

 

 

四、使用__packed的注意事项

1__packed 对局部变量无效。

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

   如:

      __packed  u16  u16a;

      __packed  u16  *pu16;

      pu16 = (u16 *)&u16a;

3、声明为__packed 的结构

      声明为__packed 的结构仅仅

4、声明为__packed 的结构变量

 

五、后记

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

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

ADS1.2和MDK兼容解决方法

报错如下: 原因: ADS1.2与MDK不兼容   最近安装了Keil 4.73的最新版本,却莫名其妙的出现了与ADS 1.2软件不兼容的情况,弄了半天才弄好,为了大家...
  • faihung
  • faihung
  • 2017年03月02日 19:14
  • 541

ARM平台的地址对齐问题

前言 ARM流行已久,做嵌入式开发的不知道ARM不大可能。鉴于其所具备的较低功耗下的较高性能,也就成了大多数嵌入式设备的首选了。 不过对于刚上手的人来说,有可能会遇到一些稀奇古怪的问题。毕竟大部分...
  • myxmu
  • myxmu
  • 2014年04月14日 23:19
  • 759

对ARM处理器的内存对齐问题(译)

origin: http://blog.csdn.net/xcysuccess3/article/details/8308274 介绍 可以对齐或不对齐的内存访问。对齐的内存访问发生时...
  • yazhouren
  • yazhouren
  • 2016年06月13日 11:04
  • 779

解决ADS1.2与MDK的兼容问题

由于学ARM的需要,我在电脑上安装了ADS1.2软件。今天用MDK5编译stm32程序的时候,发现有部分问题是由ADS软件引起的! 上述问题在于MDK4.6以上就会出现与ADS1.2软件不兼容,环...
  • zhengqijun_
  • zhengqijun_
  • 2017年03月11日 21:40
  • 1039

ADS1.2环境使用过程中遇到的问题及解决方案

问题描述:ADS1.2点击debug进入AXD调试界面,点击全速运行按钮的时候出现如下图提示: 解决方法:在AXD中点击Options—>Configure Processor…,弹出如...
  • woniu3
  • woniu3
  • 2014年03月27日 15:45
  • 1188

关于ARM体系中栈的对齐问题

关于ARM体系中栈的对齐问题-汤权 基于ARM架构的处理器的C语言程序设计遵循ATPCS(ARM-THUMB procedure call standard)和AAPCS(ARM Applicati...
  • tq384998430
  • tq384998430
  • 2016年11月23日 09:55
  • 703

非对齐地址访问问题

ARM,DSP,POWERPC等不支持非对齐地址访问,X86支持非对齐地址访问。   为何要字节对齐?  从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的...
  • zhuzeji
  • zhuzeji
  • 2014年10月31日 10:55
  • 940

基于ADS1.2下的ARM应用开发

1.宏定义中volatile uint8 UINT8等效于unsigned   char,而volatile关键字主要作用是针对变量可能在编译器控制之外被修改的情况,强制让编译器放弃对这个变量的优化...
  • fengmm521
  • fengmm521
  • 2017年11月03日 18:47
  • 42

ARM Linux中的非对齐内存访问(Alignment trap警告的原因)

介绍ARM Linux中进行编程时非对齐内存地址访问时需要注意的问题,以及Alignment trap警告的原因。...
  • jasonchen_gbd
  • jasonchen_gbd
  • 2016年06月04日 22:12
  • 3968

ADS1.2->Keil5的艰辛历程(依然有问题)

1.背景介绍 读研接触到公司的项目,里面使用周立功08年产品,主控芯片是LPC2378,开发环境ADS1.2,使用jlink V8,这些都是07年左右很火的配置,然后现在PC系统都已更新到W...
  • u013371580
  • u013371580
  • 2017年03月25日 15:34
  • 1065
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARM数据对齐 ----- ADS1.2编译
举报原因:
原因补充:

(最多只允许输入30个字)