新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 學(xué)習(xí)方法與實(shí)踐 > PICCl8編譯器命令行驅(qū)動(dòng)及其應(yīng)用

PICCl8編譯器命令行驅(qū)動(dòng)及其應(yīng)用

——
作者:王春燕 劉和平 劉釗 陳捷 時(shí)間:2007-11-12 來源:?jiǎn)纹瑱C(jī)及嵌入式系統(tǒng)應(yīng)用 收藏

    在微芯公司MPLAB IDE集成開發(fā)環(huán)境下采用C語言進(jìn)行開發(fā)時(shí),遇到了編寫的程序代碼未超過芯片代碼長度,但編譯不成功的問題。 

    奉文介紹HI-TECH公司C的原理和命令行驅(qū)動(dòng)器的工作過程,并以解決程序代碼限制和庫文件的生成、使用為例,說明其具體實(shí)現(xiàn)方法,解決采用進(jìn)行應(yīng)用的實(shí)際工程問題。 


    引 言 
     

    PICl8F系列產(chǎn)品是美國微芯科技公司的高檔產(chǎn)品,用戶多采用C語言進(jìn)行編程設(shè)計(jì),HI-TECH SoftwarePty.Ltd.公司的PICCl8得到了廣泛應(yīng)用。大部分應(yīng)用者使用MPLAB集成環(huán)境進(jìn)行編程(見參考文獻(xiàn)[1]),在一些重要或大型應(yīng)用的開發(fā)中有一些問題。例如,如何編寫C語言的庫文件,如何對(duì)有代碼限制的程序進(jìn)行編譯等,若只是采用傳統(tǒng)方式編程,則達(dá)不到應(yīng)有的效果。本文所闡述的HI-TECH C的PICCl8命令行驅(qū)動(dòng),正是要解決這些問題。 

    1 HI-TECH C編譯器 
    

    HI-TECH C編譯器提供了C語言的標(biāo)準(zhǔn)特性,同時(shí)還加上許多為了適應(yīng)PIC系列的特定硬件特性而設(shè)計(jì)的擴(kuò)展功能,并與匯編器集成在一起提供共享鏈接器和庫管理工具,因而應(yīng)用較為廣泛。 
     

    當(dāng)編譯一個(gè)程序時(shí),就有許多操作既可由命令行驅(qū)動(dòng)程序CLD(command-line driver),也可由HPD集成環(huán)境驅(qū)動(dòng)程序(覡在為HI-TIDE)獨(dú)立完成。在任一情況下,HPD或CLD(HPD下的菜單選項(xiàng),或CLD的命令行)采用編程者指定的選項(xiàng)來決定哪一個(gè)內(nèi)部應(yīng)用需要執(zhí)行,以及什么選項(xiàng)需要發(fā)送給每個(gè)應(yīng)用。 
     

    用戶提供的適合于目標(biāo)系統(tǒng)的C語言源程序、匯編語言程序,都可以用CLD或HPD進(jìn)行操作。當(dāng)用CLD時(shí),用命令行的任何命令來選擇操作方式;當(dāng)使用HPD時(shí),在源文件列表對(duì)話框中鍵入需要的文件。 
     

    通常使用的源程序可以被編譯到一個(gè)庫文件中,這樣文件可被編譯器更方便地處理、更快速地訪問。編譯器可以像其他源文件一樣直接接收庫文件,并用.lib擴(kuò)展名指定文件的類型,因而庫文件必須按這種方式命名。庫文件在使用CLD時(shí),用命令行的任何命令來選擇操作方式;或使用HPD時(shí),在“源文件列表…”對(duì)話框中鍵入需要的庫文件。 
     

    實(shí)際上,在使用MPLAB IDE集成環(huán)境進(jìn)行開發(fā)時(shí),是使用了CLD的,只是在平常的應(yīng)用中沒有注意到而已。下面是在MPLAB IDE中對(duì)C源文件進(jìn)行編譯的結(jié)果: 


    從上面的結(jié)果可以看出,編譯器使用了CLD命令,二者是可以統(tǒng)一。只有了解了CLD后,才能對(duì)HI-TECHC編譯器有更深入的理解和掌握。

 

    2 PICCl8命令行驅(qū)動(dòng)器 
    

    PICCl8是調(diào)用DOS命令行的驅(qū)動(dòng)器,用來編譯和/或鏈接C語言程序的。PICCl8的基本命令格式為: 
    

    piccl8[選項(xiàng)]files[文件庫] 
    

    通常在文件名之前用破折號(hào)“——”來識(shí)別,實(shí)際上這不是必須的。文件可以是源文件(C或匯編程序)和目標(biāo)文件的混合。文件庫是庫名字的一個(gè)列表,或一L選項(xiàng)源文件。目標(biāo)文件和庫文件通過文件類型或擴(kuò)展名被PICCl8區(qū)分,類型如表1所列。 



    PICCl8將檢查每個(gè)文件并完成適當(dāng)?shù)牟僮?。C文件將被編譯,匯編文件將被匯編。最后,所有通過編譯或匯編得到的目標(biāo)文件或者在命令行中明確列出的目標(biāo)文件,都將與標(biāo)準(zhǔn)運(yùn)行代碼庫和任何用戶指定庫鏈接,除非它們被某種選項(xiàng)禁止。僅當(dāng)引用源代碼時(shí),庫中函數(shù)才能被鏈接成結(jié)果輸出文件。僅用目標(biāo)文件(如沒有源文件)作為凋用PICCl8,意味著僅執(zhí)行鏈接階段,這是一種典型的用法。用PICC18的C選項(xiàng)編譯幾個(gè)自己編寫的源文件作為目標(biāo)文件,然后僅用生成的目標(biāo)文件和適當(dāng)?shù)膸?及適當(dāng)選項(xiàng))調(diào)用PICCl8來創(chuàng)建最終程序。 


    2.1 長命令行 
     

    PICCl8驅(qū)動(dòng)器是32位的視窗軟什,可以處理超過128字符長的命令行。驅(qū)動(dòng)器可以通過DOS的批文件調(diào)用,或通過命令文件傳遞選項(xiàng)。當(dāng)使用批文件時(shí),送入PICCl8的命令行必須列成一行。在命令文件中,驅(qū)動(dòng)器選項(xiàng)可以被傳送至多行,這是通過一個(gè)空格鍵緊接一個(gè)反斜線“\”再接一個(gè)回車鍵來分開各行實(shí)現(xiàn)的。例如,一個(gè)命令文件可以包含: 

     
     

    因?yàn)闆]有提供命令行指令,因此PICC18將讀xyz.cmd得到它的命令行指令。命令文件也可以通過@符號(hào)讀出。 


    例如:
    PICCl8@xyz.cmd 


    2.2 PICCl8編譯器選項(xiàng) 
     

    編譯器的設(shè)定主要基于ROM代碼的生成。表2列出了PICCl8編譯器的幾個(gè)常用的重要選項(xiàng)。 



    ①定義處理器類型:-processor。 

    這一選項(xiàng)決定了哪個(gè)處理器被使用。例如,用命令行-18c452來編澤PICl8C452。用戶也可以增加自己的處理器到編譯器。

 
    ②指定ROM偏移量:-Aaddress。
    -A選項(xiàng)是用來為ROM映像區(qū)指定基地址的。若該選項(xiàng)要求引導(dǎo)輸入這樣的調(diào)試工具,則該詞試工具期望ROM映射地址始于非零地址。該選項(xiàng)影響所有基于ROM的部分,包括復(fù)位和中斷向量,以及放置代碼和常量數(shù)據(jù)的鏈接器分類。如果基地址指定到外部存儲(chǔ)器,則必須用-ROM選項(xiàng)指定外部存儲(chǔ)器的可用地址范圍。

 
    ③優(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ì)于代碼長度的縮減及內(nèi)部RAM的使用有著重要意義。該優(yōu)先級(jí)沒有傳遞優(yōu)先級(jí)苛刻,但對(duì)代碼長度的縮減很有意義。在一個(gè)執(zhí)行函數(shù)的基礎(chǔ)上,全局優(yōu)先級(jí)可以最優(yōu)化寄存器的使用。它也利用代碼中常最的傳遞來避免不必要的存儲(chǔ)器訪問。 
    

    該選項(xiàng)默認(rèn)的級(jí)為1(最低優(yōu)先級(jí))。優(yōu)先級(jí)可以設(shè)置為l~9的任意一級(jí)(9為最高優(yōu)先級(jí))。數(shù)字表明優(yōu)先級(jí)試圖縮減代碼的程度。對(duì)于PICCl8,高于3的優(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)用中的一些例子。通過這些例子,可以對(duì)命令行驅(qū)動(dòng)的應(yīng)用有一個(gè)初步的認(rèn)識(shí),并可以此為基礎(chǔ),對(duì)PICCl8編譯器進(jìn)行深入的學(xué)習(xí)和應(yīng)用。 


     3.1 命令行驅(qū)動(dòng)編譯源文件 
     

    在Win2000下進(jìn)行如下操作:執(zhí)行“開始”→“運(yùn)行”命令,然后輸入“CMD”;或執(zhí)行“開始”→“程序”→“附件”→“命令提示符”命令,彈出cmd.exe的界面,如圖1所示。若cmd.exe中出現(xiàn)的當(dāng)前目錄不是在C盤根目錄下,則需要通過輸入命令“cd c:\”進(jìn)入C盤根目錄。輸入“cd htsoft\picl8\bin”命令,進(jìn)入PICCl8.exe軟件所在目錄 (默認(rèn)安裝時(shí)的目錄),如圖2所示。 



    (1)編譯Izqmwyz.c 
     

    輸入“piccl8-18f458 lzqmwyz.c”,含義是使用piccl8.exe編譯器對(duì)lzqmwyz.c源文件進(jìn)行編譯,型號(hào)為18f458(即PIC18F458)。這時(shí)會(huì)輸出所需要的編譯結(jié)果,生成的文件中,以hex為擴(kuò)展名的lzqmwyz.hex較為重要。若源程序有語法錯(cuò)誤,還會(huì)顯示出錯(cuò)信息及所在的行。 
    

    注意:在cmd.exe界面中進(jìn)行操作時(shí),所有的源文件均存放在PICC18.exe同一目錄下(PICCl8.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ì)編譯器的輸出代碼有所修改。有些芯片沒有正誤表,不會(huì)用編譯器對(duì)此修改。這個(gè)選項(xiàng)可以用編譯器來禁止任何正誤表方位。當(dāng)正誤表變化時(shí),會(huì)安全禁止。對(duì)有些芯片(如PIC18F458等),PICCl8對(duì)程序的代碼長度進(jìn)行了限制(一般限制在0x4000之內(nèi),即16KB之內(nèi))。這就是同上的PICl8應(yīng)用論壇中。有些網(wǎng)友提出代碼有限制的原因。有些編程者則在程序中編寫了下面的提示程序: 


    若編譯的程序代碼超出了這個(gè)范圍,將會(huì)列出出錯(cuò)信息。
    圖3是對(duì)solar050408.c源文件編譯時(shí),代碼超過了Ox4000長度時(shí)出現(xiàn)的提示信息。



     使用-noerrata選項(xiàng)時(shí),solar050408.c源文件編譯就會(huì)得到正確的編譯結(jié)果,命令為“piccl8-18f458solar050408.c-o-zgl-noerrata”。命令中“-o”表示調(diào)用PICCl8的優(yōu)化器,“-zg1”表示調(diào)用優(yōu)化器時(shí)采用的優(yōu)先級(jí)為1級(jí)。 


     3.2 庫文件生成及應(yīng)用 


     3.2.1 C源文件 


     (1)包含main函數(shù)的lzqmwyzl.c源文件 



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

   
     3.2.2 生成庫文件 
     

     用3.2.1中的兩個(gè)文件直接創(chuàng)建一個(gè)應(yīng)用程序,這在平時(shí)的應(yīng)用中是經(jīng)常用到的。這里介紹將funcx3.c源文件生成庫文件,再由lzqmwyz.c調(diào)用的方法,也就是自己制作庫文件進(jìn)行使用。 


     (1)生成obj文件 
     

     將funcx3.c源文件存放在PICCl8.exe同一目錄下,然后在cmd.exe中輸入“PICCl8-18f458-C funcx3.c”。-C選項(xiàng)是將幾個(gè)源文件編譯成目標(biāo)文件(.obj文件)。這里是將funcx3.c的源文件編譯成funcx3.obj文件,然后就可以在c:\HTSOFT\PICl8\Bin目錄下找到funcx3.obj文件。 


     (2)生成lib庫文件 
     

     在cmd.exe中輸入“l(fā)ibr r fun.lib runcx3.obj”。其中r選項(xiàng)為替換模塊。fun.lib是由函數(shù)funcx3.c制作的庫文件的文件名,如圖4所示。 



      3.2.3 庫文件應(yīng)用 
     

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


       結(jié)語
    

       PICCl8編譯器命令行驅(qū)動(dòng)在實(shí)踐中有許多應(yīng)用,只有了解了它,才能對(duì)C編譯器有更多、更深入的認(rèn)識(shí)。限于篇幅,本文只起拋磚引玉的作用,提供一種思路供廣大編程者參考;同時(shí),對(duì)于PICC也有相應(yīng)的參考價(jià)值。 



評(píng)論


相關(guān)推薦

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

關(guān)閉