在ads環境下,有「align」、「__align(x)」、「__packed」關鍵字用於位元組對齊處理。align用於組合語言,__align(x)用於c語言,__packed用於不使用位元組對齊。
預編譯指令 #pragma pack(x)不行
可以直接在定義前用type qualifier __align()
eg:__align(4) struct;
4位元組對齊,佔8位元組。
__pack關鍵字反而是"打包"的意思,表示不使用位元組對齊
__packed struct;
僅佔5位元組
arm資料對齊 ----- ads1.2編譯
一、 問題**
且看下面一段**:
char buff[8] = ;
int v32, *p32;
short v16, *p16;
p32 = (int*)&( buff[1] );
p16 = (short*)&( buff[1] );
v32 = *p32;
v16 = *p16;
我們來看看在ads1.2編譯後,執行的結果如下:
v32 = 0x12785634
v16 = 0x1234
不管資料模式是大端結構,還是小端結構,結果都不對。
二、分析原因
預設情況下,ads編譯器使用的是資料型別的自然邊界對其方式。資料的自然對其方式是指:如果該資料型別是n個位元組的,那麼該資料型別就按n位元組對齊。例如:
1.、usigned char 是1位元組的,那麼資料就按1位元組對齊。
定義兩個變數如下: usigned char a08,b08;
如果a08所在的位址為,0x80000002,則b08所在的位址為0x80000003,兩個變數是連續分配的。
2、usigned short 是2位元組的,那麼資料就按2位元組對齊。
定義兩個變數如下: usigned char a08;
usigned short a16;
如果a08所在的位址為0x80000002,那麼a16所在的位址為0x80000004,a16不會分配到0x80000003,預設情況下,編譯器為usigned short型別的變數分配到2的倍數的位址處。
2、usigned long 是4位元組的,那麼資料就按4位元組對齊。
定義兩個變數如下: usigned char a08;
usigned long a32
如果a08所在的位址為0x80000005,那麼a16所在的位址為0x80000008,a32不會分配到0x80000006,預設情況下,編譯器為usigned long型別的變數分配到4的倍數的位址處。
三、解決辦法
(未完)
四、使用__packed的注意事項
1、__packed 對區域性變數無效。
2、宣告為__packed 的變數,必須使用__packed 的指標變數來指向其位址。
如: __packed u16 u16a;
__packed u16 *pu16;
pu16 = (u16 *)&u16a;
3、宣告為__packed 的結構
宣告為__packed 的結構僅僅
4、宣告為__packed 的結構變數
五、後記
以上內容未經測試,由ads編譯器手冊及相關資料理解總結所得。
不建議使用__packed 來節省資料大小,因為這需要付出減低執行效率和浪費**空間的代價。
安裝ADS1 2心得
安裝ads1.2遇到安裝進度條到100 之後停止不動,此時如果你點選關閉和cancal都是不能夠解決問題的,ads還是沒有安裝成功,此時你需要重新安裝,但是安裝之前需要將先前安裝的ads1.2解除安裝乾淨,在控制面板中找到有關ads的程式,將其解除安裝,然後再將自己安裝的檔案路徑下,有關於ads的檔...
ADS1 2初步使用經驗
一般情況是這樣的,在函式b中呼叫函式a,而函式a是在函式b 之後在編寫實現的,在arm development suite中會出現編譯錯誤 解決方法 將函式a剪下到函式b之前就好了 當然,在函式檔案開頭先宣告一次似乎也是可行的,我自己的就試過,沒出錯 這個錯誤是很經常出現的,因為在其他編輯器中編寫 ...
解決ads1 2的破解問題
1.將crackads12.rar解壓後的license.dat檔案分別拷貝的安裝目錄如 c program files arm adsv1 2和c program files arm adsv1 2 licenses兩個目錄下 2.在c盤根目錄下建立flexlm目錄,並將1中的license.da...