新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 淺談51單片機內存優化

        淺談51單片機內存優化

        作者: 時間:2013-05-08 來源:網絡 收藏

        對 51 單片機內存的認識,很多人有誤解,最常見的是以下兩種:

        ① 超過變量128后必須使用compact模式編譯

        實際的情況是只要內存占用量不超過 256.0 就可以用 small 模式編譯

        ② 128以上的某些地址為特殊寄存器使用,不能給程序用

        與 PC 機不同,51 單片機不使用線性編址,特殊寄存器與 RAM 使用重復的重復的地址。但訪問時采用不同的指令,所以并不會占用 RAM 空間。

        由于內存比較小,一般要進行,盡量提高內存的使用效率。

        以 Keil C 為例,small 模式下未指存儲類型的變量默認為data型,即直接尋址,只能訪問低 128 個字節,但這 128 個字節也不是全為我們的程序所用,寄存器 R0-R7必須映射到低RAM,要占去 8 個字節,如果使用寄存組切換,占用的更多。

        所以可以使用 data 區最大為 120 字節,超出 120 個字節則必須用 idata 顯式的指定為間接尋址,另外堆棧至少要占用一個字節,所以極限情況下可以定義的變量可占 247 個字節。當然,實際應用中堆棧為一個字節肯定是不夠用的,但如果嵌套調用層數不深,有十幾個字節也夠有了。

        為了驗上面的觀點,寫了個例子

        #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;

        }

        }

        可以計算 R0-7(8) + tt1(120) + tt2(127) + SP(1) 總共 256 個字節

        keil 編譯的結果如下:

        Program Size: data=256.0 xdata=0 code=30

        creating hex file from "./Debug/Test"...

        "./Debug/Test" - 0 Error(s), 0 Warning(s).

        (測試環境為 XP + Keil C 7.5)

        這段代碼已經達到了內存分配的極限,再定義任何全局變量或將數組加大,編譯都會報錯 107

        這里要引出一個問題:為什么變量 i、j 不計算在內?

        這是因為 i、j 是局部變量,會試著將其優化到寄存器 Rx 或棧。問題也就在這了,如果局部變量過多或定義了局部數組,無法將其優化,就必須使用 RAM 空間,雖然全局變量的分配經過精心計算沒有超出使用范圍,仍會產生內存溢出的錯誤!

        而編譯器是否能成功的優化變量是根據代碼來的


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 肥乡县| 榆社县| 博罗县| 嫩江县| 临泉县| 常山县| 黔西县| 安徽省| 宁乡县| 维西| 嵩明县| 花莲市| 拜泉县| 若尔盖县| 阿合奇县| 准格尔旗| 贵溪市| 绍兴县| 交城县| 锡林郭勒盟| 饶平县| 湖州市| 舒兰市| 镇原县| 上林县| 盘山县| 汉中市| 彭州市| 星子县| 瑞安市| 太保市| 南澳县| 离岛区| 石家庄市| 温宿县| 洪洞县| 建昌县| 五河县| 平原县| 修武县| 大新县|