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