方春華
摘要:隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,使得如今的單片機(jī)仿真器普遍支持了c語言程序的調(diào)試,這無疑是對單片機(jī)使用c語言提供了極大便利。雖然,單片機(jī)內(nèi)中半導(dǎo)體芯片的體積十分微小,但卻容納了眾多的元器件,包括CPU、半導(dǎo)體存儲器、I/O接口以及中斷系統(tǒng)。與此同時,基于c語言本身兼具高級語言和匯編語言的雙重特點(diǎn),加之c語言能夠直接操作單片機(jī)硬件,這為c語言編程在單片機(jī)中的應(yīng)用創(chuàng)造了良好的條件。本文通過概述單片機(jī)系統(tǒng),深入分析單片機(jī)c語言編程的常見問題,并根據(jù)實(shí)際情況提出解決單片機(jī)c語言編程問題的策略,為單片機(jī)c語言編程的應(yīng)用提供可參考的資料。
關(guān)鍵詞:單片機(jī);c語言;編程問題
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2019)30-0237-02
單片機(jī)的開發(fā)主要依賴于大量的編程與算法設(shè)計(jì),而通過對單片機(jī)編程語言的審視,我們不難發(fā)現(xiàn):傳統(tǒng)單片機(jī)運(yùn)用最多的當(dāng)屬匯編語言,而針對c、c++等高級編譯語言的運(yùn)用卻十分稀少。而隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,人們對單片機(jī)系統(tǒng)功能需求的不斷提升,所以積極將c、c++一類的高級編譯語言運(yùn)用至單片機(jī)中已然成為時代發(fā)展的必然趨勢。
1單片機(jī)系統(tǒng)
1.1單片機(jī)的定義
單片機(jī)的英文全稱為“single chip microcomputer”,中文翻譯為單片微型計(jì)算機(jī)。其主要部件便是半導(dǎo)體芯片。雖然,半導(dǎo)體芯片的體積十分微小,但卻容納了眾多的元器件,包括CPU、半導(dǎo)體存儲器、I/O接口以及中斷系統(tǒng)等。至于單片機(jī)則是由眾多包含此半導(dǎo)體芯片的硬件所構(gòu)成。
1.2單片機(jī)的系統(tǒng)組成
就單片機(jī)系統(tǒng)而言,其與普通計(jì)算機(jī)同樣擁有硬件與軟件系統(tǒng)兩大重要組成部分。其中,硬件系統(tǒng)主要包含了上述所提半導(dǎo)體芯片中集成的各類元器件,如CPU、半導(dǎo)體存儲器等。而軟件則是由眾多的主程序與子程序所共同組成,而這些主程序與子程序則均是借助匯編或c語言所編寫而成,其主要功能便是監(jiān)控系統(tǒng)。
1.3單片機(jī)的功能特點(diǎn)
單片機(jī)雖是微型電子計(jì)算機(jī),卻仍有著極其豐富的功能。如基于單片機(jī)的元器件本身便具有較高的基礎(chǔ)高難度,故在大規(guī)模以及超大規(guī)模的集成電路中均適用,且具體的運(yùn)用還能增強(qiáng)電路的抗干擾能力與可靠性。其次,同樣基于單片機(jī)元器件的高集成度,故其價格也相對較為低廉。再者則是單片機(jī)具有強(qiáng)大的控制功能,而相關(guān)功能均是由指令輸入來實(shí)現(xiàn);最后則是單片機(jī)本身對電壓要求較低,僅是2.2甚至更低的電壓便可運(yùn)行,如此低功耗也十分符合環(huán)保低耗的相關(guān)要求。
1.4單片機(jī)的應(yīng)用范圍
單片機(jī)具有強(qiáng)大的功能,故使得該設(shè)備于國防、軍事、工業(yè)、農(nóng)業(yè)等諸多領(lǐng)域均有著十分廣泛的運(yùn)用。不僅如此,在眾多與家庭相關(guān)的系統(tǒng)及設(shè)備中,單片機(jī)也有著良好的運(yùn)用價值,諸如機(jī)電一體化設(shè)備、智能儀表儀器、分布式多機(jī)系統(tǒng)等。
2單片機(jī)C語言編程的常見問題
雖然單片機(jī)的語言編輯器功能也十分強(qiáng)大,但也并非能可支持所有的數(shù)據(jù)類型。好在當(dāng)前所流行的數(shù)據(jù)類型,當(dāng)前的單片機(jī)語言編輯器均能良好兼容,且基于單片機(jī)本身所具有的位數(shù)數(shù)據(jù)存儲功能,故能通過合理應(yīng)用各種字符集來構(gòu)建完整的數(shù)據(jù)庫。浮點(diǎn)型數(shù)據(jù)這種數(shù)據(jù)類型也常常會應(yīng)用到語言編輯中,且最常見的一種方式就是邏輯開頭。
就上述語言類型外,單片機(jī)除了能完美兼容外,且還支持特殊功能的寄存。而所謂的特殊功能寄存,即指單片機(jī)并非只能單純的存儲數(shù)據(jù),而是能訪問數(shù)據(jù)存儲的任意位置。雖然,基于各種強(qiáng)大的功能使得單片機(jī)的運(yùn)用范圍也十分廣泛,但其語言卻有著十分明顯的缺陷。就以市面上最常見的單片機(jī)為例,當(dāng)前,市面上最常見的單片機(jī)通常是八位的,也便是能同時計(jì)算二的八次方個數(shù)據(jù),而在實(shí)際運(yùn)算過程中,為切實(shí)提升代碼的準(zhǔn)確率,我們通常是通過減少單片機(jī)位數(shù)長度的方式來降低其數(shù)據(jù)計(jì)算量,以此將能避免占用過多內(nèi)存。同樣,在語言設(shè)計(jì)時通常會采取減少程度執(zhí)行過程中的預(yù)算次數(shù)或減少字符串總長度的方式來降低單片機(jī)的數(shù)據(jù)計(jì)算量。但若所需計(jì)算的數(shù)據(jù)類型為浮點(diǎn)型數(shù)據(jù),這便需要得到內(nèi)部函數(shù)的支持方能精準(zhǔn)計(jì)算,故我們在運(yùn)用數(shù)據(jù)時,需務(wù)必做到對數(shù)據(jù)類型的合理選取,以此方能減少代碼長度,并保證代碼整體結(jié)構(gòu)的科學(xué)性與合理性。
3解決單片機(jī)C語言編程中常見問題的策略
為了擴(kuò)大單片機(jī)c語言編程的應(yīng)用范圍,便需要積極解決單片機(jī)c語言編程中最常見的一些問題,優(yōu)化c語言的單片機(jī)開發(fā)環(huán)境、合理分配數(shù)據(jù)存儲器、與匯編語言的混合編程、完善C語言的單片機(jī)開發(fā)步驟。
3.1優(yōu)化C語言的單片機(jī)開發(fā)環(huán)境
當(dāng)前,就單片機(jī)程序的開發(fā)軟件而言,運(yùn)用最廣泛的當(dāng)屬KEIL C51。該軟件不僅集合了編輯、編譯以及仿真等程序設(shè)計(jì)所必備的功能外,還能支持不同公司生產(chǎn)的MCS51芯片。不僅如此,KEIL C51的操作界面亦十分友好,且該軟件內(nèi)部不僅集成了c語言,還同時支持其他的匯編語言。當(dāng)然,該軟件也因此而具備了強(qiáng)大的變成與調(diào)試功能。除此之外,基于KEIL C51的開發(fā)環(huán)境亦包含了諸多程序,包括編譯器、匯編器、項(xiàng)目管理器、調(diào)試器以及實(shí)時操作系統(tǒng)等。故也方便對目標(biāo)、組以及單個文件的管理。至于KEIL C51最主要的特性,因其操作界面十分友好,故用戶能可在實(shí)際運(yùn)用過程中快速熟悉。與此同時,基于源代碼編輯器還為代碼編輯創(chuàng)造了一個極為方便的環(huán)境,故編譯人員可隨時基于編輯器來對代碼予以調(diào)試,以此將方便編譯人員快速找出前期所寫代碼之中是否存在錯誤以及在代碼完成后對其予以合理的優(yōu)化。
3.2合理分配數(shù)據(jù)存儲器
就單片機(jī)的內(nèi)部數(shù)據(jù)存儲器而言,通常僅有幾百字節(jié)大小。但若以添加外部存儲器的方式來提高單片機(jī)的數(shù)據(jù)存儲量,則將導(dǎo)致硬件成本的大幅增加。且因外部存儲器的加入會讓原本較為簡便的系統(tǒng)變得愈發(fā)復(fù)雜,故針對片內(nèi)存儲器空間的合理利用對單片機(jī)開發(fā)而言無疑是極為關(guān)鍵的一環(huán)。對此,若能基于C語言來調(diào)用存儲器的覆蓋技術(shù),則可在連接性的程序時,將此前被其他程度所占用的存儲空間重新定義,是之能轉(zhuǎn)化為另一程序段的變量。而當(dāng)另一程序停止運(yùn)行后,這些存儲器空間又將再度釋放并供其他程序使用,以此將能大幅提升單片器存儲器內(nèi)部空間的應(yīng)用效率。至于存儲器中的變量,眾所周知,存儲器變量主要有靜態(tài)與動態(tài)之分。其中靜態(tài)變量僅能被調(diào)用而無法被釋放,而動態(tài)變量則可以被釋放。對此,針對程序設(shè)計(jì)過程涉及局部變量的使用時,編譯人員需務(wù)必采取動態(tài)變量,如此方能進(jìn)一步提高內(nèi)部數(shù)據(jù)存儲器的使用率。除此之外,考慮到C語言中的程序中間結(jié)果以及參數(shù)傳遞均是依靠內(nèi)部寄存器來完成,但若內(nèi)部存儲器本身的空間不足,則反而會對程序帶來負(fù)面影響。故在設(shè)計(jì)相關(guān)程序時,編譯人員需務(wù)必對寄存器空間予以詳盡考量,如此方能最大限度避免計(jì)算錯誤的出現(xiàn)。
3.3與匯編語言的混合編程
雖然,C語言編程于絕大多數(shù)場合的運(yùn)用均可達(dá)到預(yù)期的目標(biāo),但并不適用于諸如實(shí)時時鐘等對執(zhí)行效率要求較高的系統(tǒng)。至于匯編語言,因其原本便是一種直接與硬件打交道且具有較高代碼執(zhí)行效率的匯編語言,故積極將c語的使用過程過程與匯編語言相結(jié)合,將能對C語言無法做到之事予以有效彌補(bǔ)。如結(jié)合C語言和匯編語言的優(yōu)點(diǎn)來予以混合編程,便能滿足實(shí)時時鐘系統(tǒng)設(shè)計(jì)的諸多需求。而這也正是當(dāng)下單片機(jī)開發(fā)最流行的編程方法。除此之外,在絕大多數(shù)單片機(jī)系統(tǒng)中,c語言與匯編語言的結(jié)合還包含了以下兩種狀況:一是在匯編程序與C語言程序分屬不同模塊的情況下,系統(tǒng)的子程序,也便是會變成度模塊的變量及函數(shù)部分通常是由c語言來進(jìn)行調(diào)用。而另一種則是嵌入式匯編,在嵌入式匯編中,通常是在c語言程序中嵌入一段匯編語言程序,后在不同模塊的調(diào)用下又將分為若干個C程序與匯編程序模塊。而此時的C語言模塊通常是作為程序的主體框架來輔助匯編程序完成相應(yīng)的任務(wù)。當(dāng)然,在此過程中,C語言與匯編語言模塊必須基于完整的約定,否則將導(dǎo)致數(shù)據(jù)交換出錯。除此之外,就嵌入式匯編而言,因c語言使用使得程序內(nèi)部可自動生產(chǎn)精煉的代碼,由此可極大減少系統(tǒng)的運(yùn)行時間,且當(dāng)內(nèi)部無復(fù)雜跳轉(zhuǎn)時,該嵌人式語言亦將自動完成匯編。
3.4完善C語言的單片機(jī)開發(fā)步驟
運(yùn)用C語言進(jìn)行單片機(jī)程度開發(fā)時,通常需經(jīng)歷以下幾大重要步驟。依次為程序代碼的編寫、程度代碼的編譯、目標(biāo)代碼的連接以及目標(biāo)代碼的轉(zhuǎn)換等。就以上程序而言,最重要的當(dāng)屬代碼編寫完成后的調(diào)式,其步驟關(guān)系到編譯文件未能移植到單片機(jī)之上以及在編譯文件移植到單片機(jī)上后能可順利執(zhí)行。至于單片機(jī)的開發(fā)步驟則通常包含如下四步。分別為軟件的安裝、源文件的創(chuàng)建、編譯與調(diào)試以及最終的HEX文件生成。其中,軟件的安裝主要是通過登錄KEIL的官方文件下載軟件的商業(yè)版安裝包。通過點(diǎn)擊其解壓后的安裝包并雙擊其中的SETUP.EXE文件,在勾選其協(xié)議條款的同意按鈕并按提示輸入序列號后,后續(xù)的安裝步驟將自動完成;而源文件的創(chuàng)建則是再打開軟件后創(chuàng)立新的項(xiàng)目,后在新創(chuàng)利的項(xiàng)目中編寫代碼便可生成C與源程序的源文件。編譯與調(diào)試的主要任務(wù)便是檢查并調(diào)試源代碼程序,以找出代碼之中錯誤并加以及時的改正,以免影響到后續(xù)的軟件運(yùn)行。至于最后的HEX文件生成則需借助編譯器寫入單片機(jī)芯片中,以此為后續(xù)的仿真調(diào)試提供條件。
總之,C語言本身兼具高級語言和匯編語言的雙重特點(diǎn),加之該語言能直接操作單片機(jī)硬件,故使得該語言于單片機(jī)制造中有著絕佳的發(fā)展前景。而目前,該技術(shù)已然在眾多領(lǐng)域得到了極其廣泛的運(yùn)用,甚至在單片機(jī)開發(fā)中,C語言已然取代了其他匯編語言并成了最合適單片機(jī)開發(fā)的語言。由此可見,c語言在單片機(jī)技術(shù)中的運(yùn)用還將迎來更大的發(fā)展空間,因此,我們也必須要對該語言的使用給予高度重視。