簡(jiǎn)述HI-TECH C編譯器的PICC18命令行驅(qū)動(dòng)
出處:neo980 發(fā)布于:2011-09-01 22:38:26
PICl8F系列產(chǎn)品是美國(guó)微芯科技公司的產(chǎn)品,用戶多采用C語(yǔ)言進(jìn)行編程設(shè)計(jì),HI-TECH SoftwarePty.Ltd.公司的PICC18編譯器得到了廣泛應(yīng)用。計(jì)算機(jī)語(yǔ)言便于人編寫(xiě),閱讀,維護(hù)。低階機(jī)器語(yǔ)言是計(jì)算機(jī)能直接解讀、運(yùn)行的。編譯器將源程序(Source program)作為輸入,翻譯產(chǎn)生使用目標(biāo)語(yǔ)言(Target language)的等價(jià)程序。源代碼一般為語(yǔ)言 (High-level language), 如 Pascal、C、C++、C# 、Java 等,而目標(biāo)語(yǔ)言則是匯編語(yǔ)言或目標(biāo)機(jī)器的目標(biāo)代碼(Object code),有時(shí)也稱作機(jī)器代碼(Machine code)。大部分應(yīng)用者使用MPLAB集成環(huán)境進(jìn)行編程,在一些重要或大型應(yīng)用的開(kāi)發(fā)中有一些問(wèn)題。本文所闡述的HI-TECH C編譯器的PICC18命令行驅(qū)動(dòng),正是要解決這些問(wèn)題。
編譯是從源代碼(通常為高階語(yǔ)言)到能直接被計(jì)算機(jī)或虛擬機(jī)執(zhí)行的目標(biāo)代碼(通常為低階語(yǔ)言或機(jī)器語(yǔ)言)的翻譯過(guò)程。然而,也存在從低階語(yǔ)言到高階語(yǔ)言的編譯器,這類編譯器中用來(lái)從由高階語(yǔ)言生成的低階語(yǔ)言代碼重新生成高階語(yǔ)言代碼的又被叫做反編譯器。也有從一種高階語(yǔ)言生成另一種高階語(yǔ)言的編譯器,或者生成一種需要進(jìn)一步處理的的中間代碼的編譯器(又叫級(jí)聯(lián))。典型的編譯器輸出是由包含入口點(diǎn)的名字和地址, 以及外部調(diào)用(到不在這個(gè)目標(biāo)文件中的函數(shù)調(diào)用)的機(jī)器代碼所組成的目標(biāo)文件。一組目標(biāo)文件,不必是同一編譯器產(chǎn)生,但使用的編譯器必需采用同樣的輸出格式,可以鏈接在一起并生成可以由用戶直接執(zhí)行的可執(zhí)行程序。
1 HI-TECH C編譯器
HI-TECH C編譯器提供了C語(yǔ)言的標(biāo)準(zhǔn)特性,同時(shí)還加上許多為了適應(yīng)PIC系列單片機(jī)的特定硬件特性而設(shè)計(jì)的擴(kuò)展功能,并與匯編器集成在一起提供共享鏈接器和庫(kù)管理工具,因而應(yīng)用較為廣泛。編譯器可以生成用來(lái)在與編譯器本身所在的計(jì)算機(jī)和操作系統(tǒng)(平臺(tái))相同的環(huán)境下運(yùn)行的目標(biāo)代碼,這種編譯器又叫做“本地”編譯器。另外,編譯器也可以生成用來(lái)在其它平臺(tái)上運(yùn)行的目標(biāo)代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬件平臺(tái)時(shí)非常有用。“源碼到源碼編譯器”是指用一種高階語(yǔ)言作為輸入,輸出也是高階語(yǔ)言的編譯器。例如: 自動(dòng)并行化編譯器經(jīng)常采用一種高階語(yǔ)言作為輸入,轉(zhuǎn)換其中的代碼,并用并行代碼注釋對(duì)它進(jìn)行注釋(如OpenMP)或者用語(yǔ)言構(gòu)造進(jìn)行注釋(如FORTRAN的DOALL指令)。
當(dāng)編譯一個(gè)程序時(shí),就有許多操作既可由命令行驅(qū)動(dòng)程序CLD(command-line driver),也可由HPD集成環(huán)境驅(qū)動(dòng)程序(覡在為HI-TIDE)獨(dú)立完成。在任一情況下,HPD或CLD采用編程者指定的選項(xiàng)來(lái)決定哪一個(gè)內(nèi)部應(yīng)用需要執(zhí)行。
用戶提供的適合于目標(biāo)系統(tǒng)的C語(yǔ)言源程序、匯編語(yǔ)言程序,都可以用CLD或HPD進(jìn)行操作。當(dāng)用CLD時(shí),用命令行的任何命令來(lái)選擇操作方式;當(dāng)使用HPD時(shí),在源文件列表對(duì)話框中鍵入需要的文件。
通常使用的源程序可以被編譯到一個(gè)庫(kù)文件中,這樣文件可被編譯器更方便地處理、更快速地訪問(wèn)。編譯器可以像其他源文件一樣直接接收庫(kù)文件,并用。lib擴(kuò)展名指定文件的類型,因而庫(kù)文件必須按這種方式命名。庫(kù)文件在使用CLD時(shí),用命令行的任何命令來(lái)選擇操作方式;或使用HPD時(shí),在“源文件列表…”對(duì)話框中鍵入需要的庫(kù)文件。
實(shí)際上,在使用MPLAB IDE集成環(huán)境進(jìn)行開(kāi)發(fā)時(shí),是使用了CLD的,清除方向標(biāo)志,在字符串的比較,賦值,讀取等一系列和rep連用的操作中,di或si是可以自動(dòng)增減的而不需要人來(lái)加減它的值,cld即告訴程序si,di向前移動(dòng),std指令為設(shè)置方向,告訴程序si,di向后移動(dòng)。只是在平常的應(yīng)用中沒(méi)有注意到而已。下面是在MPLAB IDE中對(duì)C源文件進(jìn)行編譯的結(jié)果:

