基于ARM的高效C語(yǔ)言編程
匯編代碼1:
mov r0,#0
mov r1,#0
add1
add r1,r1,#1
cmp r1,#0x0a
add r0,r1,r0
bcc add1
匯編代碼2:
mov r0,#0
mov r1,#0x0a
add2
subs r1,r1,#1
add r0,r1,r0
bne add2
比較代碼1和代碼2,兩者的功能是相同的,但是代碼2在循環(huán)中少了1條指令。該循環(huán)的執(zhí)行次數(shù)為10次,即在執(zhí)行時(shí)共減少了10條指令。
3.2 內(nèi)聯(lián)函數(shù)的使用
當(dāng)函數(shù)體代碼較少(通常只有一兩條語(yǔ)句),且又被經(jīng)常調(diào)用時(shí),可將它設(shè)為內(nèi)聯(lián)函數(shù)(inline)。對(duì)內(nèi)聯(lián)函數(shù)的調(diào)用類似于宏定義的展開,因此沒(méi)有函數(shù)調(diào)用的開銷(即參數(shù)的傳遞和函數(shù)值的返回),只是增加了被調(diào)用函數(shù)的代碼量。
例如在嵌入式系統(tǒng)中,經(jīng)常訪問(wèn)的外設(shè)端口的讀寫代碼就可以設(shè)成內(nèi)聯(lián)函數(shù),以提高執(zhí)行效率。外設(shè)寄存器的讀寫函數(shù)如下:
inline unsigned short reg_read(unsigned short reg){
return (unsigned short)*(volatile unsigned short *)( reg);//外設(shè)寄存器的讀函數(shù)
}
inline void reg_write(unsigned short reg, unsigned short val){
*(volatile unsigned short *)(reg)=val;//外設(shè)寄存器的寫函數(shù)
}
這兩個(gè)函數(shù)的共同特點(diǎn)是:函數(shù)體的代碼很少,只有1個(gè)語(yǔ)句;使用的局部變量很少,只有1~2個(gè)參數(shù)。由于定義為內(nèi)聯(lián)函數(shù),程序的可讀性較好;在執(zhí)行時(shí)由于沒(méi)有調(diào)用開銷,執(zhí)行效率較高;函數(shù)體很小,在被展開時(shí)空間開銷不大。
結(jié)語(yǔ)
由于嵌入式系統(tǒng)對(duì)存儲(chǔ)空間的限制和實(shí)時(shí)性的需求,在編寫代碼時(shí)必須采用相應(yīng)的方法和原則以減少代碼的空間開銷和時(shí)間開銷。代碼優(yōu)化需要花費(fèi)時(shí)間,并且代碼優(yōu)化后將降低源代碼的可讀性。因此,只有對(duì)經(jīng)常被調(diào)用且對(duì)性能影響較大的函數(shù)進(jìn)行優(yōu)化,才能最有效地優(yōu)化系統(tǒng)。
評(píng)論