基于μClinux的嵌入式應用程序的開(kāi)發(fā)
嵌入式系統范同非常廣泛,從簡(jiǎn)單的單片機系統到主頻高達幾百兆的使用操作系統的非計算機系統,都可以稱(chēng)為嵌入式系統。隨著(zhù)各行業(yè)電子系統應用要求的提高,嵌入式系統也越來(lái)越復雜,硬件要求速度快、集成度高、外部接口多,軟件則要求功能豐富、模塊化、易于擴展。ARM能夠很好滿(mǎn)足復雜嵌入式系統的要求,因此ARM芯片成為當前嵌入式應用最重要的硬件平臺。嵌入式硬件平臺性能的提高,使嵌入式操作系統的使用成為必然。
1 嵌入式系統與μClinux
基于A(yíng)RM的嵌入式系統是當前最典型的嵌入式系統。嵌入式系統框圖如圖1所示。系統的硬件主要部件是ARM7系列的S3C44B0X處理器。當系統中需要使用各種各樣的外圍設備時(shí),開(kāi)發(fā)的難度相當大,使用操作系統可以提高升發(fā)的效率。因此,嵌入式操作系統是嵌入式系統極為重要的組成部分。它具有通用操作系統的基小特點(diǎn),而又增加了實(shí)時(shí)高效性、硬件依賴(lài)性、應用專(zhuān)一性等新特點(diǎn)。常見(jiàn)的嵌入式操作系統有:VxWorks、uC/OS-II、Windows CE、μClinux等。μClinux操作系統是一種性能優(yōu)良、源碼公開(kāi)且被廣泛應用的免費嵌入式操作系統,因此很多無(wú)MMU單元的嵌入式系統都使用μClinux作為操作系統。

μClinux是針對控制領(lǐng)域的嵌入式Linux操作系統,它從Linux 2.0/2.4內核派生而來(lái),而又針對沒(méi)有MMU的處理器進(jìn)行設計,因此有著(zhù)特別小的內核和用戶(hù)軟件空間,而且所有程序訪(fǎng)問(wèn)的地址都是實(shí)際的物理地址。操作系統對內存空間沒(méi)有保護,各個(gè)進(jìn)程實(shí)際上共享一個(gè)運行空間。
2 μClinux的移植
μClinux是依賴(lài)于硬件系統的,與PC上運行的Linux系統有較大的區別。因此在A(yíng)RM系統中使用μClinux時(shí),需要對內核進(jìn)行裁剪,再添加一些需要的驅動(dòng)程序,才能在不同的嵌入式碰件系統中運行。μClinux操作系統一般都是先在安裝Linux的計算機上編譯調試,然后再下載到目標系統板上運行,這一過(guò)程就是μClinux的移植。
2.1 Bootloader的設計
Bootloader就是在操作系統內核運行之前運行的一段程序。嵌入式系統的Bootloader程序燒錄在系統地址的0x0處,即每次上電后先運行Bootloader,完成硬件系統的初始化、建立內存空間的映射圖和μClinux的引導工作。完整的Bootloader引導流程描述如圖2所示。
由上圖可以看出,Bootloader的主要任務(wù)對時(shí)鐘、中斷、I/O等芯片資源進(jìn)行初始化,為μClinux的運行做好準備。
2.2 μClinux移植的方法
2.2.1 建立交叉編譯環(huán)境
首先從網(wǎng)上下載GNU開(kāi)發(fā)軟件包arm-elf-tools-20030312.sh,然后到源碼目錄下執行sh arm-elf-tools-20030312.sh,這樣在PC上建立了ARM體系結構的編譯器、連接器、調試器,可以用來(lái)編譯OS內核,制作文件系統等。
2.2.2 在Windows下安裝ADS工具
ADS是ARM公司推出的新一代ARM集成開(kāi)發(fā)工具。在硬件開(kāi)發(fā)板完成后,可用ADS各硬件模塊進(jìn)行測試。

