編寫嵌入式軟件的一個獨特挑戰(zhàn)是,它要求嵌入式開發(fā)人員不僅要理解硬件的微小細節(jié),還要理解他們用來激活硬件的編程語言。有時候,最簡單的概念比人們想象的要復雜得多。在理解C語言中的基本變量類型時尤其如此。
每個程序員都熟悉char、integer、long等常見的變量類型。許多編程語言都包含這些變量類型,但它們不一定代表不同語言之間相同的物理內存空間。事實上,在C編程的嵌入式世界中,用于存儲整數的字節(jié)數會因編譯器和目標平臺而異!任何新的開發(fā)人員都可能認為情況肯定不是這樣,但是看看圖1中三個不同嵌入式微控制器的實驗結果。
圖1–使用Sizeof()獲取存儲每種數據類型的字節(jié)數
這不僅對軟件與內存映射設備的接口方式有非常實際的影響,而且還會影響軟件中計算和其他功能的性能。這也使得幾乎不可能將代碼從一個平臺移植到另一個平臺,使編寫可重用的代碼變得非常困難,但是,從ISO C99開始,嵌入式開發(fā)人員人員的可移植性問題有了一個解決方案。
ISO C99標準通過名為stdint.h的頭文件引入了可移植數據類型。該頭文件包含在編譯器中,創(chuàng)建固定寬度的數據類型。固定寬度數據類型確保8位變量是8位,16位變量是16位,以此類推。這確保了使用這些數據類型的C代碼在不同的平臺上具有相同的寬度!圖2顯示了一些常見的有符號和無符號整數值。
圖2–常見的整數類型
這些只是在stdint.h中定義的變量類型的幾個例子。強烈建議任何開發(fā)人員花一些時間檢查此標頭。有一些非常有用的宏可以用來獲得該數據類型可以存儲的最小值和最大值。這對于初始化變量和代碼中的邊界檢查都很有用。甚至還有int_fast8_t這樣的類型定義,它被定義為最快的8位有符號整數類型。甚至還有至少有一定寬度的類型的定義,比如uint_least16_t。
如果你仍在使用內置的編譯器變量類型char、int、long等,那么這是研究stdint.h并開始編寫代碼的大好時機,你可以編寫一次代碼,然后從此開始移植。請記住,這個頭文件內置在C99中,如果使用的編譯器不是C99或更高版本,可能需要構建自己的stdint.h版本。從長遠來看,這絕對值得嵌入式開發(fā)人員一試!