新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM優化之結構體的定義

        ARM優化之結構體的定義

        作者: 時間:2016-11-11 來源:網絡 收藏
        偶然的一次發現,看到自己定義的結構體編譯出來的大小和我想象的不一樣,于是便追溯了一下根源。做了一系列實驗之后發現,ARM的結構體的內存分配上有著一些固有的做法。廢話不多說,看例子。

        實驗一:

        本文引用地址:http://www.104case.com/article/201611/316811.htm

        我定義一個結構體:

        typedef struct TestStruct

        {

        unsinged char Test1;

        unsigned int Test2;

        unsigned char Test3;

        unsigned int Test4;

        unsigned short Test5;

        }TEST_STRUCT;

        TEST_STRUCT TestStruct1;

        然后我分別給這些成員都賦值,以便于在Memory里面觀察。

        TestStruct1.Test1 = 0x11;

        TestStruct1.Test2 = 0x22334455;

        TestStruct1.Test3 = 0x66;

        TestStruct1.Test4 = 0x778899AA;

        TestStruct1.Test5 = 0xBBCC;

        然后我調用了sizeof函數來計算這個結構體的大小

        sizeof(TestStruct1)

        發現大小是20個Byte。而我原先預計的大小為1+4+1+4+2=12個Byte。

        于是我利用AXD的內存監控查看了這段內存的分配(Little Endian),如下:

        0x01,0x00,0x00,0x00,0x55,0x44,0x33,0x22,0x66,0x00,0x00,0x00,0xAA,0x99,0x88,0x77

        0xCC,0xBB,0x00,0x00

        發現ARM在編譯的時候把原先不足Word長度的擴展成了Word長度。

        實驗二:

        后來想到,可能ARM這么做是為了不破壞結構體的結構。于是把結構體改成了:

        typedef struct TestStruct

        {

        unsinged char Test1;

        unsigned char Test3;

        unsigned short Test5;

        unsigned int Test2;

        unsigned int Test4;

        }TEST_STRUCT;

        再次調用sizeof,發現大小變成了12個Byte,符合了原先預計的大小。

        再監控內存分配,如下:

        0x01,0x06,0xCC,0xBB,0x55,0x44,0x33,0x22,0xAA,0x99,0x88,0x77

        由此發現,原本松散的內存變得如此的緊湊。

        實驗三:

        隨后,又猜想,這樣是否真的可以縮小內存損耗呢?ARM會不會在結構體的中間插入別的變量呢。

        于是做了一個實驗,建立了三個BYTE大小的變量。

        unsigned char TestData0 = 0xDD;

        unsigned char TestData1 = 0xEE;

        unsigned char TestData2 = 0xFF;

        然后結構體恢復成實驗一的狀態,監控了下內存,發現變成了:

        0x01,0x00,0x00,0x00,0x55,0x44,0x33,0x22,0x66,0x00,0x00,0x00,0xAA,0x99,0x88,0x77

        0xCC,0xBB,0x00,0x00,0xDD,0xEE,0xFF

        看來ARM并沒有在松散的結構體中插入別的變量。

        實驗四:

        利用了自己的一個大的工程,200K左右的RO以及80K左右的RW+ZI,做了一下優化,發現效果明顯,RW+ZI縮減了不少。

        最后,想到了ADS里面的編譯選項,三個級別的優化以及For time/For spce選項都不能改變這個結果。

        結論:(本文基于ARM7TDMI)

        ARM中結構體的成員的寫法可以決定最后的耗用內存的大小,適當的優化可以節省大量寶貴的RAM。



        關鍵詞: ARM優化結構

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 炉霍县| 聊城市| 安达市| 驻马店市| 准格尔旗| 翁源县| 瑞昌市| 上林县| 和田县| 宁陵县| 增城市| 墨玉县| 基隆市| 滦平县| 扬中市| 驻马店市| 田阳县| 九寨沟县| 云林县| 黄陵县| 渝北区| 宁陵县| 文水县| 孝义市| 聂荣县| 揭西县| 衡阳县| 明星| 深圳市| 乌海市| 修文县| 杭锦后旗| 新津县| 肃北| 嘉定区| 鹤壁市| 拉萨市| 古交市| 巢湖市| 汉源县| 六盘水市|