中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > C語言嵌入式系統(tǒng)編程修煉之性能優(yōu)化篇

        C語言嵌入式系統(tǒng)編程修煉之性能優(yōu)化篇

        ——
        作者: 時間:2006-12-19 來源: 收藏

        使用宏定義

          在中,宏是產生內嵌代碼的唯一方法。對于系統(tǒng)而言,為了能達到性能要求,宏是一種很好的代替函數(shù)的方法。

          寫一個"標準"宏MIN ,這個宏輸入兩個參數(shù)并返回較小的一個:

          錯誤做法:

        #define MIN(A,B)  ( A <= B ? A : B )

          正確做法:

        #define MIN(A,B) ((A)<= (B) ? (A) : (B) )

          對于宏,我們需要知道三點:

          (1)宏定義"像"函數(shù);

          (2)宏定義不是函數(shù),因而需要括上所有"參數(shù)";

          (3)宏定義可能產生副作用。

          下面的代碼:

        least = MIN(*p++, b);

          將被替換為:

        ( (*p++) <= (b) ?(*p++):(b) )

          發(fā)生的事情無法預料。

          因而不要給宏定義傳入有副作用的"參數(shù)"。

        使用寄存器變量

          當對一個變量頻繁被讀寫時,需要反復訪問內存,從而花費大量的存取時間。為此,提供了一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要訪問內存,而直接從寄存器中讀寫,從而提高效率。寄存器變量的說明符是register。對于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內反復使用的變量均可定義為寄存器變量,而循環(huán)計數(shù)是應用寄存器變量的最好候選者。

          (1) 只有局部自動變量和形參才可以定義為寄存器變量。因為寄存器變量屬于動態(tài)存儲方式,凡需要采用靜態(tài)存儲方式的量都不能定義為寄存器變量,包括:模塊間全局變量、模塊內全局變量、局部static變量;

          (2) register是一個"建議"型關鍵字,意指程序建議該變量放在寄存器中,但最終該變量可能因為條件不滿足并未成為寄存器變量,而是被放在了存儲器中,但編譯器中并不報錯(在C++語言中有另一個"建議"型關鍵字:inline)。

          下面是一個采用寄存器變量的例子:

        /* 求1+2+3+….+n的值 */
        WORD Addition(BYTE n)
        {
         register i,s=0;
         for(i=1;i<=n;i++)
         
         return s;
        }

          本程序循環(huán)n次,i和s都被頻繁使用,因此可定義為寄存器變量。

        內嵌匯編

          程序中對時間要求苛刻的部分可以用內嵌匯編來重寫,以帶來速度上的顯著提高。但是,開發(fā)和測試匯編代碼是一件辛苦的工作,它將花費更長的時間,因而要慎重選擇要用匯編的部分。

          在程序中,存在一個80-20原則,即20%的程序消耗了80%的運行時間,因而我們要改進效率,最主要是考慮改進那20%的代碼。

          C程序中主要使用在線匯編,即在C程序中直接插入_asm{ }內嵌匯編語句:

        /* 把兩個輸入參數(shù)的值相加,結果存放到另外一個全局變量中 */
        int result;
        void Add(long a, long *b)
        {
         _asm
         {
          MOV AX, a
          MOV BX, b
          ADD AX, [BX]
          MOV result, AX
         }
        }

        利用硬件特性

          首先要明白CPU對各種存儲器的訪問速度,基本上是:

        CPU內部RAM > 外部同步RAM > 外部異步RAM > FLASH/ROM

          對于程序代碼,已經被燒錄在FLASH或ROM中,我們可以讓CPU直接從其中讀取代碼執(zhí)行,但通常這不是一個好辦法,我們最好在系統(tǒng)啟動后將FLASH或ROM中的目標代碼拷貝入RAM中后再執(zhí)行以提高取指令速度;

          對于UART等設備,其內部有一定容量的接收BUFFER,我們應盡量在BUFFER被占滿后再向CPU提出中斷。例如計算機終端在向目標機通過RS-232傳遞數(shù)據(jù)時,不宜設置UART只接收到一個BYTE就向CPU提中斷,從而無謂浪費中斷處理時間;

          如果對某設備能采取DMA方式讀取,就采用DMA讀取,DMA讀取方式在讀取目標中包含的存儲信息較大時效率較高,其數(shù)據(jù)傳輸?shù)幕締挝皇菈K,而所傳輸?shù)臄?shù)據(jù)是從設備直接送入內存的(或者相反)。DMA方式較之中斷驅動方式,減少了CPU 對外設的干預,進一步提高了CPU與外設的并行操作程度。

        活用位操作

          使用的位操作可以減少除法和取模的運算。在計算機程序中數(shù)據(jù)的位是可以操作的最小數(shù)據(jù)單位,理論上可以用"位運算"來完成所有的運算和操作,因而,靈活的位操作可以有效地提高程序運行的效率。舉例如下:

        /* 方法1 */
        int i,j;
        i = 879 / 16;
        j = 562 % 32;
        /* 方法2 */
        int i,j;
        i = 879 >> 4;
        j = 562 - (562 >> 5 << 5);

          對于以2的指數(shù)次方為"*"、"/"或"%"因子的數(shù)學算,轉為移位運算"<< >>"通??梢蕴岣咚惴ㄐ省R驗槌顺\算指令周期通常比移位運算大。

          C語言位運算除了可以提高運算效率外,在系統(tǒng)的中,它的另一個最典型的應用,而且十分廣泛地正在被使用著的是位間的與(&)、或(|)、非(~)操作,這跟嵌入式系統(tǒng)的特點有很大關系。我們通常要對硬件寄存器進行位設置,譬如,我們通過將AM186ER型80186處理器的中斷屏蔽控制寄存器的第低6位設置為0(開中斷2),最通用的做法是:

        #define INT_I2_MASK 0x0040
        wTemp = inword(INT_MASK);
        outword(INT_MASK, wTemp &~INT_I2_MASK);

          而將該位設置為1的做法是:

        #define INT_I2_MASK 0x0040
        wTemp = inword(INT_MASK);
        outword(INT_MASK, wTemp | INT_I2_MASK);

          判斷該位是否為1的做法是:

        #define INT_I2_MASK 0x0040
        wTemp = inword(INT_MASK);
        if(wTemp & INT_I2_MASK)
        {
        … /* 該位為1 */
        }

          上述方法在嵌入式系統(tǒng)的中是非常常見的,我們需要牢固掌握。


          在性能優(yōu)化方面永遠注意80-20準備,不要優(yōu)化程序中開銷不大的那80%,這是勞而無功的。

          宏定義是C語言中實現(xiàn)類似函數(shù)功能而又不具函數(shù)調用和返回開銷的較好方法,但宏在本質上不是函數(shù),因而要防止宏展開后出現(xiàn)不可預料的結果,對宏的定義和使用要慎而處之。很遺憾,標準C至今沒有包括C++中inline函數(shù)的功能,inline函數(shù)兼具無調用開銷和安全的優(yōu)點。

          使用寄存器變量、內嵌匯編和活用位操作也是提高程序效率的有效方法。

          除了編程上的技巧外,為提高系統(tǒng)的運行效率,我們通常也需要最大可能地利用各種硬件設備自身的特點來減小其運轉開銷,例如減小中斷次數(shù)、利用DMA傳輸方式等。

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


        關鍵詞: C語言 編程 嵌入式

        評論


        相關推薦

        技術專區(qū)

        關閉