從上面的結(jié)果可以看出,編譯器使用了CLD命令,二者是可以統(tǒng)一。只有了解了CLD后,才能對(duì)HI-TECHC編譯器有更深入的理解和掌握。
2 PICC18命令行驅(qū)動(dòng)器
PICC18是調(diào)用DOS命令行的驅(qū)動(dòng)器,用來(lái)編譯和/或鏈接C語(yǔ)言程序的。PICC18的基本命令格式為:
PICC18[選項(xiàng)]files[文件庫(kù)]
通常在文件名之前用破折號(hào)“——”來(lái)識(shí)別,實(shí)際上這不是必須的。文件可以是源文件(C或匯編程序)和目標(biāo)文件的混合。文件庫(kù)是庫(kù)名字的一個(gè)列表,或一L選項(xiàng)源文件。類型如表1所列。

PICC18將檢查每個(gè)文件并完成適當(dāng)?shù)牟僮鳌文件將被編譯,匯編文件將被匯編。,所有通過(guò)編譯或匯編得到的目標(biāo)文件或者在命令行中明確列出的目標(biāo)文件,都將與標(biāo)準(zhǔn)運(yùn)行代碼庫(kù)和任何用戶指定庫(kù)鏈接,除非它們被某種選項(xiàng)禁止。僅當(dāng)引用源代碼時(shí),庫(kù)中函數(shù)才能被鏈接成結(jié)果輸出文件。僅用目標(biāo)文件作為凋用PICC18,意味著僅執(zhí)行鏈接階段,這是一種典型的用法。
2.1 長(zhǎng)命令行
PICC18驅(qū)動(dòng)器是32位的視窗軟什,可以處理超過(guò)128字符長(zhǎng)的命令行。驅(qū)動(dòng)器可以通過(guò)DOS的批文件調(diào)用,或通過(guò)命令文件傳遞選項(xiàng)。當(dāng)使用批文件時(shí),送入PICC18的命令行必須列成一行。在命令文件中,驅(qū)動(dòng)器選項(xiàng)可以被傳送至多行,這是通過(guò)一個(gè)空格鍵緊接一個(gè)反斜線“\”再接一個(gè)回車鍵來(lái)分開(kāi)各行實(shí)現(xiàn)的。例如,一個(gè)命令文件可以包含:

因?yàn)闆](méi)有提供命令行指令,因此PICC18將讀xyz.cmd得到它的命令行指令。命令文件也可以通過(guò)@符號(hào)讀出。
2.2 PICC18編譯器選項(xiàng)
編譯器的設(shè)定主要基于ROM代碼的生成。表2列出了PICC18編譯器的幾個(gè)常用的重要選項(xiàng)。

