嵌入式--程序的可移植性考虑

北战南征 提交于 2019-11-28 22:22:09

参考:华清远见官网的免费下载资源

程序的可移植性考虑

  结合嵌入式Linux 实例来讲解嵌入式开发在可移植性方面需要考虑的问题。

1. 字长和数据类型

  能够由机器一次完成处理的数据称为字,不同体系结构的字长通常会有所区别,例如,现在通用的处理器字长为32 位。在嵌入式Linux中,为解决体系结构不同时的字长问题,存在两种数据类型,a)不透明数据类型 b)长度明确的数据类型 程序中用typedef声明的新类型属不透明数据类型,而int属于长度明确的数据类型。

2. 数据对齐

  对齐是内存数据与内存中的相对位置相关的话题。如果一个变量的内存地址正好是它长度的整数倍,它就被称作是自然对齐的。例如,对于一个32 位(4 个字节)类型的数据,如果它在内存中的地址刚好可以被4 整除(最低两位是0),那它就是自然对齐的。数据对齐的内存在访问时效率要高于数据不对齐的内存。目前大多数体系都会采用数据对齐。编写可移植性高的代码要避免对齐问题,保证所有的类型都能够自然对齐。

3. 字节顺序

  字节顺序是指一个字中各个字节的顺序,有大端模式和小端模式。大端模式是指在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。小端模式是指与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。ARM 体系结构支持大端模式(big-endian)和小端模式(little-endian)两种内存模式。检验字节顺序的方式有强制类型转换和联合体两种方式。以下为强制类型转换方式:

 

1 typedef unsigned char byte;
2 typedef unsigned int word;
3 word u32_Val = 0x87654321;
4 byte u8_Val = *((byte*)&u32_Val);

 

 

 

  小端模式下的运行结果:u8_Val = 0x21

  大端模式下的运行结果:u8_Val = 0x87

  通过把 &u32_Val 强制转换成byte *类型的指针可以直接定位到u32_Val的低地址上。通过指向这个地址来获取该地址上的值,从而得知小端模式还是大端模式。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!