?
近年來隨著信息家電和手持設(shè)備的應(yīng)用,嵌入式系統(tǒng)得到了極大的發(fā)展。全球每年生產(chǎn)的CPU中有超過80%是應(yīng)用于專用性很強(qiáng)的各類嵌入式系統(tǒng),而最初,這類CPU僅進(jìn)行一些簡(jiǎn)單的控制,系統(tǒng)大多在超級(jí)循環(huán)加中斷的方式下工作,而隨著32位高性能專用CPU的出現(xiàn)(如ARM),嵌入式系統(tǒng)能夠適應(yīng)復(fù)雜的控制,進(jìn)行多任務(wù)的處理,極大的提升了效率。當(dāng)然這一切還需嵌入式操作系統(tǒng)的支持。嵌入式Linux以其特有的魅力在市場(chǎng)中逐漸贏得了眾
多用戶的青睞,本文即介紹了μClinux的開發(fā)環(huán)境的組建流程,及應(yīng)用程序和驅(qū)動(dòng)程序的開發(fā)過程。
1 ARM-μClinux的簡(jiǎn)介
Linux是在90年代初出現(xiàn),近幾年漸受歡迎的操作系統(tǒng),其最大特點(diǎn)是開放源代碼。它原本被設(shè)計(jì)為桌面系統(tǒng),現(xiàn)在廣泛應(yīng)用于服務(wù)器領(lǐng)域。而在嵌入式系統(tǒng)的領(lǐng)域中,linux逐漸成為新的熱點(diǎn)。
μClinux即是目前嵌入式linux中最流行的一種。μClinux是Micro-Control-Linux的縮寫,字面上的理解就是”針對(duì)微控制領(lǐng)域而設(shè)計(jì)的Linux系統(tǒng)”,它和標(biāo)準(zhǔn)的linux的區(qū)別,也即μClinux的小型化體現(xiàn)在以下幾點(diǎn):
首先,μClinux不支持MMU(內(nèi)存管理單元),這是μClinux最顯著的特征。μClinux采用實(shí)存儲(chǔ)器管理策略進(jìn)行存儲(chǔ)器的分頁管理,這有別于標(biāo)準(zhǔn)linux使用的虛擬存儲(chǔ)器技術(shù),從易用性上來說是一種倒退,因?yàn)檫@對(duì)開發(fā)人員提出了更多的要求。但是MMU需要相應(yīng)的硬件支持,而在嵌入式系統(tǒng)中出于成本和應(yīng)用的考慮,許多微控制器并沒有相應(yīng)支持MMU的硬件,所以沒有MMU并不影響許多嵌入式系統(tǒng)選擇μClinux操作系統(tǒng)。
其次,μClinux默認(rèn)文件系統(tǒng)為romfs,相對(duì)于標(biāo)準(zhǔn)linux一般采用的ext2文件系統(tǒng)要求更少的空間,這主要體現(xiàn)在兩個(gè)方面,一是內(nèi)核支持romfs文件系統(tǒng)所需的代碼相對(duì)更少;二是romfs本身比較簡(jiǎn)單,在建立文件系統(tǒng)超級(jí)塊時(shí)所需存儲(chǔ)空間較小。但是romfs不支持動(dòng)態(tài)擦寫保存。
再次,μClinux重寫了程序庫,對(duì)標(biāo)準(zhǔn)linux日益龐大的應(yīng)用程序庫和驅(qū)動(dòng)程序庫做了相應(yīng)的刪改。值得一提的是,μClinux對(duì)程序庫采用靜態(tài)連接的形式,這是由μClinux內(nèi)存管理形式?jīng)Q定的。
由此,μClinux的容量有了大幅度的減小,整個(gè)操作系統(tǒng)的代碼甚至小于900 K。即使如此,μClinux仍然保持了linux的主要優(yōu)點(diǎn),如穩(wěn)定性,強(qiáng)大的網(wǎng)絡(luò)功能和出色的文件系統(tǒng)支持等。同時(shí)μClinux已經(jīng)成功移植到大部分嵌入式處理器中,國(guó)內(nèi)已有公司成功推出帶μClinux操作系統(tǒng)的產(chǎn)品。
在嵌入式領(lǐng)域中,32 bit嵌入式處理器的內(nèi)核基本采用RISC指令集,其中以ARM公司的ARM核和MOTOROLA公司的68 K/COLDFIRE系列最為流行,而在手持設(shè)備領(lǐng)域上更是ARM核的天下。
本文對(duì)μClinux開發(fā)應(yīng)用的簡(jiǎn)介即是基于μClinux-Samsung-20020318.tar+readhat9.0+arm-elf-tools-20030314.sh軟件平臺(tái),配套的ARM芯片是三星4510。
2 開發(fā)平臺(tái)的建立
建立μClinux的開發(fā)環(huán)境不外乎兩種情況:一是購(gòu)買商家發(fā)行的套件;二是利用網(wǎng)上資源自己組建。而后者省錢且能學(xué)到更多東西,是許多愛好者或?qū)W生的首選,下面列出自己組建步驟,以供參考:
1) 首先安裝reahat9.0,具體見其他相關(guān)資料;
2) 在mac.os.nctu.edu.tw網(wǎng)站(***交大的一個(gè)專門針對(duì)sumsung4510芯片的μClinux網(wǎng)站)上下載源碼,μClinux-Samsung-20020318.tar和arm-elf-tools-20030314.sh;
3) 然后解壓文件:在redhat的終端中切換到源碼目錄下執(zhí)行以下命令:
sh arm-elf-tools-20030314.sh //即安裝ARM-GCC工具
tar xzfμClinux-Samsung-20020318.tar.gz //即解壓源碼
4) 編譯內(nèi)核:進(jìn)到解開的μClinux目錄中,依次執(zhí)行以下命令:
make menuconfig在出現(xiàn)的對(duì)話框選中Samsung/4510B和uC-libc及其它所需選項(xiàng)
make dep
make clean
make lib-only
make user-only
make romfs
make image在這步會(huì)出現(xiàn)錯(cuò)誤報(bào)告,可忽略繼續(xù)下面的命令make
最后在/images目錄下可看到二進(jìn)制的內(nèi)核文件,即image.ram和image.rom,前者是未經(jīng)壓縮的RAM版本內(nèi)核,后者相反。把image.rom燒錄到flash中,重新上電,在串口1中即可看到啟動(dòng)信息,串口的波特率為19 200。這樣Arm-μClinux的開發(fā)環(huán)境就搭建成功。
3 μClinux的應(yīng)用開發(fā):
在實(shí)際項(xiàng)目開發(fā)中,對(duì)μClinux的應(yīng)用開發(fā)集中在兩個(gè)方面,即驅(qū)動(dòng)程序和用戶程序的編寫。
μClinux的驅(qū)動(dòng)程序庫不可能包括實(shí)際項(xiàng)目系統(tǒng)中所有外圍硬件的驅(qū)動(dòng),所以在應(yīng)用開發(fā)中,編寫驅(qū)動(dòng)程序是一個(gè)重要步驟,驅(qū)動(dòng)程序設(shè)計(jì)的好壞直接影響系統(tǒng)運(yùn)行的穩(wěn)定性和運(yùn)行效率。而嵌入式操作系統(tǒng)的卓越功能最終是由應(yīng)用程序體現(xiàn)出來的,所以應(yīng)用程序的優(yōu)劣是影響嵌入式產(chǎn)品的重要因素,穩(wěn)定高效的應(yīng)用程序取決于開發(fā)人員對(duì)μClinux系統(tǒng)的熟悉程度和自身的編程經(jīng)驗(yàn)。下面對(duì)這兩個(gè)方面作個(gè)簡(jiǎn)介:
A.驅(qū)動(dòng)程序的編寫:
設(shè)備驅(qū)動(dòng)程序是內(nèi)核和機(jī)器硬件之間的接口。
根據(jù)不同的設(shè)備驅(qū)動(dòng)程序分為兩類:字符設(shè)備和塊設(shè)備;前者是直接讀取數(shù)據(jù),即I/O接口的請(qǐng)求直接被送到設(shè)備上;而后者的數(shù)據(jù)是通過內(nèi)核緩沖區(qū)進(jìn)行傳輸?shù)?linux驅(qū)動(dòng)程序的編譯有兩種方式:即靜態(tài)編譯進(jìn)內(nèi)核,和編譯成模塊供動(dòng)態(tài)加載或卸載!由于μClinux不支持動(dòng)態(tài)加載或卸載,故只能采取靜態(tài)編譯的方式!因?yàn)樯婕暗綄?duì)硬件的操作而容易使系統(tǒng)崩潰,所以編寫設(shè)備驅(qū)動(dòng)程序時(shí)除了強(qiáng)調(diào)高效,同時(shí)還要求安全!
一個(gè)典型的驅(qū)動(dòng)程序,大體上可以分為以下兩個(gè)方面:
1) 注冊(cè)設(shè)備:在系統(tǒng)初啟時(shí),必須將設(shè)備登記到相應(yīng)的設(shè)備數(shù)組,例如?。簩?duì)于字符驅(qū)動(dòng)設(shè)備來說,要使用register-chrdev()來注冊(cè)設(shè)備的驅(qū)動(dòng)號(hào),然后對(duì)這個(gè)設(shè)備的所有調(diào)用都用這個(gè)設(shè)備號(hào)來實(shí)現(xiàn);
2) 定義功能函數(shù):對(duì)于每一個(gè)驅(qū)動(dòng)函數(shù)來說,都有一些和此設(shè)備密切相關(guān)的功能函數(shù),就最常用的字符設(shè)備來說,都存在著諸如open()、read()、write()、ioctrol()這一類的操作。當(dāng)系統(tǒng)調(diào)用這些操作時(shí),將自動(dòng)的使用file-operations結(jié)構(gòu)中對(duì)應(yīng)的函數(shù)來實(shí)現(xiàn)具體的操作;
在編寫驅(qū)動(dòng)程序前,不得不提file-operations這個(gè)結(jié)構(gòu),每個(gè)設(shè)備都有自己的file-operations結(jié)構(gòu),它定義了設(shè)備的基本入口點(diǎn),即上面提到的功能函數(shù)?! ∠旅嬉砸粋€(gè)簡(jiǎn)單的演示例子,說明編寫字符設(shè)備驅(qū)動(dòng)程序的具體過程,設(shè)備取名為“test”,設(shè)備號(hào)定為254,當(dāng)然這個(gè)設(shè)備并沒有涉及真正的硬件,僅是從內(nèi)核空間拷貝了一些特定數(shù)據(jù)到用戶空間:
第一步:在目錄/linux-2.4/drives/char編寫源程序test.c,源碼如下:
頭文件和全局變量:

