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

2021-04-12 21:15:29 字數 1495 閱讀 3374

多數情況下,編寫完全可移植的程式**是不可能的。因為同樣的資料型別在不同的編譯環境下所產生的結果(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 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位方式對齊,這樣可能產生誤操作,從而導致系統的不穩定或崩潰。因此,在可移植性程式設計中,應該對涉及此類操作的函式定義為可移植的介面函式。

嵌入式命令列操作(可移植性)

本文件基於stm32f103並移植到f407,msp430,以及s3c2440 最終效果如下 以上多餘列印是除錯時解析bug用的,可以去除。typedef void cli handler struct cmd tbl s typedef struct cmd tbl s cmd tbl t def...

記錄一些嵌入式筆試要點

1 sizeof 字串 有包含 0 而strlen 字串 不包含 0 2 sizeof 對這3種定義的區別在下面的小 中。3 strlen 對這3種定義的結果都是一樣的。如下 include include intmain 小結 sizeof 結果不一樣的原因 1 a和b都是字元陣列,a的大小在賦值...

一些嵌入式知識點

預處理器 preprocessor 1 用預處理指令 define 宣告乙個常數,用以表明1年中有多少秒 忽略閏年問題 define seconds per year 60 60 24 365 ul 我在這想看到幾件事情 define 語法的基本知識 例如 不能以分號結束,括號的使用,等等 懂得預處...