参考:华清远见官网的免费下载资源
程序的可移植性考虑
结合嵌入式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的低地址上。通过指向这个地址来获取该地址上的值,从而得知小端模式还是大端模式。