?

?

?

?

?

?
4) 修改vendor/Samsung/4510b/Makefile,建立設(shè)備節(jié)點(diǎn):在12---35行間,DEVICE部分添加如下內(nèi)容test,c,254,0
5) make menuconfig,在character device選中testdevice
這樣在重新編譯的內(nèi)核中,就包含了名為“test”的設(shè)備驅(qū)動(dòng),下面的例子是用于驗(yàn)證這個(gè)設(shè)備驅(qū)動(dòng)程序的,至于怎樣運(yùn)行這個(gè)驗(yàn)證程序?qū)⒃谙旅妗皯?yīng)用程序的編寫”一節(jié)中講解:

?

?
B.應(yīng)用程序的編寫
在μCLinux的/user目錄下提供許多資源供開發(fā)者參考。下面以上節(jié)提到的源程序?yàn)槔f明在
μCLinux中加入自己應(yīng)用程序的過程。
第一步:首先在/user/目錄下建立自己的文件夾如,取名apptest,然后在新建文件夾(apptest)下編輯自己的應(yīng)用程序apptest.c(源碼為上面的設(shè)備驅(qū)動(dòng)驗(yàn)證程序),然后參照user目錄下其他應(yīng)用程序編寫自己的makefile,同樣保存在文件apptest下;
第二步:在/user/Makefile中適當(dāng)位置加入下行語句:
dir-$(CONFIG-USER-APPTEST-APPTEST)+=apptest
第三步:在/config/Configure.help的適當(dāng)位置添加以下語句:
CONFIG-USER-APPTEST-APPTESTThis programdoes APPTESTthingsto your bars.
第四步:在/config/config.in的適當(dāng)位置添加以下語句:
bool’apptest’CONFIG-USER-APPTEST-A-PPTEST
最后再重新編譯內(nèi)核,在make menuconfig時(shí),選中自己的應(yīng)用程序,完成后在/bin目錄可以看見ap-ptest的可執(zhí)行文件,通過控制臺(tái)直接輸入該文件名即可運(yùn)行該程序!當(dāng)然也可以在文件vendor/Sam-sung/4510B/rc中添加文件名apptest,重新編譯,在uclinux啟動(dòng)后自動(dòng)執(zhí)行該應(yīng)用程序!
4 結(jié)束語
嵌入式系統(tǒng)已逐漸成為后PC時(shí)代的主導(dǎo),而嵌入式操作系統(tǒng)μClinux憑其出色的性能和廣泛的技術(shù)支持應(yīng)該有更廣闊的應(yīng)用前景。本文舉例說明了μClinux的開發(fā)應(yīng)用的過程,可作為入門指導(dǎo)。
評(píng)論