現(xiàn)場總線的開關量I/O模塊設計:操作系統(tǒng)移植與驅(qū)動開發(fā)
5.1常用的嵌入式操作系統(tǒng)
當前常見的嵌入式操作系統(tǒng)主要有嵌入式Linux、Windows CE及VxWorks,在各個領域得到廣泛應用,具有各自的特性與優(yōu)勢:
①從系統(tǒng)性能比較
Linux是一個成熟而穩(wěn)定的網(wǎng)絡操作系統(tǒng),為嵌入式操作系統(tǒng)提供了一個極有吸引力的選擇,它是個和Unix相似、以核心為基礎的、完全內(nèi)存保護、多任務、多進程的操作系統(tǒng),支持廣泛的計算機硬件,包括X86 ,Alpha、MIPS、PPC、ARM、NEC、MOTOROLA等現(xiàn)有的大部分芯片,可以定制,其系統(tǒng)內(nèi)核最小只有約134K B,在信息家電、工控等領域有廣泛應用。
WinCE是一個軟實時系統(tǒng),具有模塊化、結(jié)構(gòu)化和基于Win32應用程序接口和與處理器無關等特點,主要用于對實時性要求不高,但對界面要求較高的領域,在PDA、手機、顯示儀表等領域得到非常廣泛應用。
VxWorks操作系統(tǒng)是美國WindRiver公司于1983年設計開發(fā)的一種嵌入式實時操作系統(tǒng)(RTOS),具有多達1800個功能強大的應用程序接口(API ) ,它以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中。
②從開發(fā)角度比較
Linux程序源碼全部公開,任何人可以修改并在GNU通用公共許可證下發(fā)行,這樣,開發(fā)人員可以對操作系統(tǒng)進行定制。同時由于有GPL (General Public License )的控制,大家開發(fā)的東西大都相互兼容。Linux用戶遇到問題時可以通過Internet向網(wǎng)上成千上萬的Linux開發(fā)者請教,這使最困難的問題也有辦法解決。Linux帶有Unix用戶熟悉的完善的開發(fā)工具,幾乎所有的Unix系統(tǒng)的應用軟件都已移植到了Linux上。Linux還提供了強大的網(wǎng)絡功能,有多種可選擇窗口管理(Xwindows )。其強大的語言編譯器gcc、g++等也可以很容易得到。目前正在開發(fā)的嵌人式系統(tǒng)中,49%的項目選擇Linux作為嵌入式操作系統(tǒng)。
就VxWorks與Win CE而言,廠商不但提供了穩(wěn)定可靠方便的集成開發(fā)環(huán)境,而且提供了大量針對具體應用的完整解決方案,為具體開發(fā)帶來極大便捷,但系統(tǒng)開發(fā)成本較昂貴。
本論文最終采用嵌入式Linux作為系統(tǒng)開發(fā)軟件平臺。
5.2 BOOTLOADER移植
引導加載程序Bootloader是系統(tǒng)加電后運行的第一段代碼。Bootloader就是在操作系統(tǒng)內(nèi)核或應用程序運行之前的一段程序。通過這段小程序,可以初始化硬件設備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核或用戶應用程序準備好正確的環(huán)境。Bootloader是依賴于硬件而實現(xiàn)的,特別是在嵌入式系統(tǒng)中。不同的體系結(jié)構(gòu)需求的Bootloader是不同的;除了體系結(jié)構(gòu),Bootloader還依賴于具體的嵌入式板級設備的配置。
5.2.1 U-Boot簡介
U-Boot全稱為Universal Bootloader,是遵循GPL條款的開放源碼項目。從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實上,不少U-Boot源碼就是相應的Linux內(nèi)核源程序的簡化,尤其是一些設備的驅(qū)動程序。
選擇U-Boot的理由:
▶開放源碼;
▶支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;
▶支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
▶較高的可靠性和穩(wěn)定性;高度靈活的功能設置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導要求、產(chǎn)品發(fā)布等;
▶豐富的設備驅(qū)動源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
▶較為豐富的開發(fā)調(diào)試文檔與強大的網(wǎng)路技術支持;
5.2.2 U-Boot運行過程分析
U-Boot編譯后的代碼定義一般不超過100 KB,并且這100KB又分為兩個階段來執(zhí)行。第一階段的代碼在start.s中定義,大小不超過10KB,它包括從系統(tǒng)上電后在0x00000000地址開始執(zhí)行的部分。這部分代碼運行在Flash中,它包括對S3C2440的一些寄存器的初始化和將U-Boot的第二段代碼從Flash復制到SDRAM中。第二段的起始地址是在第一段代碼中指定的,被復制到SDRAM后,就第一段跳到這個入口地址開始執(zhí)行剩余部分代碼。第二段主要是進行一些BSS段的設置、堆棧的初始化等工作,最后會跳轉(zhuǎn)到main -loop函數(shù)中,接收命令并進行命令處理。
5.2.3 U-Boot移植
本系統(tǒng)用到的U-Boot版本為1.3.2.它不僅提供了對ARM-920T內(nèi)核的支持,而且直接提供了對于S3C2440的板級支持,這使移植工作量相對減少。
(1) U-Boot版本1.3.2,gccversion4.1.2
(2)在Makefile中加入
zq2440_config:u nconfig @$(MKCONFIG ) $(@ :_config=) arm arm920t zq2440 NULL S3C24x0把板子起名為zq2440
(3)建立board/zq2440目錄,復制board/smdk2410下的文件到board/zq2440目錄,將smdk2410.c更名為zq2440.c.
(4)cp include/configs/smdk2410.h include/configs/zq2440.h
(5 )添加arm-softfloat-linux-gnu-到Makefile的CROSS_COMPILE=
(6)編譯 make zq2440_config
make
(7)通過JTAG口將U-Boot燒寫到Flash中,就可以從Nand Flash啟動了。
Uboot在超級終端下運行結(jié)果如圖5.1所示:
5.3嵌入式Linux內(nèi)核的移植
5.3.1嵌入式Linux簡介
嵌入式Linux是將日益流行的Linux操作系統(tǒng)進行裁剪、修改,使之能在嵌入式計算機系統(tǒng)上運行的一種操作系統(tǒng)。
嵌入式系統(tǒng)的軟件和硬件往往只需針對某種特別的應用定制,因此嵌入式操作系統(tǒng)需要量體裁衣,除去冗余,同時盡可能發(fā)揮系統(tǒng)的潛力。Linux最初目標是一個通用的操作系統(tǒng),因此必須對其進行面向嵌入式系統(tǒng)和應用環(huán)境的改造,以適應嵌入式系統(tǒng)的特殊要求。
嵌入式Linux系統(tǒng)包括內(nèi)核和應用程序兩部分。內(nèi)核為應用程序提供一個虛擬的硬件平臺,以統(tǒng)一的方式對資源進行訪問,并且透明地支持多任務。嵌入式Linux內(nèi)核可以分為六部分:進程調(diào)度,內(nèi)存管理,文件系統(tǒng),進程間通信,網(wǎng)絡,設備驅(qū)動。應用程序負責系統(tǒng)的部分初始化,基本的人機界面,必要的命令等內(nèi)容。
從Linux2.6內(nèi)核版本開始了實時性革命。Linux內(nèi)核本身也已經(jīng)特別注重了向嵌入式系統(tǒng)的應用,Linux2.6內(nèi)核已經(jīng)把uCLinux的大部分并入主流內(nèi)核功能中,同時加入提高中斷性能和調(diào)度響應時間的改進,有三個最顯著的改進:采用可搶占內(nèi)核、更加有效的調(diào)度算法以及同步性的提高。Linux2.6內(nèi)核在一定程度上是可搶占的,即當有比正在運行的進程優(yōu)先級更高的進程就緒時,系統(tǒng)可強行剝奪正在運行進程的CPU,提供給具有更高優(yōu)先級的進程使用,比Linux2.4內(nèi)核具備更好的實時響應性(不是所有的內(nèi)核代碼段都可以被搶占)。Linux2.6內(nèi)核加入了多種微控制器的支持,無MM U的處理器已經(jīng)整合進了新的內(nèi)核中,而且在無MM U控制器上仍舊支持多任務處理,但沒有內(nèi)存保護功能。對于WLAN、Bluetooth、GPRS、CDMA和WiFi等最新出現(xiàn)的無線網(wǎng)絡協(xié)議和設備,Linux2.6內(nèi)核重建了驅(qū)動的體系層次和編程模型,可以方便的適應這些網(wǎng)絡設備的變化,而且特別提出了NAPI(NewAPI)等模型提高網(wǎng)絡處理效率。
5.3.2嵌入式Linux的優(yōu)勢
嵌入式Linux的開發(fā)和研究是操作系統(tǒng)領域中的一個熱點,目前已經(jīng)開發(fā)成功的嵌入式系統(tǒng)中,大約有一半使用的是Linux.Linux之所以能在嵌入式系統(tǒng)市場上取得如此輝煌的成果,與其自身的優(yōu)良特性是分不開的。
(1)開放的源碼,豐富的軟件資源
Linux是自由的操作系統(tǒng),它的開放源碼使用戶獲得了最大的自由度。Linux上的軟件資源十分豐富,每一種通用程序在Linux上都可以找到。
(2)功能強大的內(nèi)核,性能高效、穩(wěn)定,多任務
Linux的內(nèi)核非常穩(wěn)定,它的高效和穩(wěn)定性已經(jīng)在各個領域,尤其在網(wǎng)絡服務器領域,得到了事實的驗證。Linux內(nèi)核小巧靈活,易于裁減,這使得它很適合嵌入式系統(tǒng)的應用。
(3)支持多種體系結(jié)構(gòu),如X86、ARM、MIPS、PowerPC、SPARC等
目前,Linux已經(jīng)被移植到數(shù)十種硬件平臺上,幾乎支持所有流行的CPU.
(4)完善的網(wǎng)絡通訊、圖形、文件管理機制
Linux自產(chǎn)生之日起就與網(wǎng)絡密不可分,網(wǎng)絡是Linux的強項。另外,Linux還支持多種文件和圖形系統(tǒng)。
(5)支持大量的周邊硬件設備
Linux上的驅(qū)動已經(jīng)非常豐富了,它們支持各種主流硬件設備和最新硬件技術。
(6)大小、功能都可定制
Linux秉承Unix的優(yōu)秀設計思想,非常靈活,各部分的可定制性都很強。
(7)良好的開發(fā)環(huán)境,不斷發(fā)展的開發(fā)工具集
Linux有著非常優(yōu)秀的完整開發(fā)工具鏈,有十幾種集成開發(fā)環(huán)境,其中很多是免費的,大大降低了開發(fā)費用。
(8)軟件開發(fā)者的廣泛支持
Linux的自由精神吸引了成千上萬的程序員投入到Linux的開發(fā)和測試中來,這使得Linux在短時間內(nèi)就成為一個功能強大的操作系統(tǒng)。
(9)價格低廉
有效降低產(chǎn)品成本,對成本敏感的嵌入式系統(tǒng)來說至關重要,Linux恰好具有這一特性。
5.3.3嵌入式Linux的移植
在同一個硬件平臺上可以嵌入不同的嵌入式操作系統(tǒng),就好比PC既可以安裝Windows又 可以安裝Linux一樣。同樣,有些操作系統(tǒng)經(jīng)過移植后可以運行在不同的硬件平臺上。如果一個系統(tǒng)可以在不同硬件平臺上運行,那么這個系統(tǒng)就是可移植的。 使某一個平臺的代碼運行在其他平臺上的。過程叫做移植。
在Linux系統(tǒng)內(nèi)核代碼中有arch目錄,其中包含了不同平臺(包括i386、 ARM)的代碼,arch目錄中的代碼是為多平臺設計并使用的,與體系結(jié)構(gòu)相關的代碼都存放在arch/
本系統(tǒng)采用Linux2.6.12,Samsung S3C2440已經(jīng)成為Linux的一個標準支持平臺,對內(nèi)核做簡單的修改和配置后,無需任何其他的patch就可以在S3C2440的目標板上運行得很好。
(1)針對內(nèi)核源碼的修改
設置flash分區(qū)
內(nèi)核對flash分區(qū)的支持是內(nèi)核移植成功的一個關鍵步驟,一共要修改三個文件,分別如下:
指明分區(qū)信息
在arch/arm/machs3c2410/devs.c文件中,添加如下內(nèi)容:
/**************增加的頭文件**************/
# include< linux/mtd/partitions.h>
#include < asm/arch/nand.h>
#include < linux/mtd/nand.h>
/**************建立NANDFlash分區(qū)表**************/
●指定啟動時初始化在
arch/arm/machs3c2410/machsmdk2410.c目錄,kernel啟動時依據(jù)對分區(qū)的設置進行初始配置,修改smdk_devices[]:指明初始化時包括前面所設置的flash分區(qū)信息,
static struct platform_device*smdk2410_devices[]__initdata={
3c_device_usb,
3c_device_lcd,
3c_device_wdt,
3c_device_i2c,
3c_device_iis,
3c_device_nand,/*添加該語句即可*/
};
●禁止Flash ECC校驗kernel是通過bootloader寫到Nand Flash的,bootloader通過軟件ECC算法產(chǎn)生ECC校驗碼。這與內(nèi)核校驗的ECC碼不一樣,內(nèi)核中的ECC碼是由S3C2440中的Nand Flash控制器產(chǎn)生的。
修改drivers/mtd/nand/s3c2410.c文件:找到s3c2410_nand_init_chip( )函數(shù),在該函數(shù)體最后加上如下語句。
chip ->eccmode = NAND_ECC_NONE ;
(2)內(nèi)核配置及編譯
主要是在make menuconfig中設置CPU以及設備驅(qū)動相關的配置信息,可以參考SMKD2410開發(fā)平臺上的有關配置,除了自定義的文件系統(tǒng)以及命令行參數(shù)外,基本上有關S3C2410處理器開發(fā)平臺上的配置均相同,在虛擬機上配置界面如圖5.2所示。
根目錄下只需修改Makefile文件。這個Makefile文件的任務有兩個:產(chǎn)生vmlinux件和產(chǎn)生內(nèi)核模塊。為了達到此目的,Makefile將遞歸進入到內(nèi)核的各個子目錄中,分別調(diào)用位于這些子目錄中的Makefile.
指定目標平臺
ARCH:=arm
指定交叉編譯器
CROSS_COMPILE=arm-linux-gcc
設置好交叉編譯器之后,執(zhí)行make clean、makeu Image,生成在IO模塊上運行的內(nèi)核映象文件uImage,通過網(wǎng)口或串口進行燒寫。
5. 4嵌入式根文件系統(tǒng)的構(gòu)建
Linux的一個最重要特點就是它支持許多不同的文件系統(tǒng)。這使Linux非常靈活,能夠與許多其他的操作系統(tǒng)共存。Linux支持的常見的文件系統(tǒng)有:JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。隨著時間的推移,Linux支持的文件系統(tǒng)數(shù)還會增加。
Linux是通過把系統(tǒng)支持的各種文件系統(tǒng)鏈接到一個單獨的樹形層次結(jié)構(gòu)中,來實現(xiàn)對多文件系統(tǒng)的支持的。該樹形層次結(jié)構(gòu)把文件系統(tǒng)表示成一個整個的獨立實體。無論什么類型的文件系統(tǒng),都被裝配到某個目錄上,由被裝配的文件系統(tǒng)的文件覆蓋該目錄原有的內(nèi)容。該個目錄被稱為裝配目錄或裝配點。在文件系統(tǒng)卸載時,裝配目錄中原有的文件才會顯露出來。
文件系統(tǒng)都會被燒錄在與某一存儲設備上。在嵌入式設備上很少使用大容量的ID E硬盤作為自己的存儲設備,嵌入式設備往往選用ROM、閃存( flash memory )等作為它的主要存儲設備。在嵌入式設備上選用哪種文件系統(tǒng)格式與閃存的特點是相關的。
本硬件平臺是以NAND Flash (閃存)作為主要的存儲媒介,這類存儲器與傳統(tǒng)存儲器最大的不同在于其是按扇區(qū)擦除、按位編程。Flash存儲介質(zhì)的這種技術特點使得傳統(tǒng)的Linux文件系統(tǒng)已經(jīng)不再適合在其上構(gòu)建,比如Ext2文件系統(tǒng),是專為像IDE那樣的塊設備設計的,沒有提供很好的扇區(qū)擦寫支持,不支持損耗平衡,沒有掉電保護,也沒有很好的扇區(qū)管理。這些缺點都表明,在Flash存儲介質(zhì)上應用為設備設計的傳統(tǒng)文件系統(tǒng)不是一個很好的選擇?;谶@樣的原因,產(chǎn)生了很多專為Flash設備而設計的文件系統(tǒng)。
利用BusyBox構(gòu)建嵌入式根文件系統(tǒng)
Linux下的根文件系統(tǒng)目錄結(jié)構(gòu)如下:
目錄 習慣用法
/bin 用戶命令所在目錄
/dev 硬件設備文件及其它特殊文件
/etc 系統(tǒng)配置文件,包括啟動文件等
/home 多用戶主目錄
/lib 鏈接庫文件目錄
/mnt 裝配點,用于裝配臨時文件系統(tǒng)或其他的文件系統(tǒng)
/opt 附加的軟件套件目錄
/proc 虛擬文件系統(tǒng),用來顯示內(nèi)核及進程信息
/root root用戶主目錄
/sbin 系統(tǒng)管理員命令目錄
/tmp 臨時文件目錄/usr用戶命令目錄
/var 監(jiān)控程序和工具程序所存放的可變數(shù)據(jù)
對于用途單一的嵌入式系統(tǒng),上邊的一些用于多用戶的目錄可以省略,例如/home、/opt、/root目錄等。而/bin、/dev、/etc、/lib、/proc、/sbin和/usr目錄,是幾乎每個系統(tǒng)必備的目錄,也是不可或缺的目錄。
制作根文件系統(tǒng),就是創(chuàng)建各種目錄,并在里面創(chuàng)建各種文件。比如在/bin、/sbin目錄下存放各種可執(zhí)行程序,在/etc目錄下存放配置文件,在/lib目錄下存放庫文件。使用Busy box制作根文件系統(tǒng),就是利用Busy box來創(chuàng)建/bin、/sbin等目錄下的可執(zhí)行的文件。
5.4.1 Buybox簡介
Buybox被非常形象地稱為嵌入式Linux系統(tǒng)中的“瑞士軍刀”,它是一個Uinx工具集。它可提供一百多種GNU常用工具、shell腳本工具等。雖然Buybox中的這些工具相對于GNU提供的完全工具有所簡化,但是它們都很實用。
Buybox在設計上就充分考慮了硬件資源受限的特殊工作環(huán)境。它采用模塊化設計,使得它很容易被定制和裁剪??梢愿鶕?jù)實際的用途,裁剪出一個最精簡的工具集。
Buybox的特色是所有命令都編譯成一個文件:Buybox,其他命令工具(如sh、cp、ls等)都是指向Buybox文件的鏈接。在使用Buybox生成的工具時,會根據(jù)工具的文件名鏈接到特定的處理程序。這樣,所有這些程序只需被加載一次,而所有的Buybox工具組件都可以共享相同的代碼段,這在很大程度上節(jié)省了系統(tǒng)的內(nèi)存資源也提高了應用程序的執(zhí)行速度。
Buybox僅需要幾百KB的空間就可以運行,這使得Buybox很適合嵌入式系統(tǒng)使用。同時,Buybox的安裝腳本也使得它很容易建立基于Buybox的根文件系統(tǒng)。通常只需要添加/dev、/etc等目錄以及相關的配置腳本,就可以實現(xiàn)一個簡單的根文件系統(tǒng)。
5.4.2 Buybox的配置編譯
將Buybox的源碼從網(wǎng)站上下載到本地目錄,運行命令:
$tarzxvf Buybox-1.1.3.tar.gz
$cd Buybox-1.1.3
$make menuconfig
在虛擬機上配置界面如圖5.3所示
典型的Buybox文件大小在動態(tài)鏈接的情況下是300KB左右,靜態(tài)鏈接為800KB左右,用它實現(xiàn)的文件系統(tǒng)完全可以控制在1MB以下。
5.4.3根文件系統(tǒng)鏡像構(gòu)建
通常情況下根文件系統(tǒng)鏡像是系統(tǒng)構(gòu)建的最后一步。利用交叉編譯工具將應用程序、內(nèi)核分別配置和編譯之后,把獲得的C鏈接庫、內(nèi)核模塊以及應用程序按照FHS規(guī)則放到相應位置,利用文件系統(tǒng)自帶的工具mkyaffs image來最終生成一個根文件系統(tǒng)鏡像file system.yaffs.