




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1.CodeWarrior中建立新項(xiàng)目運(yùn)行CodeWarrior(CW集成開(kāi)發(fā)平臺(tái),如圖1-1所示在File菜單下點(diǎn)擊New,彈出建立新項(xiàng)目的模板對(duì)話框,見(jiàn)圖1-2。一般的簡(jiǎn)便做法是在圖1-2對(duì)話框左面的選擇列表中選擇“HC(S08 New Project Wizard”,然后在右面的項(xiàng)目名“Project Name”輸入條中,輸入你要建立的新項(xiàng)目名字,再在“Location”一欄中用 確定項(xiàng)目存放的文件夾路經(jīng),完成后按“OK”進(jìn)入下一步。你也可以在圖1-2對(duì)話框左側(cè)列表中選擇“Empty Project”,這樣生成的項(xiàng)目不包含任何文件,你必須在CodeWarrior中自己添加所有相關(guān)的文件內(nèi)
2、容。我想除非有特殊理由,實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中很少采用這種麻煩的方式來(lái)建立自己的項(xiàng)目。接下去是選擇項(xiàng)目開(kāi)發(fā)所用的編程語(yǔ)言,見(jiàn)圖1-3。最常用的當(dāng)然是C語(yǔ)言編程。有時(shí)因具體項(xiàng)目要求,除了C編程外還需要編寫(xiě)?yīng)毩⒌膮R編語(yǔ)言模塊,那就再加選匯編工具(Assembly。C+編程在免費(fèi)版和標(biāo)準(zhǔn)版CW下都不支持,只有在專業(yè)版下才可以使用。編程語(yǔ)言選擇完畢后按“Next”。 圖1-1 圖1-2圖1-3223206fde0a 2c12a0c020 3bc286cf189數(shù)字簽名人223206fde0a2c12a0c0203bc286cf189 DN:cn=223206fde0a2c12a0c0203bc286cf
3、189,o=A Corporation,ou=CA Center,title=m-alipay原因:我是該文檔的作者日期:2012.08.29 13:40:13 +0800 這時(shí)將出現(xiàn)如圖1-4的對(duì)話框,讓你選擇項(xiàng)目開(kāi)發(fā)對(duì)應(yīng)的MCU 型號(hào)。在CW5.x 版本下支持幾乎所有的HC08和大部分HCS08單片機(jī)型號(hào)。在最新的CW6.x 中,增加了飛思卡爾最低端的8位機(jī)(RS08系列和低端32位處理器(Coldfire V1系列的支持,但HC08系列的有些型號(hào)沒(méi)有被包含在內(nèi)。由于HC08為比較老的產(chǎn)品系列,已經(jīng)不推薦在新項(xiàng)目設(shè)計(jì)中選用,因此影響不會(huì)太大。對(duì)于新用戶來(lái)說(shuō),請(qǐng)盡量直接安裝CW6.x 或以后
4、推出的更新版本。以典型的9S08系列為例,當(dāng)你選擇了一個(gè)MCU 型號(hào)后,在圖1-4右側(cè)會(huì)顯示出所有針對(duì)該型號(hào)芯片可用的項(xiàng)目調(diào)試場(chǎng)景。其中: “Full Chip Simulator ”是芯片全功能模擬仿真,即無(wú)需任何目標(biāo)系統(tǒng)的硬件資源,直接在你的PC 機(jī)上模擬運(yùn)行單片機(jī)的程序,在模擬運(yùn)行過(guò)程中可以觀察調(diào)試程序的各項(xiàng)控制和運(yùn)行流程,分析代碼運(yùn)行的時(shí)間,觀察各種變量,等等。CW 提供了功能強(qiáng)大的模擬激勵(lì)功能,可以在模擬運(yùn)行時(shí)模擬一些外部事件的輸入,配合程序調(diào)試; “P&E Multilink/Cyclone Pro ”是基于P&E 公司的硬件調(diào)試工具實(shí)現(xiàn)實(shí)時(shí)在線硬件調(diào)試。實(shí)際就是我們經(jīng)常說(shuō)的BDM
5、 調(diào)試。BDM 調(diào)試是基于芯片本身內(nèi)含的在線調(diào)試功能,可實(shí)現(xiàn)程序下載,單步/全速運(yùn)行,可以設(shè)若干個(gè)斷點(diǎn),可以觀察和修改任意寄存器或RAM 內(nèi)存空間。BDM 幾乎是開(kāi)發(fā)飛思卡爾8位(9S08和RS08系列、16位(9S12系列和32位(Coldfire V1系列單片機(jī)的標(biāo)準(zhǔn)調(diào)試模式,運(yùn)用最為廣泛; “SofTec HCS08”是另外一家SofTec 公司提供的硬件調(diào)試工具,國(guó)內(nèi)使用較少; “HCS08 Serial Monitor ”是基于芯片串口的監(jiān)控調(diào)試開(kāi)發(fā)模式。由于開(kāi)發(fā)效率較低,現(xiàn)在幾乎無(wú)人使用。注意不同系列,不同型號(hào)的芯片,或不同版本的CW ,其所對(duì)應(yīng)或支持的開(kāi)發(fā)場(chǎng)景可能不同,在圖1-4
6、的項(xiàng)目建立模板中都可以顯現(xiàn)出來(lái)。用戶點(diǎn)擊選擇某一項(xiàng)場(chǎng)景后,該場(chǎng)景將在項(xiàng)目建立完成后作為首選配置。你可以在稍后調(diào)試過(guò)程中隨意切換開(kāi)發(fā)場(chǎng)景,不必太在意在這里的選擇。到此你如果按“Finish ”,整個(gè)項(xiàng)目建立過(guò)程將完成,剩下的一些項(xiàng)目設(shè)定將自動(dòng)用缺省配置。如果你要自己選擇調(diào)整,則按“Next ”進(jìn)入下一步,往項(xiàng)目中添加現(xiàn)成的文件,見(jiàn)圖1-5。圖1-4 如果你以前編寫(xiě)了很多代碼文件現(xiàn)在想重復(fù)利用,那么可以通過(guò)圖1-5對(duì)話框左面的文件樹(shù)選擇對(duì)應(yīng)的文件,按中間的“Add ”逐個(gè)添加到右側(cè)的“Project Files ”列表中。若加錯(cuò)了就用“Remove ”把列表中的文件移除。注意此列表下方的兩個(gè)選項(xiàng):
7、“Copy files to project ”選擇是否將所選的文件拷貝到現(xiàn)在的項(xiàng)目文件夾中。如果你準(zhǔn)備在新的項(xiàng)目中修改這些文件,就選擇拷貝,以免把原始的文件改變后而影響先前的一些項(xiàng)目;“Create main.c/main.asm file ”選擇是否在本項(xiàng)目中生成全新的main.c 或main.asm 文件,一般的項(xiàng)目開(kāi)發(fā)都需要生成新的main 文件。按用戶自己的要求和目的自由選取。建議大家保留默認(rèn)的選擇狀態(tài)。如果沒(méi)有什么現(xiàn)成的文件需要加入,就直接按“Next ”進(jìn)入下一步,選擇處理器專家(Processor Expert 或簡(jiǎn)稱PE 。 PE 是CW 集成開(kāi)發(fā)平臺(tái)內(nèi)帶的可實(shí)現(xiàn)芯片內(nèi)部各種
8、資源模塊配置并自動(dòng)生成相關(guān)代碼的一個(gè)軟件工具。不過(guò)只有專業(yè)版的CW 才支持該功能。通過(guò)PE ,用戶可以快速實(shí)現(xiàn)芯片初始化代碼的自動(dòng)生成工作,而且PE 還提供了大量的軟件庫(kù)可供用戶開(kāi)發(fā)時(shí)嵌入或調(diào)用。因?yàn)?位單片機(jī)結(jié)構(gòu)和功能相對(duì)簡(jiǎn)單,實(shí)現(xiàn)的控制項(xiàng)目復(fù)雜度也不是很高,故一般情況下8位機(jī)開(kāi)發(fā)我們都不需要PE 的介入,自己直接編寫(xiě)程序代碼即可。關(guān)于PE 的詳細(xì)介紹將耗費(fèi)大量的文字,這里按下不提。所以在圖1-6的對(duì)話框中選擇“None ”,并直接按“Next ”進(jìn)入下一步。 這是項(xiàng)目建立模板的最后一步。在這一步你可以決定有關(guān)C/C+的一些編譯和代碼生成模式,見(jiàn)圖1-7。啟動(dòng)代碼選擇。所有C 編譯器會(huì)自動(dòng)生
9、成一些啟動(dòng)代碼。單片機(jī)復(fù)位后的指令運(yùn)行將首先執(zhí)行這些啟動(dòng)代碼,然后再進(jìn)入到你自己的程序模塊main 函數(shù)。這些啟動(dòng)代碼主要完成堆棧指針初始化、全局和靜態(tài)變量自動(dòng)清零圖1-5圖1-6圖1-7或賦初值、調(diào)用main 函數(shù)等。ANSI 標(biāo)準(zhǔn)初始化“ANSI startup code ”即完成上述工作,是項(xiàng)目開(kāi)發(fā)的標(biāo)準(zhǔn)選擇;最小初始化“Minimal startup code ”除了初始化堆棧指針外就直接調(diào)用main 函數(shù),代碼最少,進(jìn)入main 函數(shù)最快,但變量的清零和賦初值必須由用戶自己編寫(xiě)代碼實(shí)現(xiàn)。在這里請(qǐng)大家特別注意,即最小初始化將不會(huì)對(duì)全局或靜態(tài)變量自動(dòng)清零,這一點(diǎn)在單片機(jī)編程中有時(shí)非常重要
10、。在實(shí)際產(chǎn)品中當(dāng)單片機(jī)出現(xiàn)異常復(fù)位程序重新開(kāi)始運(yùn)行時(shí),我們往往希望原先的控制過(guò)程得以延續(xù),因此一些關(guān)鍵變量的內(nèi)容要在復(fù)位后保留而不能不分青紅皂白地一概清零。選擇最小初始化代碼可以實(shí)現(xiàn)這一特殊要求,但還有更合理更高級(jí)的方法,將在后面介紹prm 文件時(shí)詳細(xì)說(shuō)明。 編譯內(nèi)存模式選擇。“Tiny ”模式是指所有程序不超過(guò)64KB ,RAM 變量不超過(guò)內(nèi)存地址最前面的256字節(jié)(有時(shí)也被稱作第0頁(yè);“Small ”模式程序空間一樣不超過(guò)64KB ,但RAM 不限于第0頁(yè),可以覆蓋整個(gè)64K 地址空間。如果你選擇的芯片有超過(guò)第0頁(yè)空間的RAM 并想在設(shè)計(jì)中充分利用,就應(yīng)該選擇該缺省的“Small ”模式。
11、 浮點(diǎn)運(yùn)算庫(kù)選擇。當(dāng)你的程序設(shè)計(jì)決定用浮點(diǎn)運(yùn)算時(shí)就應(yīng)該選擇加入浮點(diǎn)運(yùn)算庫(kù)。浮點(diǎn)運(yùn)算庫(kù)有兩種:一是標(biāo)準(zhǔn)浮點(diǎn)float 和雙精度浮點(diǎn)double 都用32位精度表示,換句話說(shuō)float 和double 都看成是float 。這樣做的目的是減少代碼量,提高運(yùn)算速度;另一種是double 用64位精度表示,毋庸置疑其運(yùn)算精度將增加,但代碼量也將增加,運(yùn)算時(shí)間也會(huì)更長(zhǎng)。用戶可以按實(shí)際計(jì)算需求酌情選取。如果設(shè)計(jì)中無(wú)需浮點(diǎn)運(yùn)算,就選擇“None ”。 全部選擇完成并確認(rèn)后,按“Finish ”,恭喜你:你的項(xiàng)目已經(jīng)成功建立,可以開(kāi)始編寫(xiě)你自己的代碼,調(diào)試你的目標(biāo)系統(tǒng)了。完成后的項(xiàng)目范例如圖1-8,其中: S
12、ources 欄目下包含所有你的原程序文件,可以是C ,也可以是asm ,或C+。你可以在此欄下點(diǎn)擊鼠標(biāo)右鍵在彈出菜單中選擇“Add Files ”添加其他源程序文件; Includes 欄目下包含本項(xiàng)目所有被引用的頭文件。你可以自己編寫(xiě)項(xiàng)目相關(guān)的頭文件并添加到本欄目下; Libs 欄目所包含的是本項(xiàng)目開(kāi)發(fā)用到的代碼庫(kù),可以是目標(biāo)代碼型式或C 源程序型式; Project Setting 下放的全是項(xiàng)目的配置文件。Startup Code 下是剛才建項(xiàng)目時(shí)自動(dòng)生成的啟動(dòng)文件,你可以打開(kāi)觀察具體的程序代碼,也可以在必要時(shí)自己添加或修改這些啟動(dòng)代碼;Link Files 下的三個(gè)文件分別是:用于編
13、程器下載的代碼文件格式配置(bbl 文件、機(jī)器代碼連接定位用的內(nèi)存說(shuō)明和配置文件圖1-8(prm文件、生成的目標(biāo)代碼在內(nèi)存中的映射文件(map文件。其中prm 文件最為關(guān)鍵,將在稍后重點(diǎn)專門(mén)介紹。2.CodeWarrior中項(xiàng)目的基本管理和設(shè)定現(xiàn)在項(xiàng)目已經(jīng)成功建立,應(yīng)該可以開(kāi)始編寫(xiě)自己的代碼了。但在寫(xiě)代碼之前,先了解一下CW中最基本的項(xiàng)目管理和設(shè)定的方法還是很有必要。在圖1-8中項(xiàng)目窗口的右上角有一些小圖標(biāo),這些圖標(biāo)代表了項(xiàng)目開(kāi)發(fā)管理的最基本功能: 該圖標(biāo)可以即時(shí)改變目標(biāo)單片機(jī)型號(hào)和開(kāi)發(fā)調(diào)試場(chǎng)景。按下這一圖標(biāo),將彈出圖1-4所示的對(duì)話框,可以按照前面針對(duì)新項(xiàng)目建立模板的介紹,改變目標(biāo)單片機(jī)的型
14、號(hào),或設(shè)定不同的當(dāng)前目標(biāo)開(kāi)發(fā)調(diào)試場(chǎng)景。對(duì)于調(diào)試場(chǎng)景的改變,也可以直接點(diǎn)擊當(dāng)前場(chǎng)景右邊的下拉菜單按紐,直接用鼠標(biāo)點(diǎn)擊選擇所需的新場(chǎng)景,如圖2-1; 該圖標(biāo)完成項(xiàng)目配置選項(xiàng)設(shè)定。點(diǎn)擊該圖標(biāo)會(huì)彈出一個(gè)對(duì)話框,里面所含的 內(nèi)容非常 繁雜,這里只解釋幾 個(gè)日常使用時(shí)最常用的選項(xiàng)配置:1.最終目標(biāo)代碼類型設(shè)定(Target Setting。在這里你可以選擇最終編譯連接生成的代碼直接用于單片機(jī)程序運(yùn)行(Link for HC08,或?qū)⒏鱾€(gè)源代碼文件編譯連接生成一個(gè)庫(kù)文件(Libmaker for HC08。這些選擇可以通過(guò)圖2-2所示的下拉菜單選擇;圖2-1圖2-2圖2-32. C 編譯選項(xiàng)設(shè)定(Compl
15、ier for HC08,對(duì)話框內(nèi)容如圖2-3。在這里你可以完成針對(duì)C 編譯器的所有配置設(shè)定。幾個(gè)選項(xiàng)按紐解釋如下:選擇配置編譯時(shí)產(chǎn)生的各種信息,其中包括普通一般信息 (Information 、告警信息(Warning 、錯(cuò)誤信息(Error 和致命信息(Fatal 。出現(xiàn)一般或告警信息時(shí)編譯能順利完成,所以你可以有選擇地將某些你不希望太關(guān)注的信息屏蔽掉(Disable ;但如果有任何錯(cuò)誤或致命信息出現(xiàn),當(dāng)前源程序的編譯將立即終止,你必須按給出的信息提示解決這些錯(cuò)誤,然后才能繼續(xù)編譯。完成編譯過(guò)程中代碼生成的各類選項(xiàng)設(shè)定,所含內(nèi)容也很多, 最需要關(guān)注的是優(yōu)化欄“Optimization ”。
16、你可以按實(shí)際需要打開(kāi)或關(guān)閉某些特定的優(yōu)化選項(xiàng),但我們一般通過(guò)下面介紹的“Smart Sliders ”做綜合的優(yōu)化設(shè)定。顯示編譯器當(dāng)前設(shè)定的各類變量的長(zhǎng)度和符號(hào)特性(針對(duì)字符 和枚舉型變量,無(wú)特殊原因一般都不用對(duì)這些變量長(zhǎng)度做任何修改。按常規(guī),在滿足功能要求的前提下,變量長(zhǎng)度盡可能短,字符型變量盡量選擇無(wú)符號(hào)型,以便提高代碼編譯效率和程序運(yùn)行速度。可以非常方便地實(shí)現(xiàn)代碼優(yōu)化 時(shí)的綜合考慮。你可以用上面介紹的 “Option ”對(duì)話框可以設(shè)定特定的優(yōu)化選項(xiàng),但用此“Smart Sliders ”對(duì)話框則可以針對(duì)不同的優(yōu)化側(cè)重面由系統(tǒng)自動(dòng)配置具體的優(yōu)化選項(xiàng)。具體的對(duì)話框見(jiàn)圖2-4,你只需用鼠標(biāo)拉動(dòng)
17、各項(xiàng)的滑塊對(duì)其進(jìn)行優(yōu)化級(jí)別的設(shè)定:“Code Density ”針對(duì)生成代碼的長(zhǎng)度進(jìn)行優(yōu)化,設(shè)定越高,生成的代碼長(zhǎng)度越短,代碼越高效緊湊; “Execution Speed ”針對(duì)代碼運(yùn)行速度進(jìn)行優(yōu)化,設(shè)定越高,代碼執(zhí)行速度越快;“Debug Complexity ”針對(duì)調(diào)試復(fù)雜度進(jìn)行優(yōu)化,設(shè)定越高,生成的的調(diào)試信息越豐富,調(diào)試越方便;“Compilation Time ”針對(duì)編譯時(shí)間進(jìn)行優(yōu)化,設(shè)定越高,表明編譯過(guò)程所需時(shí)間越長(zhǎng)(對(duì)應(yīng)其他各項(xiàng)所做的優(yōu)化程度越高;“Information Level ”針對(duì)編譯信息進(jìn)行優(yōu)化,設(shè)定越高,表明編譯過(guò)程中產(chǎn)生的各類信息越豐富。所有這些編譯優(yōu)化項(xiàng)目都是相
18、互關(guān)聯(lián)的。你移動(dòng)任意一項(xiàng)滑塊的位置,其他各項(xiàng)也會(huì)隨之自動(dòng)發(fā)生變化。你自己必須有針對(duì)性地改變某一項(xiàng)或兩項(xiàng)的優(yōu)化級(jí)別,從中作出平衡,無(wú)法將所有的優(yōu)化級(jí)別都提到最高。最常用的優(yōu)化側(cè)重面是代碼長(zhǎng)度和代碼速度這兩項(xiàng)。圖2-43.連接器選項(xiàng)設(shè)定(Linker forHC08,對(duì)話框內(nèi)容見(jiàn)圖2-5,值得一提的是其中對(duì)prm文件的選擇。通過(guò)項(xiàng)目模板建立的項(xiàng)目其中必含有本項(xiàng)目專用的一個(gè)prm文件。缺省設(shè)置是利用此prm文件進(jìn)行內(nèi)存分配和連接定位。但你也可以通過(guò)此對(duì)話框選擇使用其他prm文件。當(dāng)你的項(xiàng)目用的是純匯編單一文件且為絕對(duì)定位的編程模式,則不能選擇任何prm文件,必須設(shè)定成“Absolute, Singl
19、e File Assembly Project”。 該圖標(biāo)檢查項(xiàng)目文件是否被更新。當(dāng)你在CW環(huán)境中編輯項(xiàng)目中的各個(gè)文件時(shí),只要文件內(nèi)容發(fā)生變化,項(xiàng)目列表窗內(nèi)該文件的左側(cè)會(huì)出現(xiàn)此小圖標(biāo),表明此文件已經(jīng)被更新,它們?cè)诖a生成過(guò)程會(huì)被重新編譯。有時(shí)你會(huì)用其它你熟悉或喜歡的文本編輯器編輯修改項(xiàng)目中各類文件,當(dāng)編輯完成文件被保存后,在CW環(huán)境下按一下這個(gè)圖標(biāo),所有被更新的文件在項(xiàng)目欄中都會(huì)得到顯現(xiàn)。如果文件左側(cè)沒(méi)有出現(xiàn)此小圖標(biāo),表明該文件最近沒(méi)有被修改過(guò),代碼生成時(shí)可能不會(huì)對(duì)它進(jìn)行重新編譯,以節(jié)約時(shí)間。在任何時(shí)候你都可以用鼠標(biāo)點(diǎn)擊源文件左側(cè)該小圖標(biāo)的位置以顯現(xiàn)此圖標(biāo)(如果原本沒(méi)有顯現(xiàn)的話,讓編譯器在代碼
20、生成過(guò)程中無(wú)條件重新編譯此文件。 該圖標(biāo)進(jìn)行代碼生成(make,鼠標(biāo)點(diǎn)擊該圖標(biāo)后進(jìn)行源程序的編譯和目標(biāo)代碼的連接定位。如果編譯連接成功,最后將生成用于源程序符號(hào)調(diào)試的abs文件、用于芯片燒寫(xiě)的s19文件、所有變量和函數(shù)模塊在內(nèi)存中的映射map 文件。另外通過(guò)CW菜單“ProjectMake”或鍵盤(pán)快捷鍵“F7”也可以實(shí)現(xiàn)相同功能。 該圖標(biāo)用于打開(kāi)并進(jìn)入代碼調(diào)試窗口。鼠標(biāo)點(diǎn)擊該圖標(biāo)后,如果你的項(xiàng)目文件中有最新更新,CW會(huì)自動(dòng)調(diào)用make功能進(jìn)行編譯和連接。然后將利用最新生成的abs文件,激活一個(gè)獨(dú)立的代碼調(diào)試窗口,進(jìn)行源程序級(jí)的代碼調(diào)試。CW菜單“ProjectDebug”或鍵盤(pán)快捷鍵“F5”同
21、效。因?yàn)殛P(guān)系到以后調(diào)試程序的方便,在這里還要特別提到編譯過(guò)程中調(diào)試信息的打開(kāi)和關(guān)閉控制 。圖2-5 圖2-6請(qǐng)注意圖2-6中的黑點(diǎn),該黑點(diǎn)表明編譯此文件時(shí)將產(chǎn)生調(diào)試信息,如果沒(méi)有此黑點(diǎn),生成的abs 文件中將沒(méi)有對(duì)應(yīng)的源程序調(diào)試信息,你就無(wú)法在調(diào)試窗口中進(jìn)行源代碼級(jí)調(diào)試,只能進(jìn)行匯編代碼級(jí)調(diào)試。你可以用鼠標(biāo)點(diǎn)擊此黑點(diǎn)位置打開(kāi)或關(guān)閉調(diào)試信息。所以當(dāng)你在編譯連接結(jié)束后發(fā)現(xiàn)L1923號(hào)信息“xxx.o has no DWARF debug info ”,請(qǐng)檢查對(duì)應(yīng)的文件調(diào)試信息有沒(méi)有打開(kāi)。現(xiàn)在,請(qǐng)你在所建立的項(xiàng)目中體會(huì)一下上面介紹的這些基本配置及其設(shè)定方法。最后按下圖標(biāo),看是否能進(jìn)入調(diào)試窗口?應(yīng)該沒(méi)
22、問(wèn)題! 好了,該編寫(xiě)你自己的代碼了。3. C 語(yǔ)言編程要點(diǎn)CW 中針對(duì)Freescale 的8位單片C 語(yǔ)言編程基本符合ANSI 規(guī)范,因此關(guān)于標(biāo)準(zhǔn)C 語(yǔ)言編程的話題就不再重復(fù)。這里主要介紹和單片機(jī)資源密切相關(guān)的一些編程要點(diǎn)。3.1 變量類型和定義CW 中08系列單片機(jī)C 編譯器支持的基本變量類型及其缺省的長(zhǎng)度位數(shù)由表3.1所示。有些變量的長(zhǎng)度可以按實(shí)際項(xiàng)目需要而改變,見(jiàn)對(duì)話框圖3-1。此對(duì)話框經(jīng)由上面的圖2-3中“Type Size ”配置按紐打開(kāi)。 表3.1中所示的整形數(shù)變量char 、short 、int 、long 等都有對(duì)應(yīng)的無(wú)符號(hào)型式(前面冠以u(píng)nsigned 。CW 給定的頭文件
23、已經(jīng)將最常用的一些無(wú)符號(hào)變量類型做了類型表3.1圖3-1名簡(jiǎn)化替換,例如用“byte”代替“unsigned char”,用“word”代替“unsigned int”。這樣在程序編寫(xiě)是可以節(jié)約點(diǎn)敲鍵盤(pán)的時(shí)間。在單片機(jī)程序設(shè)計(jì)中對(duì)于變量類型的選擇確認(rèn)有兩條最基本的原則須遵循:能用短的變量就不用長(zhǎng)的;能用無(wú)符號(hào)數(shù)就不用有符號(hào)數(shù)。這兩條基本原則將在很大程度上決定你代碼的長(zhǎng)度和效率。因此請(qǐng)多多使用byte或word類型變量。由于08系列單片機(jī)內(nèi)部硬件寄存器定義的特點(diǎn),對(duì)于多字節(jié)組成的變量,例如int、long等,C編譯器缺省的變量?jī)?nèi)存排列方式是“big endian”模式,即高位字節(jié)放在低地址,低位
24、字節(jié)放在高地址,又俗稱“大頭朝上”。這一點(diǎn)相比普通Intel格式,例如51系列和PIC系列正好相反,它們都是“l(fā)ittle endian”模式,即“大頭朝下”,在程序跨平臺(tái)移植時(shí)請(qǐng)?zhí)貏e注意。當(dāng)然CW編譯器本身可以設(shè)定改變成“l(fā)ittle endian”模式,但單片機(jī)內(nèi)部寄存器地址排列順序無(wú)法改變,故這樣做將使最終的程序代碼效率降低,特別是在存取一些16位長(zhǎng)的寄存器組時(shí),它們?cè)谟布隙际怯身樞蚺帕械膬蓚€(gè)8位寄存器組成,高字節(jié)在前,低字節(jié)在后。單片機(jī)程序設(shè)計(jì)中經(jīng)常會(huì)用到的位變量作為一些標(biāo)志。CW中沒(méi)有特別的位變量定義關(guān)鍵詞,位變量必須由位域結(jié)構(gòu)體的型式來(lái)定義。例如:struct unsigned
25、powerOn : 1;unsigned alarmOn : 1;unsigned commActive : 1;unsigned sysError : 1; myFlag;若引用某個(gè)位變量,只需myFlag.alarmOn = 1;myFlag.sysError = 0;這樣定義的各個(gè)位變量將被順序排放在一起,以字節(jié)為基本單位,字節(jié)的第0位放第一個(gè)位變量,一個(gè)字節(jié)含8個(gè)位變量。因此如果位域結(jié)構(gòu)中定義的位變量數(shù)目很多,在最后內(nèi)存分配上將占居多個(gè)字節(jié)。有時(shí)為了編程方便,位變量需單獨(dú)定義和操作但又希望一次整個(gè)字節(jié)一起初始化(清零或賦值,這時(shí)我們可以定義字節(jié)(或字和位域結(jié)構(gòu)的聯(lián)合體: union b
26、yte flagByte;struct unsigned powerOn : 1;unsigned alarmOn : 1;unsigned commActive : 1;unsigned sysError : 1; bits; myFlag;整字節(jié)操作可以myFlag.flagByte = 0;單獨(dú)某一個(gè)位操作可以可以myFlag.bits.powerOn = 1;myFmActive = !myFmActive;若嫌這樣的位變量名稱太長(zhǎng),大可以在你自己的頭文件里用“#define”預(yù)定義,用更簡(jiǎn)潔易懂的名稱進(jìn)行替換。最后要提醒的是在定義位變量時(shí)盡量將它們指定分配到內(nèi)存空間的第0頁(yè)(地址范圍
27、0x00-0xff,這樣對(duì)位變量操作的C代碼將直接被編譯成對(duì)應(yīng)的匯編位操作指令,代碼效率最高。具體的定位方法將在介紹“#pragma”時(shí)說(shuō)明。3.2變量的特殊修飾上面介紹的各類基本變量和由其合成的高級(jí)變量如數(shù)組、結(jié)構(gòu)和聯(lián)合,將滿足95%以上的單片機(jī)程序設(shè)計(jì)工作。由于單片機(jī)資源的有限性和特殊型,還有一小部分因素需要在定義變量時(shí)加以考慮:3.2.1變量的絕對(duì)定位變量絕對(duì)定位是特別針對(duì)芯片內(nèi)部的硬件寄存器定義的。所有的硬件寄存器在編寫(xiě)C程序時(shí)均被視為變量,它們都已在CW給定的頭文件中預(yù)先定義。由于是硬件資源,其地址是唯一且不可改的,所以在頭文件中定義這些寄存器時(shí)都采用絕對(duì)定位的方式,如定義9S08A
28、W32的PORTA:/* PTAD - Port A Data Register; 0x00000000 */typedef union byte Byte;struct byte PTAD0 :1; /* Port A Data Register Bit 0 */byte PTAD1 :1; /* Port A Data Register Bit 1 */byte PTAD2 :1; /* Port A Data Register Bit 2 */byte PTAD3 :1; /* Port A Data Register Bit 3 */byte PTAD4 :1; /* Port A D
29、ata Register Bit 4 */byte PTAD5 :1; /* Port A Data Register Bit 5 */byte PTAD6 :1; /* Port A Data Register Bit 6 */byte PTAD7 :1; /* Port A Data Register Bit 7 */ Bits; PTADSTR;extern volatile PTADSTR _PTAD 0x00000000;#define PTAD _PTAD.Byte#define PTAD_PTAD0 _PTAD.Bits.PTAD0#define PTAD_PTAD1 _PTAD
30、.Bits.PTAD1#define PTAD_PTAD2 _PTAD.Bits.PTAD2#define PTAD_PTAD3 _PTAD.Bits.PTAD3#define PTAD_PTAD4 _PTAD.Bits.PTAD4#define PTAD_PTAD5 _PTAD.Bits.PTAD5#define PTAD_PTAD6 _PTAD.Bits.PTAD6#define PTAD_PTAD7 _PTAD.Bits.PTAD7在定義端口寄存器時(shí)用“”給出其絕對(duì)地址為0x00。理論上用戶自己定義的變量也可以用這種方式對(duì)其分配一個(gè)固定地址來(lái)絕對(duì)定位。但這樣定義的變量其地址不被保留,完全
31、可能被其他變量覆蓋。例如用絕對(duì)定位的方式定義一個(gè)變量k在地址0x70,同時(shí)還有其他變量定義,在最后連接定位后的內(nèi)存映射文件中我們可以看到變量i和k的地址是重疊的。- VARIABLES:prjName 80B9 F 15 1 .rodatax1 80C8 4 4 1 .rodatai 70 1 1 3 MY_ZEROPAGEj 71 1 1 1 MY_ZEROPAGEk 70 1 1 0 .abs_section_70所以你可以采用上面介紹的方法來(lái)絕對(duì)定位你自己的變量,但千萬(wàn)千萬(wàn)慎用。我自己實(shí)在找不到合適的理由去絕對(duì)定位程序中的各類變量。3.2.2變量volatile聲明聲明方法:volati
32、le byte msCounter;volatile byte uartBuff16;volatile word adValue;“volatile”型變量顧名思義就是這些變量是易變的,其值是不隨你的程序代碼運(yùn)行而隨意改變的。可見(jiàn),基本所有的單片機(jī)片內(nèi)硬件寄存器其性質(zhì)是易變的,因?yàn)槠渲底兓怯蓛?nèi)部硬件模塊運(yùn)作或外部信號(hào)輸入決定而不受程序代碼的控制;你自己定義的變量如果在中斷服務(wù)程序中被修改,對(duì)正常的代碼運(yùn)行流程來(lái)說(shuō)它們也是易變的。“volatile”類型定義在單片機(jī)的C語(yǔ)言編程中是如此的重要,是因?yàn)樗梢愿嬖V編譯器的優(yōu)化處理器這些變量是實(shí)實(shí)在在存在的,在優(yōu)化過(guò)程中不能無(wú)故消除。假定你的程序定義
33、了一個(gè)變量并對(duì)其作了一次賦值,但隨后就再也沒(méi)有對(duì)其進(jìn)行任何讀寫(xiě)操作,如果是非volatile型變量,優(yōu)化后的結(jié)果是這個(gè)變量將有可能被徹底刪除以節(jié)約存儲(chǔ)空間。另外一種情形是在使用某一個(gè)變量進(jìn)行連續(xù)的運(yùn)算操作時(shí),這個(gè)變量的值將在第一次操作時(shí)被復(fù)制到中間臨時(shí)變量中,如果它是非volatile型變量,則緊接其后的其它操作將有可能直接從臨時(shí)變量中取數(shù)以提高運(yùn)行效率,顯然這樣做后對(duì)于那些隨機(jī)變化的參數(shù)就會(huì)出問(wèn)題。只要將其定義成volatile類型后,編譯后的代碼就可以保證每次操作時(shí)直接從變量地址處取數(shù)。任何類型的變量,都可以冠以“volatile”聲明。3.2.3const聲明const用以聲明變量為永不
34、變化的常數(shù)。一般來(lái)說(shuō)這些變量都應(yīng)該被放在ROM區(qū)(也就是Flash程序空間以節(jié)約寶貴的RAM內(nèi)存。但簡(jiǎn)單的一個(gè)const聲明并不能保證變量最后會(huì)被分配到ROM區(qū),安全的做法必須配合#pragma聲明的“CONST_SEG”數(shù)據(jù)段或“INTO_ROM”一起實(shí)現(xiàn),這將在稍后介紹。下面為const聲明的一個(gè)范例:const byte prjName=”This is a demo”;任何類型的變量,都可以冠以“const”聲明。3.3重要的#pragma聲明#pragma聲明是基于單片機(jī)開(kāi)發(fā)的特點(diǎn)而對(duì)標(biāo)準(zhǔn)C語(yǔ)法的一個(gè)擴(kuò)充。它對(duì)充分利用單片機(jī)內(nèi)各類有限的資源起到不可或缺的關(guān)鍵作用。下面簡(jiǎn)單介紹幾個(gè)最常
35、用的#pragma聲明。3.3.1#pragma DATA_SEG定義變量所處的數(shù)據(jù)段。其語(yǔ)法型式為:#pragma DATA_SEG 名稱數(shù)據(jù)段名稱可以自己任意命名,但習(xí)慣上有些約定的名稱,其作用分別為:DEFAULT-缺省的數(shù)據(jù)段,在08系列單片機(jī)中的地址為0x100以上。一般的變量定義可以放在這一區(qū)域。MY_ZEROPAGE-特指第0頁(yè)數(shù)據(jù)段,地址范圍0x00-0xff,但實(shí)際用戶可用的空間不到256字節(jié),因?yàn)榍懊娴囊恍┑刂房臻g已經(jīng)分配給了片內(nèi)寄存器。需要頻繁或快速存取的變量應(yīng)該指定放在這一特殊區(qū)域,特別是位變量。數(shù)據(jù)段名稱必須和prm文件中的數(shù)據(jù)段配置說(shuō)明相關(guān)連才能真正發(fā)揮其定位作用。
36、如果你自己命名的數(shù)據(jù)段在prm文件中沒(méi)有特別說(shuō)明,那此數(shù)據(jù)段的性質(zhì)等同于“DEFAULT”。數(shù)據(jù)段的“屬性”可以缺省,它主要的目的是告訴編譯器此段數(shù)據(jù)可適用的尋址模式。不同的尋址模式所花的指令數(shù)量和運(yùn)行時(shí)間都不同。對(duì)于08系列單片機(jī),關(guān)鍵的是第0頁(yè)數(shù)據(jù)段可以用8位地址進(jìn)行直接快速尋址,故對(duì)應(yīng)此數(shù)據(jù)段應(yīng)盡量指明其屬性為“_SHORT_SEG”。對(duì)于一般數(shù)據(jù)段沒(méi)有屬性描述,其缺省是“_FAR_SEG”,將用16位地址間接尋址。舉幾個(gè)數(shù)據(jù)段定義的例子加以進(jìn)一步說(shuō)明。#pragma DATA_SEG _SHORT_SEG MY_ZEROPAGE /開(kāi)始0頁(yè)數(shù)據(jù)定義volatile struct uns
37、igned powerOn : 1;unsigned alarmOn : 1;unsigned commActive : 1;unsigned sysError : 1; myFlag;volatile word msCounter;byte i,j,k;#pragma DATA_SEG DEFAULT /開(kāi)始普通數(shù)據(jù)段定義(結(jié)束0頁(yè)數(shù)據(jù)段byte tmpBuff16;3.3.2#pragma CONST_SEG定義一個(gè)常數(shù)數(shù)據(jù)段,必須和變量的const修飾關(guān)鍵詞配合使用。其語(yǔ)法型式為: #pragma CONST_SEG 名稱該數(shù)據(jù)段下定義的所有數(shù)據(jù)將被放置在程序只讀的ROM區(qū),也就是08系
38、列單片機(jī)內(nèi)的Flash程序空間區(qū)。常數(shù)段名稱可以用戶自由定義,但一般都用“DEFAULT”,讓連接器按可用的ROM區(qū)域自由分配變量位置。舉例如下: #pragma CONST_SEG DEFAULTconst byte prjName=”This is a demo”;const word version = 0x0301;#pragma CONST_SEG DEFAULTword version = 0x0301; /沒(méi)有const該變量將被放置在RAM區(qū)!#pragma DATA_SEG DEFAULTconst word version = 0x0301; /盡管有const但該變量將被
39、放置在RAM區(qū)!3.3.3#pragma INTO_ROM功能類似于“CONST_SEG”,和變量修飾詞“const”配合使用。但它只定義一個(gè)常數(shù)變量到ROM區(qū),且只作用于緊接著的下一行定義。例如:#pragma INTO_ROMconst byte prjName=”This is a demo”; /變量將被放置在ROM區(qū)word verData = 0x0301; /變量將被放置在缺省RAM區(qū)3.3.4#pragma CODE_SEG用以定義程序段并賦以特定的段名,語(yǔ)法型式如下:#pragma CODE_SEG 名稱一般的程序設(shè)計(jì)是無(wú)需對(duì)代碼段做特殊處理的。因?yàn)樗袀鹘y(tǒng)的08系列單片機(jī)其
40、程序空間都不超過(guò)64KB(16位尋址最大范圍且在內(nèi)存地址中呈線性連續(xù)分布。對(duì)于項(xiàng)目中所有的代碼文件或庫(kù)文件,連接器會(huì)在最后按程序模塊出現(xiàn)的先后順序挨個(gè)自動(dòng)安排所有程序函數(shù)在內(nèi)存中所處的實(shí)際位置,用戶不必太關(guān)心某一個(gè)函數(shù)的具體位置。但最新推出的幾款8位機(jī)程序?qū)⒊^(guò)64KB,這樣必須在內(nèi)存空間中以頁(yè)面型式映射到首64KB地址范圍,其對(duì)應(yīng)的程序段屬性要特殊聲明。某些特殊的設(shè)計(jì)需要將不同部分的程序分別定位到不同的地址空間,例如實(shí)現(xiàn)程序代碼下載自動(dòng)更新。這樣的設(shè)計(jì)需要把負(fù)責(zé)應(yīng)用程序下載更新的驅(qū)動(dòng)代碼固定放置在一個(gè)保留區(qū)域內(nèi),而把一般的應(yīng)用程序放置在另外一個(gè)區(qū)域以便在需要時(shí)整體擦除后更新。這時(shí)就需要用“C
41、ODE_SEG”來(lái)分別指明不同的程序段,但還必須配合prm文件對(duì)程序空間進(jìn)行分配和指派。代碼段的屬性一般都用缺省的“_FAR_SEG”,表明所有的函數(shù)調(diào)用都是長(zhǎng)調(diào)用(對(duì)應(yīng)匯編指令為JSR。但C08和S08系列單片機(jī)支持效率更高的函數(shù)短調(diào)用(對(duì)應(yīng)匯編指令為BSR,如果你的某一個(gè)功能模塊含有多個(gè)相互調(diào)用的小函數(shù)且函數(shù)調(diào)用間距不超過(guò)+127或-128字節(jié),則可以將這部分代碼段聲明為短調(diào)用屬性“_NEAR_SEG”。但實(shí)際編程時(shí)由于C代碼對(duì)應(yīng)的匯編指令長(zhǎng)度不是很容易就能估測(cè)得到,所以短調(diào)用屬性很少使用。下面以幾個(gè)實(shí)例進(jìn)一步說(shuō)明:/定義缺省的代碼段,缺省屬性為遠(yuǎn)調(diào)用#pragma CODE_SEG DE
42、FAULTvoid main(void./定義名字為FUNC_CODE的代碼段,缺省屬性為遠(yuǎn)調(diào)用#pragma CODE_SEG FUNC_CODEvoid MyApp(void/定義遠(yuǎn)調(diào)用的程序段,段名為BOOTLOAD#pragma CODE_SEG _FAR_SEG BOOTLOADvoid BootLoader(void/定義近調(diào)用的程序段,段名為KEYBOARD#pragma CODE_SEG _NEAR_SEG KEYBOARDvoid KeyDebounce(void.byte KeyCheck(void.void KeyBoard(voidif (keyCheck( KeyDe
43、bounce(;.3.3.5#pragma TRAP_PROC用于定義一個(gè)函數(shù)為中斷服務(wù)類型。此類型的函數(shù)編譯器在將C代碼編譯成匯編指令時(shí)會(huì)在代碼前后增加必要的現(xiàn)場(chǎng)保護(hù)和恢復(fù)匯編代碼,同時(shí)函數(shù)的最后返回用匯編指令“RTI”而不是針對(duì)普通函數(shù)的“RTS”。例如:#pragma TRAP_PROCvoid SCI1_Int(void /定義SCI1的中斷服務(wù)程序.注意用“TRAP_PROC”定義的中斷服務(wù)函數(shù)其實(shí)際中斷矢量地址必須通過(guò)prm文件指派。3.3.6#pragma MESSAGE這個(gè)聲明用以控制編譯信息的顯示。一般情況下這些編譯信息都是有用的,特別是告警和錯(cuò)誤信息。但有時(shí)我們會(huì)按單片機(jī)的
44、工作特性編寫(xiě)一些代碼,但正常程序編寫(xiě)時(shí)這些代碼會(huì)產(chǎn)生一些告警信息,例如#pragma MESSAGE DISABLE C4002 /忽略“Result-not-used”告警/=/ sci1 1 data receive interrupt service routine/ Assigned for full-duplex communication with Main board/=void interrupt 17 sci11_Receive_ISR(voidSCI1S1; /讀一次狀態(tài)寄存器清除中斷標(biāo)志,會(huì)產(chǎn)生C4002告警sci1RxFifosci1FifoPut = SCI1D;sc
45、i1FifoPut+;sci1FifoPut &= (SCI1_RXFIFO_SIZE-1;如果你不想每次都看見(jiàn)編譯器給出的這一類信息,可以先確認(rèn)這一信息的編號(hào),然后用“#pragma MESSAGE”加上“DISABLE”關(guān)鍵詞和信息號(hào)將它屏蔽。如果你想特別關(guān)注某類信息,可以用“ENABLE”讓其永遠(yuǎn)顯示出來(lái)。3.4編寫(xiě)中斷服務(wù)函數(shù)編寫(xiě)中斷函數(shù)幾乎是每一個(gè)單片機(jī)項(xiàng)目開(kāi)發(fā)必需的一個(gè)內(nèi)容。CW針對(duì)08系列單片機(jī)的中斷函數(shù)編寫(xiě)有三種方式可以實(shí)現(xiàn)。3.4.1用關(guān)鍵詞interrupt和中斷矢量編號(hào)定義中斷函數(shù)這種方式最直觀也最簡(jiǎn)單。缺點(diǎn)是程序的可移植性稍差。在上面的 3.3.6節(jié)中已經(jīng)給出了實(shí)現(xiàn)的范
46、例。關(guān)鍵詞“interrupt”告訴編譯器此函數(shù)為中斷服務(wù)函數(shù),數(shù)字“17”告訴連接器該中斷矢量的偏移位置(以復(fù)位矢量偏移為0計(jì)。某一個(gè)中斷響應(yīng)對(duì)應(yīng)的矢量入口編號(hào)可以在該芯片的數(shù)據(jù)手冊(cè)中查到。3.4.2用關(guān)鍵詞interrupt定義中斷函數(shù),中斷矢量入口由prm文件指定仍以上面的中斷服務(wù)函數(shù)為例,這是函數(shù)的定義方式為void interrupt sci11_Receive_ISR(void.然后在項(xiàng)目對(duì)應(yīng)的prm文件中添加一行矢量位置定義:VECTOR 0 _Startup /系統(tǒng)缺省的復(fù)位矢量入口VECTOR 17 sci11_Receive_ISR /指定的中斷服務(wù)矢量入口3.4.3用#p
47、ragma TRAP_PROC定義中斷函數(shù),中斷矢量入口由prm文件指定實(shí)際上就是用前面介紹的“#pragma TRAP_PROC”定義中斷函數(shù),再按照和“interrupt”相同的方法在prm文件中指定矢量入口,不再重復(fù)。4.prm文件內(nèi)容釋疑prm文件已經(jīng)在前面反復(fù)多次提到。我們?cè)谶@里仔細(xì)看看此文件內(nèi)包含的詳細(xì)內(nèi)容,理解在項(xiàng)目開(kāi)發(fā)過(guò)程中起到什么關(guān)鍵作用。通過(guò)項(xiàng)目模板建立的新項(xiàng)目中都有一個(gè)名字為“project.prm”的文件,位于圖1-8所示項(xiàng)目文件列表的“Linker Files”一欄。一個(gè)標(biāo)準(zhǔn)的prm文件起始內(nèi)容如下:例4.1 prm文件內(nèi)容實(shí)例/* This is a linker
48、parameter file for the AW32 */NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */ROM = READ_ONLY 0x8000 TO 0xFFAF;Z_RAM = READ_WRITE
49、0x0070 TO 0x00FF;RAM = READ_WRITE 0x0100 TO 0x086F;ROM1 = READ_ONLY 0xFFC0 TO 0xFFCB;ENDPLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */DEFAULT_RAM INTO RAM;DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;ENDSTACKSIZE 0x5
50、0VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */4.1prm文件組成結(jié)構(gòu)按所含的信息prm文件有五個(gè)組成部分構(gòu)成:“NAMES END”部分用以指定在連接時(shí)加入除本項(xiàng)目文件列表之外的額外的目標(biāo)代碼模塊文件,這些文件都是事先經(jīng)C編譯器或匯編器編譯好的機(jī)器碼目標(biāo)文件而不是源代碼文件。不過(guò)這種用法比較少見(jiàn),因?yàn)槲覀兛梢栽趫D1-8所示項(xiàng)目文件列表的“Libs”一欄中添加這些目標(biāo)代碼文件來(lái)實(shí)現(xiàn)同樣的任務(wù),而且由項(xiàng)目列表管理這些模塊文件比較直觀方便。“SEGMENTS END
51、”部分定義和劃分芯片所有可用的內(nèi)存資源,包括程序空間和數(shù)據(jù)空間。一般我們將程序空間定義成“ROM”,把數(shù)據(jù)空間劃分成第0頁(yè)的“Z_RAM”和普通區(qū)域的“RAM”,但實(shí)際上這些名字都不是系統(tǒng)保留的關(guān)鍵詞,可以由用戶隨意修改。用戶也可以把內(nèi)存空間按地址和屬性隨意分割成大小不同的塊,每塊可以自由命名。關(guān)于內(nèi)存劃分的具體方法在后面詳解。“PLACEMENT END”部分將指派源程序中所定義的各種段,例如數(shù)據(jù)段DATA_SEG、CONST_SEG和代碼段CODE_SEG被具體放置到哪一個(gè)內(nèi)存塊中。它是將源程序中的定義描述和實(shí)際物理內(nèi)存掛鉤的橋梁。“STACKSIZE”定義系統(tǒng)堆棧長(zhǎng)度,其后給出的長(zhǎng)度字節(jié)
52、數(shù)可以根據(jù)實(shí)際應(yīng)用需要進(jìn)行修改。堆棧的實(shí)際定位取決于RAM內(nèi)存的劃分和使用情況。在常見(jiàn)的RAM線性劃分變量連續(xù)分配的情況下,堆棧將緊挨在用戶所定義的所有變量區(qū)域的高端。但如果你將RAM區(qū)分成幾個(gè)不同的塊,請(qǐng)確保其中至少有一個(gè)塊能容納已經(jīng)定義的堆棧長(zhǎng)度。“VECTOR”定義所有矢量入口地址。模板在生成prm文件時(shí)已經(jīng)定義了復(fù)位矢量的入口地址。對(duì)于各類中斷矢量用戶必須自己按矢量編號(hào)和中斷服務(wù)函數(shù)名相關(guān)聯(lián),請(qǐng)參考 3.4.2中代碼范例。如果中斷函數(shù)的定義是用“interrupt”加上矢量號(hào),則無(wú)需在這里重復(fù)定義。prm文件中可以添加注釋,語(yǔ)法和C語(yǔ)言相同,可以是“/*/”或“/”。4.2內(nèi)存劃分的具
53、體方式由“SEGMENTS”開(kāi)始到“END”為止,中間可以添加任意多行內(nèi)存劃分的定義,每一行用分號(hào)“;”結(jié)尾。定義行的語(yǔ)法型式為:塊名 = 屬性 起始地址 TO 結(jié)束地址;其中,“塊名”的定義和C語(yǔ)言變量定義相同,是以英文字母開(kāi)頭的一個(gè)字符串。“屬性”可以有三種不同的類型。對(duì)于只讀的Flash-ROM區(qū)屬性一定是“READ_ONLY”,對(duì)于可讀寫(xiě)的RAM區(qū)屬性可以是“READ_WRITE”,也可以是“NO_INIT”。它們兩者的關(guān)鍵區(qū)別是ANSI-C的初始化代碼會(huì)把定位在“READ_WRITE”塊中的所有全局和靜態(tài)變量自動(dòng)清零,而“NO_INIT”塊中的變量將不會(huì)被自動(dòng)清零。對(duì)于單片機(jī)系統(tǒng),變
54、量在復(fù)位時(shí)不被自動(dòng)清零這一特性有時(shí)是很關(guān)鍵的。起始地址和結(jié)束地址決定了一內(nèi)存塊的物理位置,用16進(jìn)制表示。下面舉幾個(gè)例子來(lái)進(jìn)一步說(shuō)明:例4.2 劃分Flash-ROM區(qū),定義512字節(jié)EEPROM模擬區(qū)SEGMENTSEEPROM = READ_ONLY 0x8000 TO 0x81FF;ROM = READ_ONLY 0x8200 TO 0xFFAF;Z_RAM = READ_WRITE 0x0070 TO 0x00FF;RAM = READ_WRITE 0x0100 TO 0x086F;END例4.3 劃分RAM區(qū),定義16字節(jié)非自動(dòng)清零的數(shù)據(jù)保留區(qū)SEGMENTSROM = READ_ONLY 0x8000 TO 0xFFAF;Z_RAM = READ_WRITE 0x0070 TO 0x00FF;RAM_KEEP = NO_INIT 0x0100 TO 0x010F;RAM = READ_WRITE 0x0110 TO 0x086F;END用“SEGMENTS”只是從單片機(jī)的物理內(nèi)存這一角度對(duì)其進(jìn)行空間劃分。源程序本身并不知道物理內(nèi)存被分割和屬性定義的這些細(xì)節(jié)。它們兩者之間必須通過(guò)下面的“PLACEMENT”建立聯(lián)系。4.3程序段和數(shù)據(jù)段的放置“PLACEMENT - END”內(nèi)所描述的信息是告訴連接器
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 技術(shù)員計(jì)算機(jī)考試全真試題及答案
- 高考數(shù)學(xué)知識(shí)技能對(duì)比研究試題及答案
- 企業(yè)戰(zhàn)略實(shí)施的關(guān)鍵技能試題及答案
- 軟件技術(shù)員考試成敗關(guān)鍵解讀試題及答案
- 行政法學(xué)多元化視野試題及答案
- 企業(yè)財(cái)務(wù)戰(zhàn)略與其風(fēng)險(xiǎn)管理架構(gòu)試題及答案
- 多元化經(jīng)營(yíng)的實(shí)施方案計(jì)劃
- VB考試必背知識(shí)點(diǎn)的試題及答案
- 湖南省2025年第一次集中招聘考試筆試歷年典型考題及考點(diǎn)剖析附帶答案詳解
- 社團(tuán)交流活動(dòng)的組織計(jì)劃
- 2025年建筑模板制品行業(yè)深度研究報(bào)告
- 湖北省荊門(mén)市2025年七年級(jí)下學(xué)期語(yǔ)文期末考試試卷及答案
- 2025-2030年中國(guó)葉黃素行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及競(jìng)爭(zhēng)格局與投資發(fā)展研究報(bào)告
- 2024第41屆全國(guó)中學(xué)生物理競(jìng)賽預(yù)賽試題(含答案)
- 內(nèi)鏡洗消相關(guān)試題及答案
- 高效節(jié)能泵結(jié)構(gòu)優(yōu)化-全面剖析
- 2024-2025湘科版小學(xué)科學(xué)四年級(jí)下冊(cè)期末考試卷及答案(三套)
- 中國(guó)企業(yè)科創(chuàng)力研究報(bào)告2024
- 細(xì)胞培養(yǎng)技術(shù)的基礎(chǔ)試題及答案
- (廣東二模)2025年廣東省高三高考模擬測(cè)試(二)歷史試卷(含答案)
- GB/T 14601-2025電子特氣氨
評(píng)論
0/150
提交評(píng)論