|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
[轉(zhuǎn)貼]HC08 C語言程序設(shè)計(jì)(1) |
| 作者:JerryBJ 欄目:單片機(jī) |
周末在www.mcu123.com上讀到劉玉宏同志的這篇文章,覺得寫得很好,基本上涵蓋了使用C語言對(duì)HC(S)08微控制器編程的基本知識(shí),推薦給大家。把這篇文章轉(zhuǎn)貼過來,沒有經(jīng)過原文作者和MCU123的允許,希望他們不會(huì)生氣。若作者和MCU123對(duì)此感到不適,請(qǐng)即告知,我們立刻刪除此轉(zhuǎn)貼。原文鏈接如下: http://www.mcu123.com/news/Article/uc/MOTOROLA/200608/252.html HC08 C語言程序設(shè)計(jì)(1) 作者:劉玉宏 文章來源:本站原創(chuàng) 點(diǎn)擊數(shù): 更新時(shí)間:2006-8-23 16.1 HC08 C語言簡(jiǎn)介 16.1.1 嵌入式C語言 1. 編程語言的使用原則 在目前的單片機(jī)應(yīng)用系統(tǒng)研制過程中,主要使用匯編語言和C語言作為開發(fā)語言,兩者各有特點(diǎn)。 匯編語言的特點(diǎn): l 直接操作硬件及資源。 l 生成代碼精簡(jiǎn)高效。 l 起步要求較高,程序員需對(duì)硬件有深刻的了解,一個(gè)好的程序員往往能大大減少開發(fā)與調(diào)試的周期。 l 可移植性較差,硬件或資源改變代碼需要大量修改。 C語言的特點(diǎn): l 對(duì)程序員要求較低,往往只需要程序員了解一定的硬件知識(shí)即可。 l 可移植性較好,可以編寫跨平臺(tái)的嵌入式軟件。 l 不需要程序員管理堆棧。在調(diào)用子程序和中斷子程序時(shí),不需要用戶處理繁鎖的棧操作,加快了開發(fā)進(jìn)度,同時(shí)減少了棧操作出錯(cuò)的可能性。 l 生成代碼的效率取決于編譯器和程序員的編程風(fēng)格。HC08C的編譯器已經(jīng)對(duì)部分硬件資源進(jìn)行了封裝,如:堆棧、子程序的跳轉(zhuǎn)、中斷處理時(shí)現(xiàn)場(chǎng)的保護(hù)。C代碼中的函數(shù)、控制語句在編譯時(shí)都會(huì)被編譯器編譯成相應(yīng)的匯編指令,這些語句生成的代碼量也不盡相等。而且同樣功能的總代碼生成量比使用匯編語言略高20% 任何一款編譯器都不會(huì)比一個(gè)有經(jīng)驗(yàn)的匯編語言程序員編寫的匯編程序效率高,但是寫一個(gè)好的C程序然后轉(zhuǎn)換為高效的匯編程序比直接寫高效的匯編程序就容易多了。 綜上所述,無論是采用C語言還是匯編語言都各有其利弊。我們既不推薦在學(xué)習(xí)與開發(fā)嵌入式軟件過程中完全采取匯編語言(因?yàn)閰R編語言對(duì)一個(gè)不懂硬件的新手來說,是需要一定的時(shí)間才能上手的),也不贊同完全使用C語言(因?yàn)橛性S多底層的操作,C的語句是無法做到的)。所以在開發(fā)過程中,我們往往采用C和匯編結(jié)合的一種編程風(fēng)格,要充分利用這兩者的優(yōu)勢(shì)。例如我們通常把底層的對(duì)硬件的操作留給匯編指令,把與硬件無關(guān)或相關(guān)性較少的部分用C代碼實(shí)現(xiàn)。當(dāng)然,要充分發(fā)揮兩者的性能,需要程序員對(duì)編譯器有一定了解,并注重平時(shí)的積累 2. C語言對(duì)硬件的要求 并不是所有的MCU都可以用C語言來開發(fā),它們必需具備一定的硬件條件: l 完整的指令系統(tǒng) l 擁有分別為運(yùn)算和指針服務(wù)的16位寄存器,在HC08中就是HX和PC l 堆棧指針和堆棧結(jié)構(gòu)指針,在HCS08 C 語言中它們都是SP l 連續(xù)的地址空間 3. 嵌入式C語言與標(biāo)準(zhǔn)C語言的區(qū)別 純粹的ANSI C語言并不適合單片機(jī)開發(fā),這是因?yàn)椋?br> l 嵌入式系統(tǒng)與硬件密切相關(guān) l 大部分嵌入式系統(tǒng)使用中斷 l ANSI C 語言的變量類型提升規(guī)則對(duì)存儲(chǔ)器消耗非常大 l 有些MCU不支持C語言堆棧. l 很多MCU具有多種存儲(chǔ)空間,例如51單片機(jī)的程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器、特殊功能存儲(chǔ)器等 因此嵌入式C語言必需適合嵌入式的特殊環(huán)境: l 有限 RAM l 有限 ROM l 有限堆?臻g l 要求具有硬件編程向?qū)?br> l 嚴(yán)格的時(shí)序(ISR, tasks, ...) l 必需具有多種指針類型 (far/near/rom/uni/paged/...) l 必需具有特殊關(guān)鍵字/符號(hào) (@, interrupt, tiny, ...) 4. 嵌入式C編譯器應(yīng)具有的功能 l 適合ROM代碼 l 優(yōu)化代碼 l 重入代碼 l 支持CPU系列的不同成員 l 支持不同的存儲(chǔ)器模式 對(duì)于一個(gè)編譯器我們還應(yīng)該注意以下細(xì)節(jié),不同的編譯器在這些方面差異較大 l 能內(nèi)嵌匯編、混合編程 l 具有中斷服務(wù)編程能力 l 可輸出匯編語言源文件 l 帶有標(biāo)準(zhǔn)庫 l 具有初始化硬件和建立C語言運(yùn)行環(huán)境的啟動(dòng)代碼 5. 嵌入式C連接器應(yīng)具有的功能 l 合并不同代碼段 l 為CPU分配存儲(chǔ)器 (RAM, ROM, stack, special areas) l 產(chǎn)生調(diào)試文件 (包括符號(hào)、行號(hào)等) l 產(chǎn)生目標(biāo)文件的存儲(chǔ)器映像 16.1.2 CodeWarrior for HCS08 Metrowerks 是MOTOROLA于1999收購(gòu)并獨(dú)立運(yùn)作的子公司,其軟件產(chǎn)品CodeWarrior專門是面向MOTOROAL(FREESCALE)所有的MCU與DSP嵌入式應(yīng)用、跨平臺(tái)的軟件工具,是MOTOROLA向用戶的推薦產(chǎn)品。 CodeWarrior for HCS08 是面向以HC08或S08為CPU的單片機(jī)嵌入式應(yīng)用開發(fā)的軟件包。其中包括集成環(huán)境IDE、處理器專家?guī)臁⑷酒抡、可視化參?shù)顯示工具、項(xiàng)目工程管理器、C交叉編譯器、匯編器、鏈接器以及調(diào)試器。可以完成從源代碼編輯、編譯到調(diào)試的全部工作,本書將在以后的章節(jié)中介紹其使用方法,以下所提到C語言均是指CodeWarrior for HCS08的C交叉編譯器所支持的C語言。 16.2 HCS08 C語言的擴(kuò)展語法 HCS08C語言的語法基本與標(biāo)準(zhǔn)C相同。有關(guān)標(biāo)準(zhǔn)C語言的語法本書不再介紹,請(qǐng)讀者自行參考相關(guān)書籍。本節(jié)主要介紹HCS08 C語言對(duì)標(biāo)準(zhǔn)C語言的擴(kuò)展語法。 16.2.1基本數(shù)據(jù)類型 數(shù)據(jù)類型 大小 無符號(hào)(unsigned)數(shù)據(jù)范圍 有符號(hào)(signed)數(shù)據(jù)范圍 CHAR 8 bits 0 ~ 255 –128 ~ 127 SHORT int 16 bits 0 ~ 65535 –32768 ~ 32767 Int 16 bits 0 ~ 65535 –32768 ~ 32767 LONG int 32 bits 0 ~ 4294967295 –2147483648 ~ 2147483647 ANSI C沒有為int類型規(guī)定長(zhǎng)度,不過八位的單片機(jī)的C編譯器一般都把int定義為16位有符號(hào)數(shù)。但是由于8位機(jī)處理8位數(shù)據(jù)是效率最高的,所以int類型和更大的類型都應(yīng)該在必需要時(shí)才使用。最好不用使用浮點(diǎn)數(shù)。 CHAR類型可能在不同編譯器有不同的定義,或者根本沒有定義,為了便于程序移植要,最好不要用CHAR這個(gè)符號(hào)應(yīng)給它起個(gè)別名。 可以為所有用到的數(shù)據(jù)類型進(jìn)行重新定義。 typedef unsigned CHAR UINT8; typedef signed CHAR SINT8; typedef unsigned int UINT16; typedef int SINT16; typedef unsigned LONG int UINT32; typedef LONG int SINT32; 使用這樣的定義程序移植性較好。 為了節(jié)約有限的RAM資源應(yīng)該為每個(gè)變量盡量用最小的數(shù)據(jù)類型;盡量少用有符號(hào)數(shù)據(jù);可以在表達(dá)式中用強(qiáng)制類型轉(zhuǎn)換把數(shù)據(jù)長(zhǎng)度縮到最短。 |
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |