單片機C語(yǔ)言編程應注意的若干問(wèn)題
作為一種結構化的程序設計語(yǔ)言,C語(yǔ)言的特點(diǎn)就是可以使你盡量少地對硬件進(jìn)行操作,具有很強的功能性、結構性和可移植性,常常被優(yōu)選作為單片機系統的編程語(yǔ)言。但是基于單片機的C語(yǔ)言和標準C語(yǔ)言有很大區別,如何結合單片機的系統資源,用C語(yǔ)言開(kāi)發(fā)符合實(shí)際工程需要的單片機系統,對用編程者來(lái)說(shuō)具有十分重要的意義。
本文引用地址:http://dyxdggzs.com/article/171801.htm1 單片機C語(yǔ)言主要特點(diǎn)
用C 編寫(xiě)程序比匯編更符合人們的思考習慣,開(kāi)發(fā)者可以擺脫與硬件無(wú)必要的接觸,更專(zhuān)心的考慮功能和算法而不是考慮一些細節問(wèn)題,這樣就減少了開(kāi)發(fā)和調試的時(shí)間。C語(yǔ)言具有良好的程序結構,適用于模塊化程序設計,因此采用C語(yǔ)言設計單片機應用系統程序時(shí),首先要盡可能地采用結構化的程序設計方法,將功能模塊化,由不同的模塊完成不同的功能[1],這樣可使整個(gè)應用系統程序結構清晰,易于調試和維護。不同的功能模塊,分別指定相應的入口參數和出口參數,對于一些要重復調用的程序一般把其編成函數,這樣可以減少程序代碼的長(cháng)度,又便于整個(gè)程序的管理,還可增強可讀性和移植性。
在實(shí)際單片機程序設計中,程序結構一般均采用如下結構:
#includereg51.h> /*頭文件說(shuō)明部份*/
unsigned char x1,x2; /*全局變量聲明部份*/
…Function1(… ){ /*功能函數定義部份*/
…… }
main() {
inti,j; /* 整型變量聲明部份*/
Function1(…); /* 功能函數說(shuō)明部份*/
……}
2 單片機C語(yǔ)言與標準C語(yǔ)言的區別
由于現在越來(lái)越多的產(chǎn)品都采用單片機開(kāi)發(fā),所完成的計算和控制工作也日趨復雜,但是單片機系統是一種資源十分有限的系統,這主要表現在程序存儲器資源的不足,因此在程序設計時(shí)如何使用好這些有限的資源就顯得十分重要。用C語(yǔ)言編程雖然具有許多的優(yōu)點(diǎn),但是生成的代碼相對要長(cháng),要是編程技術(shù)不好,生成的代碼甚至有可能比匯編語(yǔ)言生成的代碼長(cháng)幾倍,因此對編程者來(lái)說(shuō),應該注意到單片機C語(yǔ)言和一般意義上的標準C語(yǔ)言的區別,對程序進(jìn)行適當的優(yōu)化。
2.1 數據類(lèi)型的選用
單片機C語(yǔ)言編程不同于一般的C語(yǔ)言編程的顯著(zhù)的一個(gè)特點(diǎn),就是要和程序存儲器資源結合起來(lái),雖然其提供的數據據類(lèi)型十分豐富,但是只有bit和char 等數據類(lèi)型是是機器語(yǔ)言直接支持的數據類(lèi)型,用此類(lèi)數據類(lèi)型的語(yǔ)句所生成的代碼較短;而其它的數據類(lèi)型如整型、浮點(diǎn)型等數據要有一定的內部程序或內部函數的支持,相對來(lái)說(shuō)用該類(lèi)數據類(lèi)型的語(yǔ)句生成的代碼要長(cháng)。有些C語(yǔ)言程序表面上看起來(lái)十分的簡(jiǎn)單,但在在實(shí)際編譯時(shí),生成的代碼卻相當長(cháng)。因此我們要按照實(shí)際需要,合理地選用數據,可以大大的減少所生成的代碼長(cháng)度。例如在C51中每種數據類(lèi)型變量所占用存儲器字節數和經(jīng)編譯后生成的代碼長(cháng)度如表1所示:
表1 不同數據類(lèi)型占用存儲器字節數和代碼長(cháng)度對比
通過(guò)表1我們知道,不同的數據類(lèi)型所生成的機器代碼長(cháng)度相差很多,相同類(lèi)型的數據類(lèi)型有無(wú)符號對機器代碼長(cháng)度也有影響。在程序編譯時(shí)生成機器代碼長(cháng)的數據類(lèi)型的優(yōu)先級越高,不同的數據類(lèi)型在進(jìn)行程序運算時(shí)要轉化為高優(yōu)先級的的數據類(lèi)型,相應的代碼長(cháng)度也會(huì )增長(cháng)[2]。因此我們應盡可能地使用 bit,char等機器語(yǔ)言直接支持的數據類(lèi)型,無(wú)符號數的變量應聲明為無(wú)符號數,盡可能地減少程序中使用的數據類(lèi)型的種類(lèi)。
2.2 算法設計問(wèn)題
單片機C語(yǔ)言和標準C語(yǔ)言存在著(zhù)很大差別,在計算機上進(jìn)行C語(yǔ)言程序設計時(shí)由于不必考慮程序代碼的長(cháng)短,只需考慮程序功能實(shí)現,但是在單片機上進(jìn)行C語(yǔ)言程序設計就必須考慮系統的硬件資源。有時(shí)并不是程序的算法越簡(jiǎn)單、長(cháng)度越短越好,因為有一些算法要調用一些內部的子程序和函數,生成的機器代碼長(cháng)度非常長(cháng)。不同的算法對程序代碼長(cháng)度影響十分大,因此在進(jìn)行程序設計時(shí),就盡量采用程序生成代碼短的算法,在不影響程序功能實(shí)現的情況下可以采用一些優(yōu)化算法 [2]。
在單片機C語(yǔ)言編譯成機器代碼時(shí),不同的運算生成的機器代碼的長(cháng)度相差很大,盡可能地減少程序中對某種數據類(lèi)型的運算種類(lèi),越復雜的數據類(lèi)型效果越明顯。在進(jìn)行數據計算時(shí),在一定的精度范圍內,可以用一些近似的計算來(lái)完成一些運算,既不損失精度又能減少大量的代碼。比如:用邏輯AND/取模比MOD/%操作更有效。
在用熱敏電阻測量溫度時(shí),可根據熱敏電阻—溫度特性公式來(lái)求值。數學(xué)表達式表示為:
RT=RT0expB(1/T-1/T0)
如果直接按照公式溫度時(shí)程序結構簡(jiǎn)單,算法復雜度不高,但是程序將調用Math.h>文件中的對數函數,在編譯成機器碼時(shí)函數有1K多字節,對于一般只有幾K字節的單片機系統來(lái)說(shuō),這是十分不合適的??紤]到系統資源問(wèn)題可以用一種替代方法—查表法來(lái)實(shí)現算法。只要給出一定溫度范圍內不同溫度值對應熱敏電阻的電阻值,然后建立表格,只要按照系統求出的阻值,進(jìn)行查表,插值,就可以求出相應的溫度值。這種算法相比前面的的公式法的算法復雜高,C語(yǔ)言程序代碼也長(cháng),但在編譯成機器碼時(shí),代碼長(cháng)度卻很短,只有一、二百字節。
3 數據存儲器的分配
單片機內部數據存儲器RAM只有幾百字節,如果擴展外部存儲器RAM來(lái)提高數據存儲量話(huà)必將會(huì )增加了硬件成本,使系統更加的復雜,訪(fǎng)問(wèn)外部存儲器比訪(fǎng)問(wèn)內部存儲器所需的代碼也要長(cháng)得多。有效地使用片內存儲器、提高存儲器空間的利用率對開(kāi)發(fā)者來(lái)說(shuō)十分關(guān)鍵。
評論