嵌入式Linux應用開發環境E.E.大綱1建立開發環境2建立交叉編譯環境3開發工具GNU的使用4.開發工具GNU的MakeE.E.1建立開發環境1建立開發環境2建立交叉編譯環境3開發工具GNU的使用E.E.1建立開發環境目前常見的嵌入式作業系統WindowCEPlamEPOCLinuxuClinuxEmbedix(實驗平台所採用)其他版本嵌入式Linux....自行開發系統E.E.1建立開發環境建立Linux開發環境的方案有下列幾種:基於PC上的Windows作業系統下的CYGWN在Windows下安裝虛擬機器,在虛擬機器下安裝Linux虛擬機器:VMMachine本系統平台所採用的開發方式直接在PC平台上安裝LinuxE.E.1建立開發環境虛擬機器VMMachine將物理機器、操作系統、及應用程序,打包為一個〝檔案〞,其稱之為虛擬機器。開發環境所使用虛擬機器由VMWare公司所提供的免費虛擬機器VMPlayer優點:免費、可直接執行已包裝作業系統的VM檔、版本可提供Windows版本及Linux版本。缺點:沒辦法自行製作VM檔、與平台上作業系統共享資源、無法修改VM檔設定內容。VMWare官方網站建立開發環境機器虛擬化的轉換硬體配置(CPU、硬碟、記憶體)X86架構應用層作業系統應用層作業系統硬體配置(CPU、硬碟、記憶體)虛擬裝置應用層X86架構實體作業平台虛擬作業平台圖13.1實體機器虛擬化轉換E.E.1建立開發環境VMPlayer執行圖圖13.2VMPlayer進入畫面E.E.1建立開發環境VMPlayer虛擬機器所需的vmx可由Easyvmx產生網址:建立開發環境VMPlayer執行Fedora6圖13.3VMPlayer執行畫面E.E.2建立交叉編譯環境1建立開發環境2建立交叉編譯環境3開發工具GNU的使用E.E.2建立交叉編譯環境何謂交叉編譯利用執行在開發主機的編譯器編譯來源程式碼產生在實驗平台上執行的目標程式的過程。編譯器的生成依賴相應的函式庫,而函式庫得靠編譯器翻譯。為何要用交叉編譯大多數Linux軟體開發大多採用本機開發,但不適用於嵌入式系統軟體開發。因為平台無法提供足夠資源在實驗板上執行開發工具及除錯工具。E.E.2建立交叉編譯環境交叉編譯整體架構來源程式碼GCC編譯器目的二進制檔經過編譯編譯後產生經過乙太網路、RS232傳輸圖13.4嵌入式系統交叉編譯過程目標實驗板編譯主機E.E.2建立交叉編譯環境如何建立交叉編譯環境1.安裝編譯工具2.建立目標平台與開發主機的連結¾RS232串列傳輸¾NFS伺服器架設所使用的交叉編譯工具-GNU開發工具其支援使用者可使用C/C++語言開發應用程式可生成高效率執行程式,易掌握的編譯語言執行於Linux的GNUgcc編譯器其功能為:編譯Linux核心及其底下執行應用程式做交叉編譯,編譯其他CPU上的程式E.E.2建立交叉編譯環境GNU開發工具包含內容C編譯器GCCC++編譯器G++組合語言AS鏈結器LD二進位轉換工具(QBJCOPY、OBJDUMP)除錯工具(GDB、FDBSERVER、KGDB)建立其餘不同硬體平台的開發程式庫GNU相關參考網站:建立交叉編譯環境安裝交叉編譯工具(1)-選擇GNU開發工具GNU交叉工具圖13.5GNU開發工具畫面E.E.2建立交叉編譯環境安裝交叉編譯工具(2)-安裝GNU開發工具安裝路徑圖13.6安裝GNU工具E.E.2建立交叉編譯環境安裝交叉編譯工具(3)-設定GNU編譯路徑設定方式:在終端機底下輸入下列命令exportPATH=“GNU開發工具路徑”:$PATHGNU工具路徑圖13.7GNU編譯路徑設定畫面E.E.3開發工具GNU的使用1建立開發環境2建立交叉編譯環境3開發工具GNU的使用E.E.3開發工具GNU的使用GCC是GNU組織的免費C編譯器。在Linux發佈的預設安裝及目前的自由軟體源代碼基本都能在GCC編譯器下編譯執行。GCC編譯器的使用,針對編譯系統內核或應用程式都是可以用到的。E.E.3開發工具GNU的使用在Linux作業系統中,對一個用標準C語言寫的來源程式進行編譯,採用GNU的gcc編譯器。例如,下列簡單的Hello來源程式(hello.c):voidmain(){printf(“Hellotheworld\n”);}E.E.3開發工具GNU的使用要編譯這個程式,只需在Linux的bash提示符號下輸入命令:$gcc-ohellohello.cgcc編譯器就會產生一個hello的可執行檔案。在hello.c的目前目錄下執行./hello就可以看到程式的輸出結果,如下圖。圖13.8應用程式執行畫面E.E.3開發工具GNU的使用gcc最基本的用法是:gcc[options]file...,option是以”-“字元所開始的各種選項,file是相關的檔案名稱。使用gcc的時候,須給予必要的選項和檔案名稱。gcc編譯過程中,實質上是以預處理,編譯,組譯和鏈結這四步驟為主。具體完成上列步驟,是由gcc後面option以及檔案類型來決定的。E.E.3開發工具GNU的使用option有許多設定,介紹幾個最常用的選項:-o:表示要求編譯器產生指定檔案名的可執行檔;-c:表示只求編譯器進行編譯,而不進行鏈結,產生以原始檔案名命名,但把其尾碼由.c或.cc變成.o的目標檔;-g:要求編譯器在編譯時提供以後對程式進行除錯的資訊E.E.3開發工具GNU的使用-E:表示編譯器對原始檔案只進行預處理就停止,不做編譯,彙編和鏈結;-S:表示編譯器只進行編譯,而不做彙編和鏈結;-O:編譯器對程式提供的編譯最佳化選項。在編譯時使用,可使產生的執行檔執行效率提高;-Wall:指定產生全部的警告資訊。E.E.3開發工具GNU的使用編譯器在原始檔案編譯過程中會產生某種形式的目標檔(objectfiles)。上述過程中,外部的符號引用並沒被解釋或被替換,然後經過鏈結器來鏈結這些目標檔和標準檔頭,產生出可執行檔案。同上述過程,一個目標檔案中可對其他檔案內的符號被引用的方式加以解釋,且回報不能被解釋的引用為何。E.E.3開發工具GNU的使用GNU編譯器產生目標檔的預設格式為elf(executivelinkedfile)格式。Linux系統採用的可執行鏈結檔案的通用檔案格式。elf格式由若干區段(section)所組成,如無特別指明,基本是由標準c來源程式代碼產生的目標檔。E.E.3開發工具GNU的使用目標檔期中中包含以下的區段:.text(本文區段)包含程式的指令代碼.data(資料區段)包含固定的資料,如常數,字串等.bss(未初始化資料區段)包含未初始化的變數和陣列等。E.E.4.開發工具GNU的Make在一個專案中,假設其內部包含若干的來源代碼檔案,而這些來源代碼檔案中是被其他來源代碼檔案所包含的。當其中一個檔案被改動時,包含它的那些原始檔案都需進行重新編譯鏈結,工作量是非常大的。GNU提供負責處理相關流程的工具-GNUMakeE.E.4.開發工具GNU的MakeMake:負責從專案的來源代碼中產生最終可執行檔和其他非來源代碼檔案的工具。其命令本身可具備四種參數旗標、巨集定義、描述檔案名稱和目標檔案名稱。其標準形式為:make[flags][macrodefinitions][targets]E.E.4.開發工具GNU的MakeUNIX底下旗標位元flags其含義為:-ffile,指定file檔為描述檔。file參數為‘-’符號,描述檔指向標準輸入。如沒有‘-f’參數,系統將預設目錄下名稱為makefile,或者是名為Makefile的檔案為描述檔案。在Linux中,GNUmake工具在目前工作目錄中按照GNUmakefile、makefile、Makefile的順序搜索makefile檔。E.E.4.開發工具GNU的MakeFlag其他選項功能-i:忽略命令執行返回的出錯資訊。-s:沈默模式,在執行之前不輸出相應的命令行資訊。-r:禁止使用隱含規則。-n:非執行模式,輸出所有執行命令,但並不執行。-t:更新目標檔。E.E.4.開發工具GNU的Make-q:make操作將根據目標檔是否已經更新返回“0”或非0的狀態資訊。-p:輸出所有巨集定義和目標檔描述。-d:Debug模式,輸出有關檔和檢測時間的詳細資訊。E.E.4.開發工具GNU的MakeLinux下make旗標位元的常用選項與Unix系統中稍有不同,下面只列出了不同部分:-cdir:在讀取makefile之前改變到指定的目錄dir。-Idir:當包含其他makefile檔時,利用該選項指定搜索目錄。-h:help文字擋,顯示所有的make選項。-w:在處理makefile之前與之後,都顯示其工作目錄。E.E.4.開發工具GNU的Maketarget:通過命令列參數中的target,可指定make要編譯的目標,且可同時定義編譯多個目標。操作時需按照從左向右順序依次地編譯target選項中所指定的目標檔。如果命令列中沒有指定目標,系統會預設target指向描述檔中的第一個目標檔。E.E.4.開發工具GNU的Makemake實現對來源代碼的操作是通過叫makefile的檔案完成。makefile是用bash語言撰寫,主要描述了有關哪些目標檔是從哪些依賴文件中產生的,用何種命令來進行這個產生過程。bash語言是很像BASIC語言的一種命令解釋語言。E.E.4.開發工具GNU的Makemakefile一般稱為“makefile”或“Makefile”。也可指定別的檔案作為makefile。沒指定檔案時,make會尋找預設檔案。如要指定其他檔案,可利用下列命令選項指定makefile檔:$make-fmakefilenameE.E.4.開發工具GNU的Make一個簡單的makefile範例executable:main.oio.ogccmain.oio.o-oexecutablemain.o:main.cgcc-Wall-O-g-cmain.c-omain.oio.o:io.cgcc-Wall-O-g-cio.c-oio.oE.E.4.開發工具GNU的Makemakefile說明(1)executable:main.oio.ogccmain.oio.o-oexecutableexecutable是makefile最終要產生的目標檔。說明executable依賴於兩個目標檔main.o和io.o,只要executable比它依賴的檔中的任何一個舊的話,下一行的命令就會被執行。檢查檔案main.o和io.o的日期之前,會往下查找那些把main.o或io.o做為目標檔的規則。注意:下面命令必須以Tab鍵做空格。E.E.4.開發工具GNU的Makemakefile說明(2)main.o:main.cgcc-Wall-O-g-cmain.c-omain.oio.o:io.cgcc-Wall-O-g-cio.c-oio.oMake開始找main.o的規則,其依賴檔是main.c。而makefile後面檔案找不到產生這依賴檔的規則。開始檢查依賴檔修改日期,當其比main.o日期新時,則規則下面命令gcc-cmain.c–omain.o就會執行,以更新檔main.o。下列io.o部份也是如此。E.E.4.開發工具GNU的Makemake巨集其功用可節省描述檔重複的文字,利用巨集的方式,也可容易修改描述檔的內容。巨集定義方式:在makefile中,任意一行的開始寫下該巨集名