單片機(jī)C語言編程應(yīng)注意的若干問題
內(nèi)部處理器、內(nèi)部堆棧、壓縮棧、所有程序變量和所有包含進(jìn)來的庫函數(shù)都將使用數(shù)量有限的內(nèi)部數(shù)據(jù)存儲器RAM。因為C語言采用了存儲器的覆蓋技術(shù)[2],可以在程序進(jìn)行連接時,它將那些已經(jīng)被其它程序段釋放了的存儲器空間重新定義給另一個程序段的變量使用,當(dāng)這個程序運(yùn)行結(jié)束時再將這些存儲器釋放以供其它程序段使用。全局變量的作用范圍是整個程序,因此不能被釋放;靜態(tài)變量由于在函數(shù)的調(diào)用中專用不變,也不能被釋放;只有局部變量中的動態(tài)變量可以被釋放。
因此在進(jìn)行程序設(shè)計時應(yīng)該盡量的使用局部變量,提高內(nèi)部數(shù)據(jù)存儲器的使用率。在C語言中程序中間結(jié)果及參數(shù)傳傳遞是通過內(nèi)部的寄存器來完成的,要是內(nèi)部的存儲器不夠,將會給你的程序帶來許多莫名其妙的錯誤。例如在進(jìn)行程序設(shè)計時語句不應(yīng)該太長,一個長語句可以分成多個語句,這樣的話可以大的減少中間變量,當(dāng)然太長時就會造成臨時寄存器的不夠用,導(dǎo)致計算出錯。
4 單片機(jī)C語言與匯編語言的混合編程
在絕大多數(shù)場合采用C語言編程即可完成預(yù)期的目的,但是對實時時鐘系統(tǒng)、要求執(zhí)行效率高的的系統(tǒng)就不適合采用C語言編程,對這些特殊情況進(jìn)行編程時要結(jié)合匯編語言。匯編語言具有直接和硬件打道、執(zhí)行代碼的效率高等特點,可以做到C語言所不能做到的一些事情,例如對時鐘要求很嚴(yán)格時,使用匯編語言成了唯一的選擇。這種混合編程[2]的方法將C語言和匯編語言的優(yōu)點結(jié)合起來,已經(jīng)成為目前單片機(jī)開發(fā)最流行的編程方法。
目前大多數(shù)據(jù)單片機(jī)系統(tǒng),在C語言中使用匯編語言有兩種情況:一種是匯編程序部分和C程序部分為不同的模塊,或不同的文件,通常由C程序調(diào)用匯編程序模塊的變量和函數(shù)(也可稱為子程序或過程);另一種是嵌入式匯編,即在C語言程序中嵌入一段匯編語言程序。
當(dāng)匯編程序和C程序為不同模塊時程序一般可分為若于個C程序模塊和匯編程序模塊,C程序模塊通常是程序的主體框架,而匯編程序模塊通常由用C語言實現(xiàn)效率不高的函數(shù)組成,也可以是已經(jīng)成熟的、沒有必要再轉(zhuǎn)化成C語言的匯編子程序。在這種混合編程技術(shù)中,關(guān)鍵是參數(shù)的傳遞和函數(shù)的返回值。它們必須有完整的約定,否則數(shù)據(jù)的交換就可能出錯。
對于嵌入式匯編,可以在C程序中使用一些關(guān)鍵字嵌入下些匯編程序,這種方法主要用于實現(xiàn)數(shù)學(xué)運(yùn)算或中斷處理,以便生成精練的代碼,減少運(yùn)行時間。當(dāng)匯編函數(shù)不大,且內(nèi)部沒有復(fù)雜的跳轉(zhuǎn)時,可以用嵌入式匯編實現(xiàn)。
下面就以AT89C2051單片機(jī)在模擬電壓檢測中的應(yīng)用為例說明C語言程序與匯編語言程序的調(diào)用。電路圖如圖1所示:
AT89C2051單片機(jī)內(nèi)置模擬比較器,13腳即P1.1是比較器的負(fù)輸入端,12腳即P1.0是比較器的正輸入端,比較器的輸出端做在了CPU內(nèi)部即P3.6未被引出,CPU可以直接讀?。?.6狀態(tài)來判定兩輸入端比較的結(jié)果其和一個外部電阻及一個外部電容器就可以設(shè)計成一個A/D轉(zhuǎn)換器,采用RC模擬轉(zhuǎn)換的原理,來檢測外部P1.1引腳的輸入電壓。由于系統(tǒng)對時鐘要求很嚴(yán)格,因此就采用了C語言和匯編語言混合編程技術(shù),程序調(diào)用形式如下:
匯編子程序:
PUBLIC _AD ;入口地址
con SEGMENT CODE ;程序段
RSEG con
_AD: SETB P3.7 ;充電
Loop: JB p3.6,AD_END ;開始計數(shù)匹配
INC A
CJNE A,#100,Loop
AD_END: CLR P3.7 ;放電
CJNE A,#100,Ret_Val ;看結(jié)果是否有溢出,有溢出說明結(jié)果不對
SJMP Con_OV;返回值
Ret_Val:DEC A
MOV R7,A ;A/D轉(zhuǎn)換的結(jié)果保存在R7中,傳遞給主程序
Con_OV: RET
END
評論