①定義處理器類型:-processor。
這一選項(xiàng)決定了哪個(gè)處理器被使用。例如,用命令行-18c452來(lái)編澤PICl8C452。用戶也可以增加自己的處理器到編譯器。
②指定ROM偏移量:-Aaddress。
英文簡(jiǎn)稱ROM。ROM所存數(shù)據(jù),一般是裝入整機(jī)前事先寫(xiě)好的,整機(jī)工作過(guò)程中只能讀出,而不像隨機(jī)存儲(chǔ)器那樣能快速地、方便地加以改寫(xiě)。ROM所存數(shù)據(jù)穩(wěn)定 ,斷電后所存數(shù)據(jù)也不會(huì)改變;其結(jié)構(gòu)較簡(jiǎn)單,讀出較方便,因而常用于存儲(chǔ)各種固定程序和數(shù)據(jù)。除少數(shù)品種的只讀存儲(chǔ)器(如字符發(fā)生器)可以通用之外,不同用戶所需只讀存儲(chǔ)器的內(nèi)容不同。為便于使用和大批量生產(chǎn) ,進(jìn)一步發(fā)展了可編程只讀存儲(chǔ)器(PROM)、可擦可編程序只讀存儲(chǔ)器(EPROM)和電可擦可編程只讀存儲(chǔ)器(EEPROM)。例如早期的個(gè)人電腦如Apple II或IBM PC XT/AT的開(kāi)機(jī)程序(操作系統(tǒng))或是其他各種微電腦系統(tǒng)中的韌體(Firmware)。
-A選項(xiàng)是用來(lái)為ROM映像區(qū)指定基地址的。若該選項(xiàng)要求引導(dǎo)輸入這樣的調(diào)試工具,則該詞試工具期望ROM映射地址始于非零地址。該選項(xiàng)影響所有基于ROM的部分,包括復(fù)位和中斷向量,以及放置代碼和常量數(shù)據(jù)的鏈接器分類。
③優(yōu)化器及優(yōu)化優(yōu)先級(jí)選項(xiàng):-O和-Zg。
-O表示調(diào)用PICC18的優(yōu)化器,-Zg選項(xiàng)在代碼生成路徑調(diào)用全局優(yōu)先級(jí)。這對(duì)于代碼長(zhǎng)度的縮減及內(nèi)部RAM的使用有著重要意義。該優(yōu)先級(jí)沒(méi)有傳遞優(yōu)先級(jí)苛刻,但對(duì)代碼長(zhǎng)度的縮減很有意義。在一個(gè)執(zhí)行函數(shù)的基礎(chǔ)上,全局優(yōu)先級(jí)可以化寄存器的使用。
該選項(xiàng)默認(rèn)的級(jí)為1。優(yōu)先級(jí)可以設(shè)置為l~9的任意(9為優(yōu)先級(jí))。數(shù)字表明優(yōu)先級(jí)試圖縮減代碼的程度。
了解了命令行驅(qū)動(dòng)后,對(duì)第1節(jié)中在MPLAB IDE中對(duì)C源文件進(jìn)行編譯的例子就有了更深入的理解。
3 命令行驅(qū)動(dòng)應(yīng)用
下面介紹命令行驅(qū)動(dòng)在實(shí)際應(yīng)用中的一些例子。通過(guò)這些例子,可以對(duì)命令行驅(qū)動(dòng)的應(yīng)用有一個(gè)初步的認(rèn)識(shí),并可以此為基礎(chǔ),對(duì)PICC18編譯器進(jìn)行深入的學(xué)習(xí)和應(yīng)用。
3.1 命令行驅(qū)動(dòng)編譯源文件
在Win2000下進(jìn)行如下操作:執(zhí)行“開(kāi)始”→“運(yùn)行”命令,然后輸入“CMD”;或執(zhí)行“開(kāi)始”→“程序”→“附件”→“命令提示符”命令,彈出cmd.exe的界面,如圖1所示。若cmd.exe中出現(xiàn)的當(dāng)前目錄不是在C盤根目錄下,則需要通過(guò)輸入命令“cd c:\”進(jìn)入C盤根目錄。輸入“cd htsoft\picl8\bin”命令,進(jìn)入PICC18.exe軟件所在目錄,如圖2所示。

(1)編譯Izqmwyz.c
輸入“PICC18-18f458 lzqmwyz.c”,含義是使用PICC18.exe編譯器對(duì)lzqmwyz.c源文件進(jìn)行編譯,單片機(jī)型號(hào)為
18f458(即PIC18F458單片機(jī))。這時(shí)會(huì)輸出所需要的編譯結(jié)果,生成的文件中,以hex為擴(kuò)展名的lzqmwyz.hex較為重要。若源程序有語(yǔ)法錯(cuò)誤,還會(huì)顯示出錯(cuò)信息及所在的行。
注意:在cmd.exe界面中進(jìn)行操作時(shí),所有的源文件均存放在PICC18.exe同一目錄下(PICC18.exe默認(rèn)安裝目錄是c:\HTSOFT\PIC18\Bin)。在本文中,PICC18均采用此默認(rèn)安裝目錄。這里lzqmwyz.c存放在c:\HTSOFT\PICl8\Bin下。
(2)-noerrata選項(xiàng)
“-noerrata”選項(xiàng)不使能輸出代碼的錯(cuò)誤修改,而缺省時(shí),會(huì)對(duì)編譯器的輸出代碼有所修改。有些芯片沒(méi)有正誤表,不會(huì)用編譯器對(duì)此修改。這個(gè)選項(xiàng)可以用編譯器來(lái)禁止任何正誤表方位。當(dāng)正誤表變化時(shí),會(huì)安全禁止。對(duì)有些芯片,PICC18對(duì)程序的代碼長(zhǎng)度進(jìn)行了限制(一般限制在0x4000之內(nèi),即16KB之內(nèi))。這就是同上的PICl8應(yīng)用論壇中。有些編程者則在程序中編寫(xiě)了下面的提示程序:

