新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 高效率嵌入式程序開發技巧

        高效率嵌入式程序開發技巧

        作者: 時間:2009-07-20 來源:網絡 收藏

        通常,工程師總是竭力避免使用冗余變量,以精簡程序。一般情況下這樣做是正確的,但是也有例外,如下所示:
        int f(void);
        int g(void);
        file://f()和g()不訪問全局變量errs
        int errs; file://全局變量
        void test1(void)
        { errs += f();
        errs += g();
        }
        void test2(void)
        { int localerrs = errs;
        // 定義冗余的局部變量
        localerrs += f();
        localerrs += g();
        errs = localerrs;
        }
        在第一種情況test1()里,每次訪問全局變量errs時都要先從相應的存儲器下載到寄存器里,經f()或g()函數調用后再存儲回原來的存儲器里面。在該例子中,一共要進行兩次這樣的下載/存儲操作。而在第二種情況test2()里,局部變量localerrs被分配以寄存器,這樣一來,整個函數就只需要一次下載/存儲全局變量存儲器了。盡量節省存儲器訪問的次數,對于提高系統性能非常有用。

        循環程序的處理
        計數循環是程序中常用的流程控制結構。在C中,類似下面的for循環比比皆是:
        for(loop=1;loop=limit;loop++)

        這種累加計數的方法符合一般的自然思維習慣,所以比下面的遞減計數方法使用更多:
        for(loop=limit;loop!=0; loop--)
        這兩者在邏輯上并沒有效率差異,但是映射到具體的體系結構中,就產生了很大的不同。

        累加法比遞減法多用了一條指令,當循環次數比較多的時候,這兩段代碼就會在性能上產生明顯的差異。分析其本質原因,在于當進行一個非零常數比較時,必須用專門的CMP指令來執行;而當一個變量與零進行比較時,ARM指令可以直接利用條件執行的特性(NE)來進行判斷。很多時候循環展開由編譯器自動完成,不過應注意對中間變量或結果被更改的循環,編譯程序往往拒絕展開,這時候就需要工程師自己來做展開工作了。

        尤其值得注意的是,在有內部指令cache的CPU上(如ARM946ES芯片),因為循環展開的代碼很大,往往會出現高速緩沖存儲器溢出。這時展開的代碼會頻繁地在CPU的高速緩沖存儲器和內存之間來回調用,又因為高速緩沖存儲器速度很高,所以此時循環展開反而會變慢。同時,循環展開會影響矢量運算優化。

        ARM處理器核對NZ(零比較轉移)有特別的指令處理,速度非???,如果你的循環對方向不敏感,可以由大向小循環。需要注意的是,如果指針操作使用了i值,這種方法可能引起指針索引超界的嚴重錯誤(i = MAX+1)。當然你可以通過對i做加減運算來糾正,但是如果這樣就沒有提的作用了。

        結語
        本文對ARM總結了一些編程。在實際的系統開發中,可以大大的提高系統的性能,特別是在多媒體和通信等復雜度高的應用中,對程序設計具有指導意義。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 葫芦岛市| 金华市| 衡南县| 徐州市| 绥化市| 北流市| 焦作市| 大方县| 怀宁县| 灵丘县| 德江县| 政和县| 尼勒克县| 大方县| 乐安县| 和静县| 常德市| 昌吉市| 靖江市| 祁东县| 贵德县| 明光市| 沅陵县| 仁布县| 门头沟区| 南通市| 临邑县| 平邑县| 卫辉市| 铜陵市| 贵溪市| 龙井市| 天门市| 南澳县| 上高县| 紫阳县| 渝中区| 武川县| 礼泉县| 嘉兴市| 日喀则市|