先說兩句廢話為和我以前一樣對操作系統(尤其是嵌入式操作系統)迷惑的弟兄解釋些概念。因為總是有人在問是不是一定要用操作系統,我的CPU能不能移植操作系統,可以移植什么操作系統,有了操作系統可不可以運行某些程序。
從我的個人經歷來講,這其實就是許多硬件出身的弟兄對操作系統這個東西有神秘感(和我一年前一樣)。說白了,操作系統就是一段設計非常巧妙的程序,和你自己的程序從本質講沒有區別,于是,以上問題轉為,我是不是一定要用這段程序,我的CPU能不能運行這段程序,可以跑什么樣的程序。這個程序可以跑,調用這個程序接口的另一個程序能不能跑!
答案也就變得簡單,操作系統對任何一個CPU都不是必須的(對嵌入式系統更是如此),你可以自己編些程序在沒有操作系統的PC裸機上跑(BIOS就是這樣的),像玩C51一樣,(雖然奢侈的讓人有些心痛),或者移植UCOS到上面。另一方面,現代操作系統大多需要一些硬件的支持,(像保護模式的實現),反過來說,高端CPU中專門有針對支持操作系統的體系結構,這樣,許多操作系統的實現是挑剔硬件平臺的。其實其它程序也一樣,你編的程序使用的片上外設另一CPU上沒有,那這段程序就無法移植了。這就是話粗理不粗。書歸正傳,還是聊聊ARM+uClinux開發模式下開發環境的建立(其實下面說到的東西不僅限于這種硬件平臺和操作系統)
很久以前就在介紹嵌入式系統開發的書上見過“交叉編譯環境”這詞,當時覺得很玄,用了以后才知道,其實就是解決在誰的地盤上用誰的工具編誰的代碼問題。
編譯的最主要的工作就在將你的程序轉化成運行該程序的CPU所能識別的機器代碼,不同的CPU有相應的編譯器,另一方面。編譯器本身也是程序,當然也要在某一個CPU平臺上運行。于是交叉編譯的交叉點就在那個編譯器本身是CPU1上的一個程序,卻在為CPU2編譯代碼(整個一個吃里扒外!)。這么一想,以前用51和dsp的開發軟件(大部分都是IDE-集成開發環境)開發程序時,都算是交叉編譯啦。當然,假如在你的ARM系統上,操作系統已經正常運行,并且你的資源足夠多,你可以把PC機上運行的ARM編譯工具移植到ARM上,然后所有該系統的應用程序都直接在ARM系統上編譯,這就不算交叉編譯,但如果有條件這么作,程序的開發或者移植就方便多了,因為整個開發過程又回到在自己PC機上編應用程序的那種模式了,那就是在自己的地盤上用自己的編譯器編自己的應用程序。
與不使用操作系統的開發模式不同(此處的操作系統尤其指提供了專門的接口函數庫的操作系統,目前的UCOS就不算),在目標板(就是實現系統的板子)使用操作系統的開發模式下,交叉編譯環境中還需要該對應該操作系統的庫。比如uClinux提供的uClibc。此時,開發用的主機上不光要有目標板CPU所需的編譯工具,還要有對應操作系統的庫,又因為一般庫文件還要在開發機上拿目標CPU的編譯器重新編譯一下,所以還要把操作系統的原碼也放到開發機上。(唉,跟目標板沒什么關系,卻要幫它背這么多東西,真是上輩子欠它的!!)。
雖然操作系統的接口庫至關重要,但大家似乎已經淡忘了它的存在。這些多是因為大家已經遠離了刀耕火種的年代(需要告訴編譯器需要的include路徑,lib路徑,以及lib的名稱),集成的編譯環境讓我們編譯鏈接的所有繁瑣工作化作對BUILD按鈕的瀟灑一擊。而且不論是windows環境,還是linux環境,都有環境變量去記錄這些參數。。但嘗試將/usr/lib目錄改一個名字,你就會知道你不能無視他們的存在,因為操作系統的功能都是通過這些庫來交給應用層程序使用的。當然如果你的系統不依靠任何操作系統,像最原始的那種完全自己實現所有代碼,就只需要一個編譯工具,少了這些羅嗦事。
以上的東西一般時候是沒有必要仔細研究,但交叉環境下開發或移植比較大的程序時,你可能就需要了解編譯器,鏈接器等開發工具的幾乎所有重要參數。
我在開發時,主機完全使用的是linux,如果有條件,建議大家這樣作,linux的使用沒有想象的復雜(雖然我現在身邊還要放一本關于linux使用的書籍),而且開發程序可以先在主機上調通,然后用交叉編譯工具為目標系統重新編譯一遍,可以這樣做是因為主機是linux,目標系統跑uClinux,兩個操作系統提供的應用程序接口幾乎是一樣的,所以程序幾乎不用修改。
在我的系統上,建立基本的開發環境過程如下。
(1) 安裝gnu開發工具鏈(是GNU開發的針對ARM CPU的一組編譯開發程序(是linux程序)。包括arm-elf-gcc,arm-elf-ld等
(2) 將uClinux源代碼源代碼解壓到相應路徑下,按照編譯內核的步鄹編譯一遍(此時使用的編譯工具已經是上面提到的ARM編譯工具了,因為它要在ARM CPU上運行,另外,和編譯linux內核一樣,此時可以通過menuconfig來對內核提供的功能進行裁減
(3) 將庫(uClibc)解壓到相應路徑下,用以上工具編譯一遍。
這樣最基本的環境就算搭建好了。
上一篇:ARM9礦井風機設計方案
下一篇:解析基于ARM 和Linux 通用工控硬件平臺的設計
推薦閱讀
史海拾趣