ADS ADS1.2 記憶體位元組對齊

來源:互聯網
上載者:User

 

在ADS環境下,有“ALIGN” 、“__align(x)” 、“__packed”關鍵字用於位元組對齊處理。ALIGN用於組合語言,__align(x)用於C語言,__packed用於不使用位元組對齊。

 

 

先行編譯指令 #pragma pack(X)不行

 可以
直接在定義前用type qualifier __align()
eg:

__align(4) struct{
      int i;
      char c;
};
4位元組對齊,佔8位元組。

__pack關鍵字反而是"打包"的意思,表示不使用位元組對齊
__packed struct{
      int i;
      char c;
};
僅佔5位元組

情參考下邊文章

http://blog.21ic.com/user1/516/33973.html

 http://hi.baidu.com/%CE%F7204/blog/item/0bc9e10326dea2ed08fa9308.html

http://blog.csdn.net/panqihe/archive/2007/10/13/1822807.aspx

 

 

 

ARM資料對齊  -----  ADS1.2編譯

 

一、        問題來源<!--[endif]-->

且看下面一段代碼:

char    buff[8] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xab, 0xbc, 0xcd};

int      v32, *p32;

short   v16, *p16;

p32 = (int*)&( buff[1] );  

p16 = (short*)&( buff[1] ); 

v32 = *p32; 

v16 = *p16; 

我們來看看在ADS1.2編譯後,執行的結果如下:

v32 = 0x12785634

v16 = 0x1234

不管資料模式是大端結構,還是小端結構,結果都不對。

 

二、分析原因<!--[endif]-->

預設情況下,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的倍數的地址處。

 

三、解決辦法<!--[endif]-->

  如果我們想要讓編譯器不使用常態範圍對齊,讓任何類型的變數都緊接著上一變數的地址進行分配,可以使用__packed關鍵字。

       (未完)

 

 

 

四、使用__packed的注意事項<!--[endif]-->

1、__packed 對局部變數無效。

2、聲明為__packed 的變數,必須使用__packed 的指標變數來指向其地址。

   如:

      __packed  u16  u16a;

      __packed  u16  *pu16;

      pu16 = (u16 *)&u16a;

3、聲明為__packed 的結構

      聲明為__packed 的結構僅僅

4、聲明為__packed 的結構變數

 

五、後記<!--[endif]-->

以上內容未經測試,由ADS編譯器手冊及相關資料理解總結所得。

不建議使用__packed 來節省資料大小,因為這需要付出減低執行效率和浪費代碼空間的代價。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.