ARM数据对齐 ----- ADS1.2编译
来源:互联网 发布:java工程师发展方向 编辑:程序博客网 时间:2024/05/16 10:33
ARM数据对齐 ----- ADS1.2编译
一、 问题来源
且看下面一段代码:
char buff[8] = {0x12, 0x34, 0x56, 0x78, 0x
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,两个变量是连续分配的。
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的倍数的地址处。
三、解决办法
如果我们想要让编译器不使用自然边界对齐,让任何类型的变量都紧接着上一变量的地址进行分配,可以使用__packed关键字。
(未完)
四、使用__packed的注意事项
1、__packed 对局部变量无效。
2、声明为__packed 的变量,必须使用__packed 的指针变量来指向其地址。
如:
__packed u16 u
__packed u16 *pu16;
pu16 = (u16 *)&u
3、声明为__packed 的结构
声明为__packed 的结构仅仅
4、声明为__packed 的结构变量
五、后记
以上内容未经测试,由ADS编译器手册及相关资料理解总结所得。
不建议使用__packed 来节省数据大小,因为这需要付出减低执行效率和浪费代码空间的代价。
- ARM数据对齐 ----- ADS1.2编译
- ADS1.2+GNUWinMake编译arm测试工程
- ADS1.2 内存字节对齐
- ads1.2 编译webkit
- ADS ADS1.2 内存字节对齐
- ADS ADS1.2 内存字节对齐
- TX2440 项目实战-2440init.s 祥解 (ADS1.2编译) arm汇编基础学习终结
- ADS1.2进行ARM嵌入式软件开发
- ADS1.2下ARM映像文件
- ADS1.2进行ARM嵌入式软件开发
- 用ADS1.2编译库文件
- ADS1.2编译文件时的问题
- 基于ADS1.2下的ARM应用开发(一)!
- 基于ADS1.2下的ARM应用开发
- ads1.2
- Keil与ADS1.2同时安装,卸载ADS1.2后Keil无法编译
- ADS1.2编译别人的工程出错解决办法
- TX2440 裸跑实验-跑马灯(ADS1.2编译) 入门
- 关闭不必要的进程
- ABAP--SAP UI的发展路线
- HTTP协议
- 每日5条语法,伴你能力考好 No.1
- CPU资源占用100%解决方法
- ARM数据对齐 ----- ADS1.2编译
- 妻子唠叨出来的企业家
- 游戏外挂设计技术探讨①
- 乱码形成原因及其消除方法大全
- 网线的接法
- 每日5条语法,伴你能力考好 No.2
- 游戏外挂设计技术探讨②
- 游戏外挂设计技术探讨③
- 利用Lucene搜索Java源代码