新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)C語(yǔ)言編程應(yīng)注意的若干問(wèn)題

        單片機(jī)C語(yǔ)言編程應(yīng)注意的若干問(wèn)題

        作者: 時(shí)間:2012-03-23 來(lái)源:網(wǎng)絡(luò) 收藏

        內(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)用中專(zhuān)用不變,也不能被釋放;只有局部變量中的動(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 C語(yǔ)言與匯編語(yǔ)言的混合編程

        在絕大多數(shù)場(chǎng)合采用C即可完成預(yù)期的目的,但是對(duì)實(shí)時(shí)時(shí)鐘系統(tǒng)、要求執(zhí)行效率高的的系統(tǒng)就不適合采用C,對(duì)這些特殊情況進(jìn)行編程時(shí)要結(jié)合匯編語(yǔ)言。匯編語(yǔ)言具有直接和硬件打道、執(zhí)行代碼的效率高等特點(diǎn),可以做到C語(yǔ)言所不能做到的一些事情,例如對(duì)時(shí)鐘要求很?chē)?yán)格時(shí),使用匯編語(yǔ)言成了唯一的選擇。這種混合編程[2]的方法將C語(yǔ)言和匯編語(yǔ)言的優(yōu)點(diǎn)結(jié)合起來(lái),已經(jīng)成為目前開(kāi)發(fā)最流行的編程方法。

        目前大多數(shù)據(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)。

        51.gif

        下面就以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可以直接讀取P3.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í)鐘要求很?chē)?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)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 滨州市| 化德县| 花垣县| 霍林郭勒市| 庄浪县| 资溪县| 米脂县| 德钦县| 海南省| 霍林郭勒市| 余干县| 汨罗市| 年辖:市辖区| 安陆市| 周口市| 郁南县| 丹巴县| 聂荣县| 荔浦县| 嘉兴市| 三亚市| 大庆市| 新巴尔虎左旗| 四子王旗| 巴马| 黄梅县| 屏东市| 延安市| 横峰县| 合水县| 兴国县| 靖边县| 清水河县| 甘孜县| 耿马| 高邮市| 镇原县| 两当县| 前郭尔| 邮箱| 平阳县|