2.2.3 編譯μClinux
把代碼解壓縮到工作目錄下,運行tar xjvfμClinux-dist-51EDA.tar.bz2, 它會(huì )把全部的文件解壓縮到home/μClinux-dist的目錄下。然后進(jìn)入目錄運行menuconfig,對μClinux進(jìn)行配置,訂制自己的系統。
注意對于編譯uClinux,不能簡(jiǎn)單地通過(guò)make來(lái)實(shí)現。為了編譯最后得到的鏡像文件,我們需要linux的內核以及romfs。對于我們的S3C44B0X的移植來(lái)說(shuō),romfs是被編譯到內核里面去的。因此,在編譯內核前需要一個(gè)romfs。為了得到romfs的image,我們又需要編譯用戶(hù)的應用程序。而為了編譯用戶(hù)的應用程序,我們又需要編譯C運行庫,這里我們用的C運行庫是uClibc。根據上面的分析,我們使用以下步驟編譯μClinux。
(1) make dep:建立文件之間的依賴(lài)關(guān)系,make會(huì )根據這個(gè)依賴(lài)關(guān)系來(lái)確定哪些義件需要重新編譯、哪些文件可以跳過(guò)。
(2) make lib only:編譯uClibc。
(3) make user only:編譯用戶(hù)的應用程序,包括初始化進(jìn)程init,和用戶(hù)交互的bash。
(4) make romfs:它會(huì )在μClinux的目錄下生成一個(gè)romfs目錄并且把user目錄下的文件、以及vendors目錄下特定系統所需要的文件組織起來(lái),以便下面生成romfs的單個(gè)鏡像所用。
(5) make image:是生成romfs的鏡像文件和生成Linux的鏡像。
(6) make linux:用上面make image生成的romfs.o文件編譯Linux內核。
(7) make image:執行了這一步之后,就會(huì )在images目錄下找到3個(gè)文件:image.ram,image.rom,romfs.img。其中,image.ram和image.rom就是我們需要的鏡像文件。
2.2.4 加載μClinux內核
μClinux內核可以加載到Flash運行,也可以加載到RAM中運行。image.ram是直接下載到RAM執行的文件,加載到SDRAM后,修改PC指針寄存器的值指向image.ram的下載地址就可以執行。對于image.rom,它是一個(gè)zlmage文件,也就是自解壓的內核。由于它使用了gzip將內核壓縮過(guò),所以可以減小文件的大小。這個(gè)image應該燒寫(xiě)到FLASH,向不能直接下載到RAM并執行。
3 μClinux應用程序的開(kāi)發(fā)
要開(kāi)發(fā)基于μClinux的應用程序,首先需要在PC上建立交叉編譯環(huán)境,編寫(xiě)、調試應用程序,測試通過(guò)后,再重新編譯μClinux內核映像,下載到目標板運行測試。具體步驟如下(在PC的Linux環(huán)境下進(jìn)行)。
(1) 在μClinux的user目錄下創(chuàng )建新目錄user/sample,用來(lái)存放應用程序源代碼。編寫(xiě)應用程序"MyApp.c"文件。
(2) 編輯文件user/Makefile,在Makefile文件中按照字母順序增加以下內容:dir_$(CONFIG_USER_SAMPLE_MYAPP)+=sample。
(3) 編輯文件config/Configure.help,增加下行:CONFIG USER SAMPLE MYAPP
注意:第2行以2個(gè)空格開(kāi)頭,總長(cháng)度小于70個(gè)字符。
(4) 編輯文件config/config.in,在'Games'后添加新的部分:
(5) 在user/sample目錄下創(chuàng )建應用程序的Makefile文件。
(6) 重新編譯生成image.rom。注意在運行makeconfig或make menuconfig時(shí)選擇生成的應用程序"MyApp"。Makefile文件中修改如下:
(7) 重新運行編譯μClinux內核的步驟,把生成的image.ram或image.rom文件燒寫(xiě)到目標板,然后運行μClinux,操作系統啟動(dòng)后,運行應用程序MyApp,測試應用程序的功能實(shí)現。
使用μClinux開(kāi)發(fā)嵌入式應用程序,可以提高嵌入式系統開(kāi)發(fā)的效率,而且易于擴展和移植,是嵌入式研發(fā)人員很好的選擇。
評論