嵌入式可移植性編程的一些例子

多數情況下,編寫完全可移植的程序代碼是不可能的。因爲同樣的數據類型在不同的編譯環境下 所產生的結果(OBJ代碼)可能是不同的,特別是針對嵌入式系統,不同的運行平臺可能要求不同的代碼來實現它所要求的獨特功能。爲了增加程序代碼可移植到 多個平臺的可行性,比較好的方法是提供一個可移植的數據或功能接口,讓那些移植的部分隱藏在這些接口之後,當然,這樣的事情應該全部是系統設計的工作。下 面介紹有關可移植性編程的一些常規做法:
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位 方式對齊,這樣可能產生誤操作,從而導致系統的不穩定或崩潰。因此,在可移植性編程中,應該對涉及此類操作的函數定義爲可移植的接口函數。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章