新聞中心

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

        淺談51單片機內存優化

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

        上面的代碼中,循環是臃腫的,變量 j 完全不必要,那么將代碼改成

        UCHAR i;

        UCHAR j;

        for(i = 0; i LEN; ++i )

        {

        tt1[i] = 0x55;

        }

        再編譯看看,出錯了吧!

        因為不知道該如何使用 j,所以沒能優化,j 須占 RAM 空間,RAM 就溢出了。

        (智能一點的會自動將這個無用的變量去掉,但這個不在討論之列了)

        另外,對 idata 的定義的變量最好放在 data 變量之后

        對于這一種定義

        uchar c1;

        idata uchar c2;

        uchar c3;

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

        變量優化一般要注意幾點:

        ①讓盡可能多的變量使用直接尋址,提高速度

        假如有兩個單字節的變量,一個長119的字符型數組

        因為總長超過 120 字節,不可能都定義在 data 區

        按這條原則,定義的方式如下:

        data UCHAR tab[119];

        data UCAHR c1;

        idata UCHaR c2;

        但也不是絕的,如果 c1, c2 需要以極高的頻率訪問,而 tab 訪問不那么頻繁

        則應該讓訪問量大的變量使用直接尋址:

        data UCAHR c1;

        data UCHaR c2;

        idata UCHAR tab[119];

        這個是要根據具體項目需求來確定的

        ②提高內存的重復利用率

        就是盡可能的利用局部變量,局部變量還有個好處是訪問速度比較快

        由前面的例子可以看出,局部變量 i, j 是沒有單獨占用內存的

        子程序中使用內存數目不大的變量盡量定義為局部變量

        ③對于指針數組的定義,盡可能指明存儲類型

        盡量使用無符號類型變量

        一般指針需要一個字節額外的字節指明存儲類型

        8051 系列本身不支持符號數,需要外加庫來處理符號數,一是大大降低程序運行效率,二是需要額外的內存

        ④避免出現內存空洞

        可以通過查看輸出符號表文件(.M51)查看

        對前面的代碼,M51文件中關于內存一節如下:

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

        REG 0000H 0008H ABSOLUTE "REG BANK 0"

        DATA 0008H 0078H UNIT ?DT?TEST

        IDATA 0080H 007FH UNIT ?ID?TEST

        IDATA 00FFH 0001H UNIT ?STACK

        第一行顯示寄存器組0從地址0000H開始,占用0008H個字節

        第二行顯示DATA區變量從0008H開始,占用0078H個字節

        第三行顯示IDATA區變量從0080H開始,占用007F個字節

        第四行顯示堆棧從00FFH開始,占0001H個字節

        由于前面代碼中變量定義比較簡單,且連續用完了所有空間,所以這里顯示比較簡單

        變量定義較多時,這里會有很多行

        如果全局變量與局部變量分配不合理,就有可能出現類似下面的行

        0010H 0012H *** GAP ***

        該行表示從0010H開始連續0012H個字節未充分利用或根本未用到

        出現這種情況最常見的原因是局變量太多、多個子程序中的局部變量數目差異太大、使用了寄存器切換但未充分利用。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 师宗县| 南江县| 类乌齐县| 石家庄市| 濉溪县| 正安县| 喀什市| 千阳县| 日喀则市| 永胜县| 卢氏县| 和林格尔县| 吉安市| 万荣县| 大英县| 万全县| 临武县| 松溪县| 庆阳市| 常熟市| 兴山县| 天津市| 石台县| 咸宁市| 贵阳市| 澳门| 芜湖市| 大埔区| 邳州市| 旌德县| 凤凰县| 邓州市| 广州市| 祁东县| 兴宁市| 建瓯市| 崇仁县| 西藏| 潞西市| 新建县| 杭锦后旗|