ADS1 2 記憶體位元組對齊

2021-06-01 09:15:00 字數 1746 閱讀 7732

在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...