新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Keil C51內存分配與優化

        Keil C51內存分配與優化

        作者: 時間:2016-11-28 來源:網絡 收藏

        obj(lib)文件然后經過l51.exe(bl51.exe),就是說把可執行代碼模塊根據連接定位參數地址上連接在一起();數據段也連接在 一起,在ram空間中分配.對ram空間的分配中就有一個連接過程"覆蓋分析".調用一個c函數,就會為這個函數所使用的ram空間進行分配(一些局部變 量),這個函數返回時再回收分配給他的ram空間,根據函數互相之間的調用前后關系,編譯器就可以時實的知道ram空間的使用情況(其中就存在一個函數重 入的問題),作為連接時ram空間分配的參數. 如果源文件中的函數(模塊)從來沒有被任何函數顯示的調用(所謂非顯示調用就是這段代碼,連接器目前還不知道這段代碼什么時候會被調用或是否會被調用), 連接時就會為它分配永遠有效的ram空間(就象全局變量),不會被回收。

        (http://blog.sina.com.cn/s/blog_74ee88b80100pqed.html)

        *******************************************************************

        //程序6

        #include

        #define uint unsigned int

        #define uchar unsigned char

        uchar a;

        uint b;

        uint sum2(uint e,uint f,uint g,uint j)

        {

        uint i;

        i = e+f+g+j;

        return i;

        }

        void main()

        {

        b = sum2(1,2,3,4);

        }

        Program Size: data=20.0 xdata=0 code=58

        TYPEBASELENGTHRELOCATIONSEGMENT NAME

        -----------------------------------------------------

        * * * * * * *D A T AM E M O R Y* * * * * * *

        REG0000H0008HABSOLUTE"REG BANK 0"

        DATA0008H0008HUNIT_DATA_GROUP_

        DATA0010H0003HUNIT?DT?MAIN

        IDATA0013H0001HUNIT?STACK

        **************************************************************

        在上面的程序中如果將sum2中的j去掉,那么data = 12.0。

        通過程序5和6可以看到,兩個程序的M51文件中的藍色部分的segement name的名稱有很大的區別。_DATA_GROUP_是一個OVERALY GROUPS(覆蓋組)。它是鏈接器產生的可覆蓋的一個數據段。而上面的程序5中的?DT?_SUM?MAIN,則是一個函數段。

        在Keil中對OVERALY GROUPS的解釋為:

        When performing overlay analysis, the linker creates groups of segments that are overlaid. The group name indicates the memory type of the variables that it includes.

        Group Name

        Segment
        Prefix

        Memory
        Model

        Description

        _BIT_GROUP_

        ?BI?

        All

        Variables and arguments of typebit.

        _DATA_GROUP_

        ?DT?

        SMALL

        Variables and arguments other thanbit.

        _PDATA_GROUP_

        ?PD?

        COMPACT

        Variables and arguments other thanbit.

        _XDATA_GROUP_

        ?XD?

        LARGE

        Variables and arguments other thanbit.

        When the linker overlays function data memory and creates a group, that groups appears in the linker map files memory map section.

        STARTSTOPLENGTHALIGNRELOCMEMORY CLASSSEGMENT NAME
        ======================================================================
        * * * * * * * * * * *D A T AM E M O R Y* * * * * * * * * * * * *
        000000H000007H000008H---AT..DATA"REG BANK 0"
        000008H00001AH000013HBYTEUNITDATA_DATA_GROUP_
        00001BH00001BH000001HBYTEUNITIDATA?STACK

        Groups are created based on the memory model of the function (which specifies the memory class where parameters and variables are stored) and on any variables defined with a specific memory space.

        在keil生成的M51函數中有OVERLAY MAP OF MODULE,對程序中函數調用的覆蓋有詳細的說明。

        //程序7

        #define LEN 120
        data uchar tt1[LEN];
        idata uchar tt2[127];

        void main()
        {
        uchar i,j;

        for(i = 0;i < LEN; ++i )
        {
        j = i;
        tt1[j] = 0x55;
        }
        }

        變量i和j通過編譯器的優化占用了通用寄存器,R0-8[8]+tt1[120]+tt2[127]+SP[1]共256字節;

        而如果將程序7中j=i刪掉。上面聲明了uchar j,但是下面沒有應用,因此編譯器不知道該如何處理j,就讓其占用了一個RAM空間不再存在通用寄存器中,出現了內存溢出。(有的編譯器會將不用的變量自動刪除)

        局部變量占用通用寄存器,變量在聲明時就被分配了空間;局部變量只有在被聲明、賦值且被使用后才認為是局部變量被放置在通用寄存器中,否則被認為是全局變量;在循環中,R7中放置循環數。(自加)

        由于data區的存取速度快,變量盡量的放在該區,但是由于idata可以訪問整個256字節的RAM,如果data區變量較少,idata型的變量也會占有data區,減少了可直接訪問的存儲空間,因此在變量定義的時候盡量將idata型的變量定義在data型變量后。

        uchar c1;
        idata uchar c2;
        uchar c3;
        變量 c2 肯定會以間接尋址,但它有可能落在 data 區域,就浪費了一個可直接尋址的空間

        變量的優化

        (http://weimenlove.blog.163.com/blog/static/177754732009418105322546/)

        (1)將訪問頻率高的變量放在data區

        (2)提高內存的復用率。盡可能的利用局部變量,由于局部變量的存取速度快。在程序7中可以看到,i和j沒有占用內存,子程序中使用內存數量不大的變量盡量定義為局部變量。

        (3)對于指針數組的定義,盡量指明存儲類型。盡量使用無符號類型變量。8051不支持有符號數計算,需要通過其他的庫來處理,大大降低了運行的速度,增加了內存的利用。

        (4)避免出現內存空洞。在M51中可以很清楚的看到內存的分配情況,如果全局變量和局部變量的分配不合理,有時會出現下面的情況:

        0010H0012H*** GAP ***

        表示從0010開始有0012H個字節未利用。造成這種情況的原因是局變量太多、多個子程序中的局部變量數目差異太大、使用了寄存器切換但未充分利用

        (5)避免出現未使用的變量或者函數。


        上一頁 1 2 下一頁

        關鍵詞: KeilC51內存分

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜丰县| 故城县| 前郭尔| 会宁县| 长武县| 龙里县| 四会市| 莱阳市| 宝坻区| 凤凰县| 平陆县| 星子县| 蕉岭县| 贵德县| 高台县| 阳城县| 偏关县| 永安市| 安阳县| 荣成市| 盘山县| 乌拉特中旗| 丹棱县| 韶山市| 巴林右旗| 太保市| 道孚县| 黄浦区| 沭阳县| 丽江市| 柳江县| 汶上县| 临潭县| 河南省| 固原市| 石林| 海林市| 瓮安县| 大洼县| 鄂伦春自治旗| 玉门市|