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