新聞中心

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

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

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

作為一種結(jié)構(gòu)化的程序設(shè)計(jì)語(yǔ)言,C語(yǔ)言的特點(diǎn)就是可以使你盡量少地對(duì)硬件進(jìn)行操作,具有很強(qiáng)的功能性、結(jié)構(gòu)性和可移植性,常常被優(yōu)選作為系統(tǒng)的編程語(yǔ)言。但是基于的C語(yǔ)言和標(biāo)準(zhǔn)C語(yǔ)言有很大區(qū)別,如何結(jié)合的系統(tǒng)資源,用C語(yǔ)言開發(fā)符合實(shí)際工程需要的單片機(jī)系統(tǒng),對(duì)用編程者來說具有十分重要的意義。

本文引用地址:http://butianyuan.cn/article/171801.htm

1 單片機(jī)C語(yǔ)言主要特點(diǎn)

用C 編寫程序比匯編更符合人們的思考習(xí)慣,開發(fā)者可以擺脫與硬件無(wú)必要的接觸,更專心的考慮功能和算法而不是考慮一些細(xì)節(jié),這樣就減少了開發(fā)和調(diào)試的時(shí)間。C語(yǔ)言具有良好的程序結(jié)構(gòu),適用于模塊化程序設(shè)計(jì),因此采用C語(yǔ)言設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)程序時(shí),首先要盡可能地采用結(jié)構(gòu)化的程序設(shè)計(jì)方法,將功能模塊化,由不同的模塊完成不同的功能[1],這樣可使整個(gè)應(yīng)用系統(tǒng)程序結(jié)構(gòu)清晰,易于調(diào)試和維護(hù)。不同的功能模塊,分別指定相應(yīng)的入口參數(shù)和出口參數(shù),對(duì)于一些要重復(fù)調(diào)用的程序一般把其編成函數(shù),這樣可以減少程序代碼的長(zhǎng)度,又便于整個(gè)程序的管理,還可增強(qiáng)可讀性和移植性。

在實(shí)際單片機(jī)程序設(shè)計(jì)中,程序結(jié)構(gòu)一般均采用如下結(jié)構(gòu):
#includereg51.h> /*頭文件說明部份*/
unsigned char x1,x2; /*全局變量聲明部份*/
…Function1(… ){ /*功能函數(shù)定義部份*/
……     }
main() {
  inti,j; /* 整型變量聲明部份*/ 
Function1(…); /* 功能函數(shù)說明部份*/
……}

2 單片機(jī)C語(yǔ)言與標(biāo)準(zhǔn)C語(yǔ)言的區(qū)別

由于現(xiàn)在越來越多的產(chǎn)品都采用單片機(jī)開發(fā),所完成的計(jì)算和控制工作也日趨復(fù)雜,但是單片機(jī)系統(tǒng)是一種資源十分有限的系統(tǒng),這主要表現(xiàn)在程序存儲(chǔ)器資源的不足,因此在程序設(shè)計(jì)時(shí)如何使用好這些有限的資源就顯得十分重要。用C雖然具有許多的優(yōu)點(diǎn),但是生成的代碼相對(duì)要長(zhǎng),要是編程技術(shù)不好,生成的代碼甚至有可能比匯編語(yǔ)言生成的代碼長(zhǎng)幾倍,因此對(duì)編程者來說,應(yīng)該到單片機(jī)C語(yǔ)言和一般意義上的標(biāo)準(zhǔn)C語(yǔ)言的區(qū)別,對(duì)程序進(jìn)行適當(dāng)?shù)膬?yōu)化。

2.1 數(shù)據(jù)類型的選用

單片機(jī)C不同于一般的C的顯著的一個(gè)特點(diǎn),就是要和程序存儲(chǔ)器資源結(jié)合起來,雖然其提供的數(shù)據(jù)據(jù)類型十分豐富,但是只有bit和char 等數(shù)據(jù)類型是是機(jī)器語(yǔ)言直接支持的數(shù)據(jù)類型,用此類數(shù)據(jù)類型的語(yǔ)句所生成的代碼較短;而其它的數(shù)據(jù)類型如整型、浮點(diǎn)型等數(shù)據(jù)要有一定的內(nèi)部程序或內(nèi)部函數(shù)的支持,相對(duì)來說用該類數(shù)據(jù)類型的語(yǔ)句生成的代碼要長(zhǎng)。有些C語(yǔ)言程序表面上看起來十分的簡(jiǎn)單,但在在實(shí)際編譯時(shí),生成的代碼卻相當(dāng)長(zhǎng)。因此我們要按照實(shí)際需要,合理地選用數(shù)據(jù),可以大大的減少所生成的代碼長(zhǎng)度。例如在C51中每種數(shù)據(jù)類型變量所占用存儲(chǔ)器字節(jié)數(shù)和經(jīng)編譯后生成的代碼長(zhǎng)度如表1所示:

52.gif
表1 不同數(shù)據(jù)類型占用存儲(chǔ)器字節(jié)數(shù)和代碼長(zhǎng)度對(duì)比

通過表1我們知道,不同的數(shù)據(jù)類型所生成的機(jī)器代碼長(zhǎng)度相差很多,相同類型的數(shù)據(jù)類型有無(wú)符號(hào)對(duì)機(jī)器代碼長(zhǎng)度也有影響。在程序編譯時(shí)生成機(jī)器代碼長(zhǎng)的數(shù)據(jù)類型的優(yōu)先級(jí)越高,不同的數(shù)據(jù)類型在進(jìn)行程序運(yùn)算時(shí)要轉(zhuǎn)化為高優(yōu)先級(jí)的的數(shù)據(jù)類型,相應(yīng)的代碼長(zhǎng)度也會(huì)增長(zhǎng)[2]。因此我們應(yīng)盡可能地使用 bit,char等機(jī)器語(yǔ)言直接支持的數(shù)據(jù)類型,無(wú)符號(hào)數(shù)的變量應(yīng)聲明為無(wú)符號(hào)數(shù),盡可能地減少程序中使用的數(shù)據(jù)類型的種類。

2.2 算法設(shè)計(jì)

單片機(jī)C語(yǔ)言和標(biāo)準(zhǔn)C語(yǔ)言存在著很大差別,在計(jì)算機(jī)上進(jìn)行C語(yǔ)言程序設(shè)計(jì)時(shí)由于不必考慮程序代碼的長(zhǎng)短,只需考慮程序功能實(shí)現(xiàn),但是在單片機(jī)上進(jìn)行C語(yǔ)言程序設(shè)計(jì)就必須考慮系統(tǒng)的硬件資源。有時(shí)并不是程序的算法越簡(jiǎn)單、長(zhǎng)度越短越好,因?yàn)橛幸恍┧惴ㄒ{(diào)用一些內(nèi)部的子程序和函數(shù),生成的機(jī)器代碼長(zhǎng)度非常長(zhǎng)。不同的算法對(duì)程序代碼長(zhǎng)度影響十分大,因此在進(jìn)行程序設(shè)計(jì)時(shí),就盡量采用程序生成代碼短的算法,在不影響程序功能實(shí)現(xiàn)的情況下可以采用一些優(yōu)化算法 [2]。

在單片機(jī)C語(yǔ)言編譯成機(jī)器代碼時(shí),不同的運(yùn)算生成的機(jī)器代碼的長(zhǎng)度相差很大,盡可能地減少程序中對(duì)某種數(shù)據(jù)類型的運(yùn)算種類,越復(fù)雜的數(shù)據(jù)類型效果越明顯。在進(jìn)行數(shù)據(jù)計(jì)算時(shí),在一定的精度范圍內(nèi),可以用一些近似的計(jì)算來完成一些運(yùn)算,既不損失精度又能減少大量的代碼。比如:用邏輯AND/取模比MOD/%操作更有效。

在用熱敏電阻測(cè)量溫度時(shí),可根據(jù)熱敏電阻—溫度特性公式來求值。數(shù)學(xué)表達(dá)式表示為:
RT=RT0expB(1/T-1/T0)

如果直接按照公式溫度時(shí)程序結(jié)構(gòu)簡(jiǎn)單,算法復(fù)雜度不高,但是程序?qū)⒄{(diào)用Math.h>文件中的對(duì)數(shù)函數(shù),在編譯成機(jī)器碼時(shí)函數(shù)有1K多字節(jié),對(duì)于一般只有幾K字節(jié)的單片機(jī)系統(tǒng)來說,這是十分不合適的??紤]到系統(tǒng)資源可以用一種替代方法—查表法來實(shí)現(xiàn)算法。只要給出一定溫度范圍內(nèi)不同溫度值對(duì)應(yīng)熱敏電阻的電阻值,然后建立表格,只要按照系統(tǒng)求出的阻值,進(jìn)行查表,插值,就可以求出相應(yīng)的溫度值。這種算法相比前面的的公式法的算法復(fù)雜高,C語(yǔ)言程序代碼也長(zhǎng),但在編譯成機(jī)器碼時(shí),代碼長(zhǎng)度卻很短,只有一、二百字節(jié)。

3  數(shù)據(jù)存儲(chǔ)器的分配

單片機(jī)內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM只有幾百字節(jié),如果擴(kuò)展外部存儲(chǔ)器RAM來提高數(shù)據(jù)存儲(chǔ)量話必將會(huì)增加了硬件成本,使系統(tǒng)更加的復(fù)雜,訪問外部存儲(chǔ)器比訪問內(nèi)部存儲(chǔ)器所需的代碼也要長(zhǎng)得多。有效地使用片內(nèi)存儲(chǔ)器、提高存儲(chǔ)器空間的利用率對(duì)開發(fā)者來說十分關(guān)鍵。


上一頁(yè) 1 2 3 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