1、數據大小或長度相關性
C程序庫所提供的“sizeof()”函數是一個很好的可移植的功能接口範例,對於不同的嵌入式系統的編譯環境或平臺,某些數據類型的大小或長度被解析成 不一樣的結果,而在程序體中,對這些數據類型的訪問有十分嚴格的要求。所以在這種情況下,對這些數據類型的定義必須考慮到在不同環境的共享,也就是說,數 據類型的定義將成爲可移植的數據接口。例如,程序中可能有對8位、16位和32位的整數類型數據的訪問的要求,爲了增加程序代碼的可移植性,慣常的做法是 把這些整數以全局類型定義在某個H頭文件中。例如:
typedef signed char INT8;
typedef unsigned char UINT8;
typedef signed int INT16;
typedef unsigned int UINT16;
typedef signed long INT32;
typedef unsigned long UINT32;
2、字節位序
不同的CPU,例如PowerPC和Inter X86系列,對於字節順序的解析是完全相反的。也就是說,對於高字節在前面還是低字節在前面,它們的處理方法是截然不同的。這是又CPU內部寄存器的存儲 和訪問機制決定的,也就是我們常說的大端模式和小端模式。這樣的特點對程序中的字節和位操作將會有相當大的影響,所以可移植性編程應該將涉及位操作的程序 設計成僅僅與固定的位序相關,變量或類型同樣也定義成與CPU相關的數據接口,例如:
typedef struct{
#if LittleEndian
word hiword;
word loword;
#else
word loword;
word hiword;
#endif
} DWord;
3、位操作
在嵌入式系統開發中,基於存儲空間的限制,我們經常利用位來表示某些設備或操作的狀態,也就是說,位操作是一種使用十分頻繁並高效的操作。同樣位序也和CPU相關,所以習慣上將位的定位定義爲一些宏,從而提高它們的可移植性。例如:
#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80
4、對齊
對齊同樣與CPU緊密相關,有些微處理器定義和要求嚴格的8位、16位或32位對齊,也就是說,對存儲地址的訪問或數據的讀寫必須以8位、16位或32位 方式對齊,這樣可能產生誤操作,從而導致系統的不穩定或崩潰。因此,在可移植性編程中,應該對涉及此類操作的函數定義爲可移植的接口函數。