基于μClinux的嵌入式應用程序的開發(fā)
嵌入式系統(tǒng)范同非常廣泛,從簡單的單片機系統(tǒng)到主頻高達幾百兆的使用操作系統(tǒng)的非計算機系統(tǒng),都可以稱為嵌入式系統(tǒng)。隨著各行業(yè)電子系統(tǒng)應用要求的提高,嵌入式系統(tǒng)也越來越復雜,硬件要求速度快、集成度高、外部接口多,軟件則要求功能豐富、模塊化、易于擴展。ARM能夠很好滿足復雜嵌入式系統(tǒng)的要求,因此ARM芯片成為當前嵌入式應用最重要的硬件平臺。嵌入式硬件平臺性能的提高,使嵌入式操作系統(tǒng)的使用成為必然。
1 嵌入式系統(tǒng)與μClinux
基于ARM的嵌入式系統(tǒng)是當前最典型的嵌入式系統(tǒng)。嵌入式系統(tǒng)框圖如圖1所示。系統(tǒng)的硬件主要部件是ARM7系列的S3C44B0X處理器。當系統(tǒng)中需要使用各種各樣的外圍設備時,開發(fā)的難度相當大,使用操作系統(tǒng)可以提高升發(fā)的效率。因此,嵌入式操作系統(tǒng)是嵌入式系統(tǒng)極為重要的組成部分。它具有通用操作系統(tǒng)的基小特點,而又增加了實時高效性、硬件依賴性、應用專一性等新特點。常見的嵌入式操作系統(tǒng)有:VxWorks、uC/OS-II、Windows CE、μClinux等。μClinux操作系統(tǒng)是一種性能優(yōu)良、源碼公開且被廣泛應用的免費嵌入式操作系統(tǒng),因此很多無MMU單元的嵌入式系統(tǒng)都使用μClinux作為操作系統(tǒng)。
μClinux是針對控制領域的嵌入式Linux操作系統(tǒng),它從Linux 2.0/2.4內核派生而來,而又針對沒有MMU的處理器進行設計,因此有著特別小的內核和用戶軟件空間,而且所有程序訪問的地址都是實際的物理地址。操作系統(tǒng)對內存空間沒有保護,各個進程實際上共享一個運行空間。
2 μClinux的移植
μClinux是依賴于硬件系統(tǒng)的,與PC上運行的Linux系統(tǒng)有較大的區(qū)別。因此在ARM系統(tǒng)中使用μClinux時,需要對內核進行裁剪,再添加一些需要的驅動程序,才能在不同的嵌入式碰件系統(tǒng)中運行。μClinux操作系統(tǒng)一般都是先在安裝Linux的計算機上編譯調試,然后再下載到目標系統(tǒng)板上運行,這一過程就是μClinux的移植。
2.1 Bootloader的設計
Bootloader就是在操作系統(tǒng)內核運行之前運行的一段程序。嵌入式系統(tǒng)的Bootloader程序燒錄在系統(tǒng)地址的0x0處,即每次上電后先運行Bootloader,完成硬件系統(tǒng)的初始化、建立內存空間的映射圖和μClinux的引導工作。完整的Bootloader引導流程描述如圖2所示。
由上圖可以看出,Bootloader的主要任務對時鐘、中斷、I/O等芯片資源進行初始化,為μClinux的運行做好準備。
2.2 μClinux移植的方法
2.2.1 建立交叉編譯環(huán)境
首先從網上下載GNU開發(fā)軟件包arm-elf-tools-20030312.sh,然后到源碼目錄下執(zhí)行sh arm-elf-tools-20030312.sh,這樣在PC上建立了ARM體系結構的編譯器、連接器、調試器,可以用來編譯OS內核,制作文件系統(tǒng)等。
2.2.2 在Windows下安裝ADS工具
ADS是ARM公司推出的新一代ARM集成開發(fā)工具。在硬件開發(fā)板完成后,可用ADS各硬件模塊進行測試。
2.2.3 編譯μClinux
把代碼解壓縮到工作目錄下,運行tar xjvfμClinux-dist-51EDA.tar.bz2, 它會把全部的文件解壓縮到home/μClinux-dist的目錄下。然后進入目錄運行menuconfig,對μClinux進行配置,訂制自己的系統(tǒng)。
注意對于編譯uClinux,不能簡單地通過make來實現(xiàn)。為了編譯最后得到的鏡像文件,我們需要linux的內核以及romfs。對于我們的S3C44B0X的移植來說,romfs是被編譯到內核里面去的。因此,在編譯內核前需要一個romfs。為了得到romfs的image,我們又需要編譯用戶的應用程序。而為了編譯用戶的應用程序,我們又需要編譯C運行庫,這里我們用的C運行庫是uClibc。根據(jù)上面的分析,我們使用以下步驟編譯μClinux。
(1) make dep:建立文件之間的依賴關系,make會根據(jù)這個依賴關系來確定哪些義件需要重新編譯、哪些文件可以跳過。
(2) make lib only:編譯uClibc。
(3) make user only:編譯用戶的應用程序,包括初始化進程init,和用戶交互的bash。
(4) make romfs:它會在μClinux的目錄下生成一個romfs目錄并且把user目錄下的文件、以及vendors目錄下特定系統(tǒng)所需要的文件組織起來,以便下面生成romfs的單個鏡像所用。
(5) make image:是生成romfs的鏡像文件和生成Linux的鏡像。
(6) make linux:用上面make image生成的romfs.o文件編譯Linux內核。
(7) make image:執(zhí)行了這一步之后,就會在images目錄下找到3個文件:image.ram,image.rom,romfs.img。其中,image.ram和image.rom就是我們需要的鏡像文件。
2.2.4 加載μClinux內核
μClinux內核可以加載到Flash運行,也可以加載到RAM中運行。image.ram是直接下載到RAM執(zhí)行的文件,加載到SDRAM后,修改PC指針寄存器的值指向image.ram的下載地址就可以執(zhí)行。對于image.rom,它是一個zlmage文件,也就是自解壓的內核。由于它使用了gzip將內核壓縮過,所以可以減小文件的大小。這個image應該燒寫到FLASH,向不能直接下載到RAM并執(zhí)行。
3 μClinux應用程序的開發(fā)
要開發(fā)基于μClinux的應用程序,首先需要在PC上建立交叉編譯環(huán)境,編寫、調試應用程序,測試通過后,再重新編譯μClinux內核映像,下載到目標板運行測試。具體步驟如下(在PC的Linux環(huán)境下進行)。
(1) 在μClinux的user目錄下創(chuàng)建新目錄user/sample,用來存放應用程序源代碼。編寫應用程序"MyApp.c"文件。
(2) 編輯文件user/Makefile,在Makefile文件中按照字母順序增加以下內容:dir_$(CONFIG_USER_SAMPLE_MYAPP)+=sample。
(3) 編輯文件config/Configure.help,增加下行:CONFIG USER SAMPLE MYAPP
注意:第2行以2個空格開頭,總長度小于70個字符。
(4) 編輯文件config/config.in,在'Games'后添加新的部分:
(5) 在user/sample目錄下創(chuàng)建應用程序的Makefile文件。
(6) 重新編譯生成image.rom。注意在運行makeconfig或make menuconfig時選擇生成的應用程序"MyApp"。Makefile文件中修改如下:
(7) 重新運行編譯μClinux內核的步驟,把生成的image.ram或image.rom文件燒寫到目標板,然后運行μClinux,操作系統(tǒng)啟動后,運行應用程序MyApp,測試應用程序的功能實現(xiàn)。
使用μClinux開發(fā)嵌入式應用程序,可以提高嵌入式系統(tǒng)開發(fā)的效率,而且易于擴展和移植,是嵌入式研發(fā)人員很好的選擇。
評論