張 梅 何福貴
摘 要:由于嵌入式系統(tǒng)是一個(gè)資源受限的系統(tǒng),所以嵌入系統(tǒng)的軟件開發(fā)是采用交叉開發(fā)實(shí)現(xiàn)的。本文總結(jié)了嵌入式系統(tǒng)軟件的開發(fā)技術(shù),分析了嵌入式軟件開發(fā)的各個(gè)過程,給出了每個(gè)過程能夠使用的各種方法和技術(shù),詳細(xì)敘述了它們的實(shí)現(xiàn)過程,主要內(nèi)容包括啟動(dòng)軟件的選擇、啟動(dòng)軟件的各種燒寫方法、操作系統(tǒng)內(nèi)核的下載方法、根文件系統(tǒng)的下載方法、NFS文件系統(tǒng)的配置、通過NFS應(yīng)用程序的交叉開發(fā)和目標(biāo)機(jī)程序的編譯等。
關(guān)鍵詞:嵌入式系統(tǒng)交叉開發(fā)網(wǎng)絡(luò)文件系統(tǒng)簡單文件傳輸協(xié)議
中圖分類號(hào):TP311.52文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1673-8454(2009)17-0078-03
嵌入式系統(tǒng)將擁有最大的市場(chǎng)。目前在世界范圍內(nèi)嵌入式系統(tǒng)帶來的工業(yè)年產(chǎn)值已超過了一萬億元, 現(xiàn)在嵌入式系統(tǒng)正處在高速發(fā)展階段。 嵌入式系統(tǒng)通常是一個(gè)資源受限的系統(tǒng),因此直接在嵌入式系統(tǒng)的硬件平臺(tái)上開發(fā)軟件比較困難,有時(shí)候甚至是不可能的。目前一般采用的解決辦法是首先在通用計(jì)算機(jī)上編寫程序,然后通過交叉編譯生成目標(biāo)平臺(tái)上可以運(yùn)行的二進(jìn)制代碼格式,最后再下載到目標(biāo)平臺(tái)上的特定位置上運(yùn)行。需要交叉開發(fā)環(huán)境(Cross Development Environment)的支持是嵌入式應(yīng)用軟件開發(fā)時(shí)的一個(gè)顯著特點(diǎn),交叉開發(fā)環(huán)境是指編譯、鏈接和調(diào)試嵌入式軟件的環(huán)境,它與運(yùn)行嵌入式軟件的環(huán)境有所不同,通常采用宿主機(jī)/目標(biāo)機(jī)模式,目標(biāo)機(jī)和宿主機(jī)之間的連接通常有三種連接方式:目標(biāo)機(jī)的串口連接宿主機(jī)的串口,目標(biāo)機(jī)的JTAG口連接宿主機(jī)的并行口,目標(biāo)機(jī)的網(wǎng)口連接宿主機(jī)的網(wǎng)口,如圖1所示。
本文選用某公司生產(chǎn)的OURS_ ARM9_2410EP為嵌入式目標(biāo)系統(tǒng),OURS_ARM9_2410EP是一個(gè)典型的嵌入式實(shí)驗(yàn)系統(tǒng), 支持ARM9,具有豐富的外部接口,包括串口、JTAG口、PCMCIA卡、SMC卡、SD卡、USB 、網(wǎng)口和VGA接口等,支持三種啟動(dòng)方式,分別可以從兩種NOR FLASH和一種NAND FLASH啟動(dòng),具有豐富的擴(kuò)展功能,可擴(kuò)展GPS&GPRS、射頻卡和藍(lán)牙等模塊。
一、目標(biāo)機(jī)程序的編譯
嵌入式系統(tǒng)中的軟件一般包含四個(gè)部分:啟動(dòng)部分、操作系統(tǒng)內(nèi)核、根文件系統(tǒng)和應(yīng)用程序,這些程序是在宿主機(jī)的交叉編譯環(huán)境中編譯成目標(biāo)機(jī)CPU能夠運(yùn)行的目標(biāo)代碼,然后下載到目標(biāo)機(jī)。常用的嵌入式集成開發(fā)環(huán)境有Tornado、PB(Platform Builder)、ADS(ARM Developer Suite)、GNU工具鏈等。
二、啟動(dòng)部分的燒寫
啟動(dòng)部分的燒寫有三種方法:通過JTAG接口使用命令燒寫、使用仿真器燒寫和交叉燒寫,其中交叉燒寫要求嵌入式系統(tǒng)中含有兩個(gè)啟動(dòng)部分。
ARM9_2410EP可以直接從FLASH硬盤的零地址執(zhí)行代碼,也就是說將初始啟動(dòng)代碼燒寫到FLASH零地址開始的地方就可以啟動(dòng)目標(biāo)系統(tǒng)。支持ARM結(jié)構(gòu)的啟動(dòng)軟件有:U_BOOT、PPCBOOT、REBOOT和BLOB,本文以PPCBOOT為例進(jìn)行說明。
PPCBOOT是源代碼開放并遵守GPL(General Public License )的自由軟件,支持多種CPU架構(gòu),包括alpha、arm、x86、ia64、mips、mips64、ppc、s390、sh、sparc和sparc64,是被廣泛使用的一個(gè)啟動(dòng)軟件。
首先使用GNU工具鏈將PPCBOOT編譯成在目標(biāo)機(jī)可運(yùn)行的程序ppcboot.bin,編譯過程請(qǐng)參閱文獻(xiàn)[1]。
1.通過JTAG接口燒寫
JTAG技術(shù)可以實(shí)現(xiàn)在目標(biāo)機(jī)是裸機(jī)的情況下將程序燒寫到目標(biāo)機(jī),是簡單和直接的燒寫方法。
用JTAG連接線連接宿主機(jī)的并口和目標(biāo)機(jī)的JTAG接口,確認(rèn)已經(jīng)將JTAG 連接好,通過跳線開關(guān)配置要燒寫的NOR FLASH。在Red Hat Linux或 Windows XP打開命令窗口,運(yùn)行命令:
./JFLASH_2410EP_Nor /f: ppcboot.bin
其中JFLASH為燒寫工具,/f表示文件,ppcboot.bin是OURS_ARM9_2410EP系統(tǒng)引導(dǎo)程序。
后面有兩個(gè)選擇,表示要燒寫的目標(biāo)地址,分別選擇0,0,即開始對(duì)FLASH燒寫引導(dǎo)程序ppcboot.bin。此后大約等待六七分鐘,燒寫完成。燒寫結(jié)束后又出現(xiàn)選擇,輸入2退出,這時(shí)目標(biāo)板的啟動(dòng)部分燒寫完成。使用這種方法燒寫的時(shí)間比較長,一般較少使用。
2.通過仿真器燒寫
在Windows XP中安裝ARM ADS集成開發(fā)環(huán)境,即ARM Developer Suite。安裝Multi-ICE仿真器,在宿主機(jī)的并口和目標(biāo)機(jī)的JTAG接口之間連接仿真器,連接宿主機(jī)的串口和目標(biāo)機(jī)的串口,安裝Multi-ICE v2.2軟件。運(yùn)行Multi-ICE Server,點(diǎn)擊軟件界面左上角的Auto-Configure按鈕,在出現(xiàn)仿真器符號(hào)后,仿真器連接成功。
通過仿真器可以使程序直接運(yùn)行在目標(biāo)機(jī)的內(nèi)存中,不使用目標(biāo)機(jī)的FLASH,有很多程序就是通過仿真器在目標(biāo)機(jī)運(yùn)行和調(diào)試的。
在Windows XP中打開超級(jí)終端,在ADS集成開發(fā)環(huán)境中編譯項(xiàng)目ProgramFlash,ProgramFlash是專門編寫的操作FLASH的一個(gè)軟件。通過仿真器運(yùn)行ProgramFlash,ProgramFlash在超級(jí)終端的運(yùn)行界面如圖2所示。
選擇寫入的FLASH,然后在超級(jí)終端發(fā)送ppcboot.bin,按照提示就可以完成啟動(dòng)的燒寫。
3.交叉燒寫
在目標(biāo)機(jī)支持多啟動(dòng)的情況下, 可以從一個(gè)FLASH啟動(dòng),利用啟動(dòng)軟件寫FLASH的功能,通過熱跳線,寫到另一個(gè)FLASH中。
如圖3所示是一個(gè)支持燒寫FLASH的啟動(dòng)軟件的運(yùn)行界面,此時(shí)通過熱跳線到另一個(gè)FLASH, 然后選擇4就可以實(shí)現(xiàn)交叉燒寫。
三、操作系統(tǒng)內(nèi)核的下載
操作系統(tǒng)內(nèi)核下載到目標(biāo)機(jī)有三種方法:通過JTAG燒寫、通過網(wǎng)口和串口從宿主機(jī)下載。其中通過JTAG燒寫的操作與第一部分相同。在目標(biāo)機(jī)啟動(dòng)PPCBOOT后,由于PPCBOOT支持網(wǎng)口和串口下載,操作系統(tǒng)內(nèi)核就通過網(wǎng)口或串口下載到目標(biāo)機(jī)。PPCBOOT的詳細(xì)使用說明見參考文獻(xiàn)[2]。
目前使用較多的嵌入式實(shí)時(shí)操作系統(tǒng)有:美國WindRiver公司設(shè)計(jì)開發(fā)的嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks、微軟公司的WindowsCE、Linux、UC/OS、eCos、Lynx實(shí)時(shí)系統(tǒng)公司的LynxOS和QNX軟件系統(tǒng)有限公司的QNX等。
本文以Linux為例說明操作過程,Linux內(nèi)核的交叉編譯是在Red Hat Linux環(huán)境中實(shí)現(xiàn)的,編譯后內(nèi)核的文件名是bzImage,內(nèi)核的編譯過程見文獻(xiàn)[3]。
下面分別說明通過網(wǎng)口和串口內(nèi)核的下載過程。
1.使用網(wǎng)口
從網(wǎng)口下載操作系統(tǒng)內(nèi)核,首先要在Red Hat Linux或Windows XP中啟動(dòng)tftp服務(wù),啟動(dòng)超級(jí)終端,然后啟動(dòng)目標(biāo)機(jī)的PPCBOOT,在超級(jí)終端中就可以使用PPCBOOT的tftp命令,將內(nèi)核下載到目標(biāo)機(jī)。[4]
下面分別說明在Red Hat Linux和Windows XP環(huán)境中的操作過程。SMDK2410 #表示PPCBOOT的提示符。
(1)Red Hat Linux環(huán)境
實(shí)現(xiàn)過程:1)在Red Hat Linux中啟動(dòng)tftp服務(wù);2)在根目錄下建立/tftpboot目錄;3)把Linux 內(nèi)核bzImage拷貝到/tftpboot目錄下;4)在Red Hat Linux中啟動(dòng)超級(jí)終端minicom;5)啟動(dòng)目標(biāo)板的PPCBOOT;6)在超級(jí)終端中運(yùn)行tftp命令SMDK2410 # tftp 0x30008000 bzImage。其中數(shù)值0x30008000為內(nèi)核下載到實(shí)驗(yàn)箱內(nèi)存中的地址。7)下載Linux內(nèi)核, SMDK2410# fl 0x1040000 0x30008000 0x100000。三個(gè)參數(shù)的意義:0x1040000為內(nèi)核燒寫到Flash的地址,當(dāng)PPCBOOT啟動(dòng)后它會(huì)從此地址加載Linux內(nèi)核。0x30008000為上一步使用的內(nèi)核下載到內(nèi)存中的地址。0x100000為內(nèi)核的大小,0x100000可被替換為大于內(nèi)核大小且是0x20000倍數(shù)的最小整數(shù)。
(2)Windows XP 環(huán)境
實(shí)現(xiàn)過程:1)在Windows XP中啟動(dòng)tftp服務(wù)器;2)在Windows XP中啟動(dòng)超級(jí)終端;3)啟動(dòng)目標(biāo)板PPCBOOT;4)在超級(jí)終端中運(yùn)行命令:SMDK2410 # tftp 0x30008000bzImage;5)下載Linux內(nèi)核:SMDK2410# fl 0x1040000 0x30008000 0x100000。
2.通過串口
從串口下載操作系統(tǒng)內(nèi)核,同樣需要在Red Hat Linux或Windows XP中啟動(dòng)超級(jí)終端。啟動(dòng)目標(biāo)機(jī)的PPCBOOT,在PPCBOOT的提示符下輸入loadb命令, loadb命令的功能是通過串行線下載可執(zhí)行文件到目標(biāo)機(jī),命令格式是:loadb [offset] [baud], 其中Offset是地址偏移量,baud是串口的波特率。
這個(gè)命令開始執(zhí)行后,在超級(jí)終端中打開發(fā)送文件選項(xiàng),出現(xiàn)發(fā)送文件對(duì)話框,在文件名選擇項(xiàng)中加入要燒寫的內(nèi)核,然后單擊發(fā)送,注意超級(jí)終端的波特率要與loadb命令的波特率一致。
四、根文件系統(tǒng)
根文件系統(tǒng)(Root File System)下載到目標(biāo)機(jī)的方法與操作系統(tǒng)內(nèi)核的方法相同。
首先制作根文件系統(tǒng),Linux根文件系統(tǒng)的制作見文獻(xiàn)[5],假定制作后根文件系統(tǒng)的文件名是ramdisk.image.gz,使用下面的命令下載。
SMDK2410# tftp 30800000 ramdisk.imag.gz
SMDK2410# fl 1140000 30800000 200000
其參數(shù)意義與上面的內(nèi)核下載相同。
五、應(yīng)用程序
由于應(yīng)用程序運(yùn)行在內(nèi)核和根文件之上,所以應(yīng)用程序的交叉開發(fā)能采用更方便的方法,一般采用NFS系統(tǒng)實(shí)現(xiàn)。在應(yīng)用程序運(yùn)行之前,應(yīng)交叉編譯為目標(biāo)機(jī)的可執(zhí)行程序。
NFS(Network File System)指網(wǎng)絡(luò)文件系統(tǒng),是Linux系統(tǒng)中經(jīng)常使用的一種服務(wù),NFS是一個(gè)RPC service,很像Windows中的文件共享服務(wù)。它的設(shè)計(jì)是為了在不同的系統(tǒng)間使用, 所以它的通訊協(xié)議設(shè)計(jì)與主機(jī)及作業(yè)系統(tǒng)無關(guān)。當(dāng)使用者想使用遠(yuǎn)端檔案時(shí)只要用“mount”就可把遠(yuǎn)端檔案系統(tǒng)掛接在自己的檔案系統(tǒng)之下,使得遠(yuǎn)端的檔案在使用上和本地的檔案沒兩樣。
NFS系統(tǒng)配置包括目標(biāo)機(jī)和宿主機(jī)的配置,其中以宿主機(jī)已配置為主。
在NFS服務(wù)中,宿主機(jī)(Servers)是被掛載(mount)端,為了遠(yuǎn)端目標(biāo)機(jī)(Clients)可以訪問宿主機(jī)的文件,宿主機(jī)配置兩方面內(nèi)容:打開NFS服務(wù),允許“指定用戶”使用。
在Red Hat Linux或Windows XP中均可以使用NFS服務(wù),本文以Red Hat Linux為例進(jìn)行說明。
1.NFS文件系統(tǒng)配置
宿主機(jī)NFS 文件系統(tǒng)的配置過程如下。
首先打開/etc/exports文件,加入如下內(nèi)容:
/ 192.168.2.* (rw,sync,no_root_squash)。
其中:/表示宿主機(jī)的目錄,在目標(biāo)機(jī)共享,192.168.2.*為目標(biāo)機(jī)的IP地址范圍,括弧內(nèi)表示操作的權(quán)限,然后運(yùn)行命令:exportfs。
NFS服務(wù)的啟動(dòng)是由一些命令來完成的,它們是:portmap、rpc.nfsd、rpc.lockd、rpc.statd、rpc.mountd和rpc.rquotad,如果系統(tǒng)中有這幾個(gè)命令,就運(yùn)行下列命令啟動(dòng)NFS服務(wù):service nfs start或/etc/rc.d/init.d/nfsstart;如果系統(tǒng)中沒有,就下載工具包nfs-utils-1.0.7.tar.gz,然后編譯安裝就可以了。在目標(biāo)機(jī)也應(yīng)該啟動(dòng)NFS服務(wù)。在上述的工作完成以后,目標(biāo)機(jī)和宿主機(jī)就可以通過NFS 文件系統(tǒng)進(jìn)行軟件的調(diào)試和運(yùn)行,即軟件編譯在宿主機(jī)完成,運(yùn)行在目標(biāo)機(jī)。
2.通過NFS文件系統(tǒng)進(jìn)行訪問
訪問過程的實(shí)現(xiàn)如下:在宿主機(jī)的Red Hat Linux 中運(yùn)行命令:minicom,minicom是Linux下的超級(jí)終端,進(jìn)入超級(jí)終端后進(jìn)行一些設(shè)置,首先按下Ctrl-A,再按Z,然后選擇O,進(jìn)入配置界面,按上下鍵選擇Serial port setup 進(jìn)行如下設(shè)置:
Serial Device:/dev/ttyS0
BPS/par/bits:/115200 8N1
硬件流、軟件流均選擇無
然后按ESC鍵退出配置界面,啟動(dòng)目標(biāo)機(jī),就在超級(jí)終端出現(xiàn)Linux命令提示符,鍵入命令:ifconfig eth0 192.168.2.2,配置目標(biāo)機(jī)的IP地址,然后在宿主機(jī)的控制臺(tái)運(yùn)行命令:ifconfig eth0 192.168.2.10,配置宿主機(jī)的IP地址。
然后在宿主機(jī)的超級(jí)終端中鍵入命令:mount-t nfs 192.168.2.10://mnt/,它的作用是把宿主機(jī)的/目錄掛接到目標(biāo)機(jī)的/mnt/ 目錄中,這時(shí)宿主機(jī)的/目錄下的程序就可以運(yùn)行在目標(biāo)機(jī)中。需要注意的是宿主機(jī)應(yīng)關(guān)閉防火
墻。
六、結(jié)論
本文對(duì)嵌入式開發(fā)進(jìn)行了總結(jié),總結(jié)了嵌入式目標(biāo)機(jī)軟件的各個(gè)部分各種不同的實(shí)現(xiàn)方法,詳細(xì)介紹了它們的實(shí)現(xiàn)過程。本文選用OURS_ARM9_2410EP作為實(shí)驗(yàn)對(duì)象,OURS_ARM9_2410EP是一款具有代表性的嵌入式實(shí)驗(yàn)平臺(tái),其他產(chǎn)品的操作是類似的。本文介紹的方法可在S3C2410的產(chǎn)品中使用,可對(duì)嵌入式開發(fā)提供一些參考方法。
參考文獻(xiàn):
[1]將ppcboot2.0.0移植到s3c2410平臺(tái).http://www.yuanma.org/data/2006/0917/article_1549.htm,2006.09.
[2]PPC Boot Firmware User Manual.http://www.radstone.com/linux/linux1/ppcboot.pdf,2004.
[3]陳健,宋健建.Linux程序設(shè)計(jì)(第三版)[M].北京:人民郵電出版社,2006.
[4]汪小燕,連曉平,董燕,楊大鵬.基于TFTP 協(xié)議的嵌入式系統(tǒng)開發(fā)方法設(shè)計(jì)與實(shí)現(xiàn)[J].華中科技大學(xué)學(xué)報(bào)(自然科學(xué)版),2006,34(12):56-58.
[5]馮世奎,劉玓.Linux嵌入式系統(tǒng)根文件系統(tǒng)的選擇與制作[J].成都信息工程學(xué)院學(xué)報(bào), 2006,21(4): 508-512.