先說兩句廢話為和我以前一樣對操作系統(tǒng)(尤其是嵌入式操作系統(tǒng))迷惑的弟兄解釋些概念。因為總是有人在問是不是一定要用操作系統(tǒng),我的CPU能不能移植操作系統(tǒng),可以移植什么操作系統(tǒng),有了操作系統(tǒng)可不可以運行某些程序。 從我的個人經(jīng)歷來講,這其實就是許多硬件出身的弟兄對操作系統(tǒng)這個東西有神秘感(和我一年前一樣)。說白了,操作系統(tǒng)就是一段設計非常巧妙的程序,和你自己的程序從本質(zhì)講沒有區(qū)別,于是,以上問題轉為,我是不是一定要用這段程序,我的CPU能不能運行這段程序,可以跑什么樣的程序。這個程序可以跑,調(diào)用這個程序接口的另一個程序能不能跑! 答案也就變得簡單,操作系統(tǒng)對任何一個CPU都不是必須的(對嵌入式系統(tǒng)更是如此),你可以自己編些程序在沒有操作系統(tǒng)的PC裸機上跑(BIOS就是這樣的),像玩C51一樣,(雖然奢侈的讓人有些心痛),或者移植UCOS到上面。另一方面,現(xiàn)代操作系統(tǒng)大多需要一些硬件的支持,(像保護模式的實現(xiàn)),反過來說,高端CPU中專門有針對支持操作系統(tǒng)的體系結構,這樣,許多操作系統(tǒng)的實現(xiàn)是挑剔硬件平臺的。其實其它程序也一樣,你編的程序使用的片上外設另一CPU上沒有,那這段程序就無法移植了。這就是話粗理不粗。書歸正傳,還是聊聊ARM+uClinux開發(fā)模式下開發(fā)環(huán)境的建立(其實下面說到的東西不僅限于這種硬件平臺和操作系統(tǒng))
很久以前就在介紹嵌入式系統(tǒng)開發(fā)的書上見過“交叉編譯環(huán)境”這詞,當時覺得很玄,用了以后才知道,其實就是解決在誰的地盤上用誰的工具編誰的代碼問題。 編譯的最主要的工作就在將你的程序轉化成運行該程序的CPU所能識別的機器代碼,不同的CPU有相應的編譯器,另一方面。編譯器本身也是程序,當然也要在某一個CPU平臺上運行。于是交叉編譯的交叉點就在那個編譯器本身是CPU1上的一個程序,卻在為CPU2編譯代碼(整個一個吃里扒外?。_@么一想,以前用51和dsp的開發(fā)軟件(大部分都是IDE-集成開發(fā)環(huán)境)開發(fā)程序時,都算是交叉編譯啦。當然,假如在你的ARM系統(tǒng)上,操作系統(tǒng)已經(jīng)正常運行,并且你的資源足夠多,你可以把PC機上運行的ARM編譯工具移植到ARM上,然后所有該系統(tǒng)的應用程序都直接在ARM系統(tǒng)上編譯,這就不算交叉編譯,但如果有條件這么作,程序的開發(fā)或者移植就方便多了,因為整個開發(fā)過程又回到在自己PC機上編應用程序的那種模式了,那就是在自己的地盤上用自己的編譯器編自己的應用程序。
與不使用操作系統(tǒng)的開發(fā)模式不同(此處的操作系統(tǒng)尤其指提供了專門的接口函數(shù)庫的操作系統(tǒng),目前的UCOS就不算),在目標板(就是實現(xiàn)系統(tǒng)的板子)使用操作系統(tǒng)的開發(fā)模式下,交叉編譯環(huán)境中還需要該對應該操作系統(tǒng)的庫。比如uClinux提供的uClibc。此時,開發(fā)用的主機上不光要有目標板CPU所需的編譯工具,還要有對應操作系統(tǒng)的庫,又因為一般庫文件還要在開發(fā)機上拿目標CPU的編譯器重新編譯一下,所以還要把操作系統(tǒng)的原碼也放到開發(fā)機上。(唉,跟目標板沒什么關系,卻要幫它背這么多東西,真是上輩子欠它的?。。?br>雖然操作系統(tǒng)的接口庫至關重要,但大家似乎已經(jīng)淡忘了它的存在。這些多是因為大家已經(jīng)遠離了刀耕火種的年代(需要告訴編譯器需要的include路徑,lib路徑,以及l(fā)ib的名稱),集成的編譯環(huán)境讓我們編譯鏈接的所有繁瑣工作化作對BUILD按鈕的瀟灑一擊。而且不論是windows環(huán)境,還是linux環(huán)境,都有環(huán)境變量去記錄這些參數(shù)。。但嘗試將/usr/lib目錄改一個名字,你就會知道你不能無視他們的存在,因為操作系統(tǒng)的功能都是通過這些庫來交給應用層程序使用的。當然如果你的系統(tǒng)不依靠任何操作系統(tǒng),像最原始的那種完全自己實現(xiàn)所有代碼,就只需要一個編譯工具,少了這些羅嗦事。 對未來的應用來說,絕大多數(shù)都需要操作體統(tǒng),而且,這個操作系統(tǒng)應該提供網(wǎng)路協(xié)議棧。既然我們已經(jīng)把網(wǎng)絡協(xié)議分了層,我們也不妨把計算機或者目標板也看作是分層的,把操作系統(tǒng)看作其上的一個層。這些層自下向上分別為:硬件級、微程序級、傳統(tǒng)機器機、匯編語言級、操作系統(tǒng)級。如同我們編寫網(wǎng)絡程序選擇所使用的協(xié)議一樣,我們也可以根據(jù)需要,選擇是否使用操作系統(tǒng)。
微軟的 Windows* CE操作系統(tǒng)是一個被廣泛的應用在嵌入式產(chǎn)品的緊湊的、高效的可升級的操作系統(tǒng) ,從手持式計算機到特種工控機和消費者電子產(chǎn)品。Windows CE可以用以處理最需要的32位嵌入式程序。Windows CE 操作系統(tǒng)把基于微軟的32位開發(fā)工具箱的所有功能提供給嵌入式系統(tǒng)的設計者。
對嵌入式應用選用Windows CE操作系統(tǒng)的一個主要原因是:今天微軟的Win32應用程序接口(API)已經(jīng)被廣泛的應用。今天,Win32 API幾乎是為Windows所寫的所有的32位應用程序的核心,從運行在微軟的 Windows NT操作系統(tǒng)上的高速終端(high-end)服務器產(chǎn)品到最小的臺式計算機和嵌入式應用。
|