<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > C語(yǔ)言編程---性能優(yōu)化

C語(yǔ)言編程---性能優(yōu)化

——
作者: 時(shí)間:2007-04-26 來(lái)源: 收藏
使用宏定義

  在中,宏是產(chǎn)生內嵌代碼的唯一方法。對于嵌入式系統而言,為了能達到性能要求,宏是一種很好的代替函數的方法。

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

  錯誤做法:

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

  正確做法:

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

  對于宏,我們需要知道三點(diǎn):

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

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

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

  下面的代碼:

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

  將被替換為:

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

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

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

  使用寄存器變量

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

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

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

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

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

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

  內嵌匯編

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

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

  嵌入式C程序中主要使用在線(xiàn)匯編,即在C程序中直接插入_asm{ }內嵌匯編語(yǔ)句:

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

  利用硬件特性

  首先要明白CPU對各種存儲器的訪(fǎng)問(wèn)速度,基本上是:

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

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

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

  如果對某設備能采取DMA方式讀取,就采用DMA讀取,DMA讀取方式在讀取目標中包含的存儲信息較大時(shí)效率較高,其數據傳輸的基本單位是塊,而所傳輸的數據是從設備直接送入內存的(或者相反)。DMA方式較之中斷驅動(dòng)方式,減少了CPU 對外設的干預,進(jìn)一步提高了CPU與外設的并行操作程度。

  活用位操作

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

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

  對于以2的指數次方為"*"、"/"或"%"因子的數學(xué)運算,轉化為移位運算"<< >>"通??梢蕴岣咚惴ㄐ?。因為乘除運算指令周期通常比移位運算大。

  C語(yǔ)言位運算除了可以提高運算效率外,在嵌入式系統的編程中,它的另一個(gè)最典型的應用,而且十分廣泛地正在被使用著(zhù)的是位間的與(&)、或(|)、非(~)操作,這跟嵌入式系統的編程特點(diǎn)有很大關(guān)系。我們通常要對硬件寄存器進(jìn)行位設置,譬如,我們通過(guò)將AM186ER型80186處理器的中斷屏蔽控制寄存器的第低6位設置為0(開(kāi)中斷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 */
}

  上述方法在嵌入式系統的編程中是非常常見(jiàn)的,我們需要牢固掌握。

  總結

  在性能方面永遠注意80-20準備,不要程序中開(kāi)銷(xiāo)不大的那80%,這是勞而無(wú)功的。

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

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

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


關(guān)鍵詞: C語(yǔ)言 優(yōu)化

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>