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