白明明
摘 要:隨著嵌入式技術蓬勃發展,對嵌入式軟件技術提出新挑戰。 嵌入式軟件開發常用交叉編譯方式,以Linux為主機系統,GNU工具鏈為交叉編譯系統,為嵌入式系統生成可執行程序為最主要的方案。本文闡述基于GNU工具鏈的嵌入式開發實踐,圍繞如何在Window上用Cygwin模擬器、GNU及其它開源工具,如Android的NDK進行嵌入式開發,探討其中一些關鍵的實現技術和實踐細節。關鍵詞:Cygwin、GNU、交叉編譯、NDK、編譯工具鏈一、引言隨著對Linux的深入研究,針對某類應用開發一個嵌入式系統漸漸成為熱門。這需要一套開發工具,而商業開發工具都非常昂貴。GNU自由軟件給開發者帶來了福音,它是免費的,遵循GPL協議。引導程序、嵌入式操作系統內核、運行庫乃至應用程序都可用它來開發。本文提出了一種在Window上基于Cygwin模擬器用GNU 工具開發軟件的方式。二、交叉編譯概述編譯器常分類為: “本地”編譯器:生成用于它本身處計算機和操作系統相同的環境下運行的目標代碼。 交叉編譯器:生成用于其他平臺上運行的目標代碼,對新硬件平臺非常有用。 三、開發環境的建立GNU工具基于Linux環境。在Windows下使用它方式:用終端軟件登陸Linux服務器;安裝虛擬機和Linux系統; 安裝Linux模擬器;可單機運行,占用資源少,但配置麻煩。3.1 安裝CygwinCygwin 是一套可運行在Windows上的Linux 模擬器。它類似Windows cmd 的Shell環境界面,可使用大部分Linux 軟件和功能。用它可以方便地在Windows構建出Linux 平臺的庫或應用程序。它包含一套在Windows 系統下實現POSIX 系統調用的API,還有一套GUN 開發工具,可以方便地在Windows 下進行跨平臺開發。先下載安裝程序并運行,下一步“選擇安裝類型”,選擇網絡安裝;下一步“選擇安裝目錄”。下一步“選擇本地包目錄”設置下載的安裝包放置路徑。下一步 “網絡連接類型”。下一步“選擇下載網站”。下一步“選擇下載安裝包”加載安裝包列表;安裝測試如下:運行cygwin,在彈出的命令行窗口輸入:cygcheck -c cygwin命令。cygcheck –c檢查安裝cygwin已經安裝的包的版本和狀態然后依次輸入gcc –version, make –version等進行測試。3.2 配置腳本運行Cygwin會先執行.bash_profile。若要自定義的工具。例如,則在文件“source ~/.git-completion.bash”前加“PATH=$PATH:/cygdrive/d/ android-ndk-r11c/build”。表示把D盤的“android-ndk-r11c/build”路徑添加到搜索路徑中。下面是自動化編譯腳本的關鍵內容,它用于設置編譯工具鏈,主目錄,啟動模擬器:set PATH=/cygdrive/d/build-arm-tools/arm-2012.09/bin;%PATH%.. …if %a% equ y G:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico /bin/env _T=%V /bin/bash --login -i -c "source xxx.sh"" G:\cygwin\bin\mintty.exe "為mintty所在位置。-i用于指定窗口左上角圖標。/bin/env _T=%V用于設置在啟動mintty后的shell里面環境變量_T的值,_T為路徑參數,其中%V表示windows傳入的路徑參數(可在.bash_profile使用_T)。/bin/bash -l (-l相當于--login)表示啟動登錄shell。--login -i -c "source xxx.sh"登陸bash執行shell腳本xxx.sh。四、編譯工具鏈Linux嵌入式系統的交叉編譯工具鏈,可從芯片提供商處獲取;或者從網上下載;或者自己編譯生成。后者需要各種源代碼,至少需要binutils、gcc、linux、C運行時庫(glibc、newlib、bionic等)。4.1 GCC嵌入式系統用交叉編譯在本機編譯目標系統的可執行軟件,在這個過程中需要使用交叉編譯工具鏈,包括交叉編譯的編譯器、連接器、目標庫等。如果在ARM目標板上運行Linux系統,因為Linux內核代碼使用GCC編譯器,為此GNU提供了GCC編譯器針對ARM目標平臺的支持。由于GCC開源的特點,用戶可以手動編譯生成符合自己需要的ARM GCC編譯器等。如Linux平臺ARM的交叉編譯器是arm-linux-gcc。編譯交叉編譯工具鏈要用到庫和源代碼,如Linux內核代碼、glibc庫、工具程序、內核線程包、編譯器。還可通過編譯工具鏈的腳本crosstool建立交叉編譯環境,通過指定不同的參數,crosstool腳本建立指定版本的GCC編譯器和glibc程序庫,還可以直接下載已經編譯好的工具鏈,由于linux內核與GCC編譯器存在依賴關系,選擇目標平臺Linux內核版本后,可以參考內核版本說明對GCC編譯器的最低要求選擇GCC編譯器版本。步驟如下:1.建立Linux內核頭文件:交叉編譯器需要通過內核頭文件獲取目標平臺的系統函數調用信息,需要通過對其腳本配置生成目標平臺的頭文件。2.編譯安裝binutils:它是交叉編譯工具鏈中的工具包,包括連接器、匯編器和用于目標文件和檔案的工具,針對二進制代碼的維護。3.編譯安裝GCC的C編譯器:建立arm-linux-gcc交叉編譯器,用于編譯內核、bootloader等,并建立glibc庫。4.編譯安裝glibc庫:GNU glibc庫是Linux系統程序的組成部分,用戶開發的目標平臺應用程序,需要glibc庫的支持。5.編譯安裝GCC的C、C++編譯器:在建立的glibc庫基礎上,編譯gcc支持C和C++語言程序的編譯。4.2 NDKAndroid NDK(Native Development Kit)原生開發工具集,允許Android應用開發人員把他們的C和/或C++源文件所編譯生成的原生機器代碼嵌入到他們的應用程序包中。Android VM支持通過JNI調用原生代碼,因此在Android平臺上可以支持“Java+ C and/or C++”的編程方式。NDK是Android平臺支持C開發的主要工具。4.3其它工具鏈Linaro是 2010年臺北國際計算機展期間ARM、TI與IBM等廠家合資成立的非贏利Linux基礎架構軟件研發商。目標旨在改進與優化在ARM-based架構上運行的開放原始碼軟件及開發工具,透過這間合資公司推出開放原始碼的底層軟件工具,解決ARM生態系中,重復投資造成的資源浪費。五、結束語本文介紹介紹了通過Cygwin使用Linaro和CodeSourcery,GNU GCC構建其它Linux嵌入式系統的應用程序。實踐證明,使用這些工具開發嵌入式操作系統投入小,而軟件質量可以與商業嵌入式編譯工具軟件相媲美。