若編譯的程序代碼超出了這個(gè)范圍,將會(huì)列出出錯(cuò)信息。
圖3是對(duì)solar050408.c源文件編譯時(shí),代碼超過(guò)了Ox4000長(zhǎng)度時(shí)出現(xiàn)的提示信息。
使用-noerrata選項(xiàng)時(shí),solar050408.c源文件編譯就會(huì)得到正確的編譯結(jié)果,命令為“PICC18-18f458solar050408.c-o-zgl-noerrata”。命令中“-o”表示調(diào)用PICC18的優(yōu)化器,“-zg1”表示調(diào)用優(yōu)化器時(shí)采用的優(yōu)先級(jí)為1級(jí)。

3.2 庫(kù)文件生成及應(yīng)用
3.2.1 C源文件
(1)包含main函數(shù)的lzqmwyzl.c源文件

(2)包含function_X3函數(shù)的funcx3.c源文件

3.2.2 生成庫(kù)文件
用3.2.1中的兩個(gè)文件直接創(chuàng)建一個(gè)應(yīng)用程序,這在平時(shí)的應(yīng)用中是經(jīng)常用到的。這里介紹將funcx3.c源文件生成庫(kù)文件,再由lzqmwyz.c調(diào)用的方法,也就是自己制作庫(kù)文件進(jìn)行使用。
(1)生成obj文件
將funcx3.c源文件存放在PICC18.exe同一目錄下,然后在cmd.exe中輸入“PICC18-18f458-C funcx3.c”。-C選項(xiàng)是將幾個(gè)源文件編譯成目標(biāo)文件(。obj文件)。這里是將funcx3.c的源文件編譯成funcx3.obj文件,然后就可以在c:\HTSOFT\PICl8\Bin目錄下找到funcx3.obj文件。
(2)生成lib庫(kù)文件
在cmd.exe中輸入“l(fā)ibr r fun.lib runcx3.obj”。其中r選項(xiàng)為替換模塊。fun.lib是由函數(shù)funcx3.c制作的庫(kù)文件的文件名,如圖4所示。

3.2.3 庫(kù)文件應(yīng)用
圖5是使用3.2.1的lzqmwyzl.c源文件和調(diào)用3.2.2制作的庫(kù)文件fun.1ib的工程。這時(shí)使用到的就只有l(wèi)zqmwyzl.c源文件和fun.1ib文件,而不必再應(yīng)用包含runetton_X3函數(shù)的funcx3.c源文件。

結(jié)語(yǔ)
PICC18編譯器命令行驅(qū)動(dòng)在實(shí)踐中有許多應(yīng)用,只有了解了它,才能對(duì)C編譯器有更多、更深入的認(rèn)識(shí)。采用PICC18編寫(xiě)的單片機(jī)源代碼,編譯環(huán)境MPLABv7.62;編譯器PICC18pro9.60,程序中雖然未采用RTOS,但采用了任務(wù)段處理的方式,即每個(gè)運(yùn)行周期只運(yùn)行一個(gè)任務(wù)。并將面向?qū)ο蟮乃枷胍隒中,一個(gè)文件相當(dāng)于一個(gè)類。對(duì)初學(xué)者有一定的參考意義。有些代碼考慮到易讀性和通用性犧牲了代碼的效率。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開(kāi)發(fā)實(shí)踐指南2026/1/6 10:40:19
- 嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計(jì)實(shí)踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開(kāi)啟異核通信新時(shí)代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識(shí)2025/7/14 16:59:04
- 高速PCB阻抗控制核心實(shí)操規(guī)范
- 高速數(shù)字系統(tǒng)(如DDR、SerDes)中的信號(hào)完整性濾波
- MOSFET在UPS電源中的應(yīng)用解析
- 電源管理IC在物聯(lián)網(wǎng)設(shè)備中的應(yīng)用
- SMT連接器焊接缺陷分析
- MOSFET在汽車電子中的應(yīng)用要求
- 通信設(shè)備電源管理IC應(yīng)用解析
- 通信設(shè)備連接器選型與設(shè)計(jì)
- PCB電磁兼容性(EMC)設(shè)計(jì)核心實(shí)操規(guī)范
- 物聯(lián)網(wǎng)節(jié)點(diǎn)低功耗設(shè)計(jì):信號(hào)鏈中的濾波與功耗管理









