大小端編程注意事項

一般情況下,我們所遇到的都是小端的情況,典型的X86處理器就是小端的。

但是,好多powerpc處理器可以被配置爲大端模式,也可以被配置爲小端模式。所以,經常會出現以前的代碼運行的好好地,到了新板子,或者板子配置

發生了變化,結果就不對了,而且很難調試。因爲根本不會認爲它出錯。

下面就舉個我們代碼中調了好久才發現的問題。

又一個函數:

i2c_write(..., unsigned char *reg, ...)

這裏的reg類型爲一個unsigned char 型的指針,代表i2c設備的寄存器地址。

以前的代碼,在傳參數之前,會聲明一個類型爲int的cTest, 然後做如下調用

i2c_write(..., (unsigned char *)&cTest, ...);

在以前的simba板子上,這樣做沒有出現任何問題。simba是一塊powerpc平臺的MPC8572的板子,當時配置爲小端模式。

是,小端的話這樣看來一般確實不會出現什麼問題。

比如

int cTest = 2;

也就是cTest = 0x00000002, 那麼傳進去的指針指向0x02所在的地址,也就是cTest的地址的最低一位。

現在換成tembo板子,tembo是一塊powerpc平臺的P4080的板子,配置爲大端模式。

仍然是

int cTest = 2;

也就是cTest = 0x00000002, 那麼現在傳進去的指針還指向0x02所在的地址嗎?

很顯然不是!

我們看(unsigned char *)&cTest 這個操作,這個C標準肯定有規定,將得到一個指向&cTest的最低地址的unsigned char型指針。

此時,&cTest的最低位在最高有效位,內容爲0x00,所以,肯定不會得到正確的結果!

就這麼一個小小的問題,花了好久纔得到解決。歸根結底,還是編程習慣導致的。

平常寫代碼太過隨意,也不管什麼平臺,也不注意參數類型,其實,對於參數的定義,類型中的signed 和 unsigned 最好帶上。

因爲不能假設編譯器會認爲char型到底是帶符號還是不帶符號,雖然大多情況下是帶符號的。

還有就是嚴格的參數傳遞,最好需要什麼類型的參數,就定義什麼類型的參數。不要對編譯器做任何假定!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章