在單片機C語(yǔ)言編程中的心得體會(huì )
作者:彭樹(shù)林
在單片機C語(yǔ)言編程中使用恰當的優(yōu)化手段,可以寫(xiě)出簡(jiǎn)潔高效的代碼。以下是筆者在C51編程過(guò)程中的一點(diǎn)心得體會(huì )。
1.盡量使用短的數據類(lèi)型。如uchar、bit、uint,有時(shí)需要對uchar數據類(lèi)型進(jìn)行按位訪(fǎng)問(wèn),可將其定義在bdam區間。慎重使用float數據類(lèi)型,有時(shí)它可以轉化成int數據類(lèi)型來(lái)代用。
2.熟練指針的使用。例如Uint是由雙字節拼接而成,有時(shí)用來(lái)存放16位地址。獲取其高八位和低八位地址的方法為:只要用uchar *p;p=&int0,則*p表示其高八位,*(++p)表示其低八位,非常方便。
3.使用自加、自減的方法為:a++;a-,它會(huì )調用INC、DEC指令,效率遠比a=a+1;a=a-1高。
4.循環(huán):使用uchar a;for(a=1;a≤8;a++)…時(shí),條件a<=8編譯后代碼比較繁瑣,可用for(a=8;a=a-1)…來(lái)代替,充分利用單片機的為零跳轉指令。同樣,在do{…}while()中也適用。
5. 當多個(gè)條件判別時(shí),if(A&&B&&C&&D),只要第一個(gè)條件A不符合,程序是不管后面的條件的,所以可把最可能出錯的條件排在前面處理。
6.子程序的參量。調用子程序時(shí)若帶參量,程序會(huì )開(kāi)辟存儲空間(如Rn)來(lái)存放參量,這個(gè)空間是可以充分利用的。如延時(shí)子程序void delay(uehar time){while(time一);J,可以延時(shí)相當短的時(shí)間。
7.空指令NOP在C中用_nop一0實(shí)現,定義在中。
8.求余運算“%”操作是調用子程序來(lái)完成的,效率低。如果是求2的n次方的余數,可使用位操作來(lái)代替。如:a=a%8可改用8=a&7,效率明顯提高。同樣2xN的乘除運算可用移位來(lái)實(shí)現。如:a=a*2;b=h/2可改為a=a《1;b=b》1。
9.使用結構體類(lèi)型數組時(shí),在查找第n個(gè)值時(shí)要利用乘法指令(序號乘以類(lèi)型寬度),當程序高速運行時(shí),可能會(huì )影響其速度。
10.Keil的軟件調試非常有用。筆者常將編譯后的程序與C源程序對照,查看匯編代碼、檢查不恰當之處。有時(shí)還可用來(lái)計算子程序執行時(shí)間(在確定精確延時(shí)程序參數時(shí)非常有用)。