張 梅 何福貴
摘 要:由于嵌入式系統(tǒng)是一個(gè)資源受限的系統(tǒng),所以嵌入系統(tǒng)的軟件開(kāi)發(fā)是采用交叉開(kāi)發(fā)實(shí)現(xiàn)的。本文總結(jié)了嵌入式系統(tǒng)軟件的開(kāi)發(fā)技術(shù),分析了嵌入式軟件開(kāi)發(fā)的各個(gè)過(guò)程,給出了每個(gè)過(guò)程能夠使用的各種方法和技術(shù),詳細(xì)敘述了它們的實(shí)現(xiàn)過(guò)程,主要內(nèi)容包括啟動(dòng)軟件的選擇、啟動(dòng)軟件的各種燒寫(xiě)方法、操作系統(tǒng)內(nèi)核的下載方法、根文件系統(tǒng)的下載方法、NFS文件系統(tǒng)的配置、通過(guò)NFS應(yīng)用程序的交叉開(kāi)發(fā)和目標(biāo)機(jī)程序的編譯等。
關(guān)鍵詞:嵌入式系統(tǒng)交叉開(kāi)發(fā)網(wǎng)絡(luò)文件系統(tǒng)簡(jiǎn)單文件傳輸協(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)帶來(lái)的工業(yè)年產(chǎn)值已超過(guò)了一萬(wàn)億元, 現(xiàn)在嵌入式系統(tǒng)正處在高速發(fā)展階段。 嵌入式系統(tǒng)通常是一個(gè)資源受限的系統(tǒng),因此直接在嵌入式系統(tǒng)的硬件平臺(tái)上開(kāi)發(fā)軟件比較困難,有時(shí)候甚至是不可能的。目前一般采用的解決辦法是首先在通用計(jì)算機(jī)上編寫(xiě)程序,然后通過(guò)交叉編譯生成目標(biāo)平臺(tái)上可以運(yùn)行的二進(jìn)制代碼格式,最后再下載到目標(biāo)平臺(tái)上的特定位置上運(yùn)行。需要交叉開(kāi)發(fā)環(huán)境(Cross Development Environment)的支持是嵌入式應(yīng)用軟件開(kāi)發(fā)時(shí)的一個(gè)顯著特點(diǎn),交叉開(kāi)發(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ī)。常用的嵌入式集成開(kāi)發(fā)環(huán)境有Tornado、PB(Platform Builder)、ADS(ARM Developer Suite)、GNU工具鏈等。
二、啟動(dòng)部分的燒寫(xiě)
啟動(dòng)部分的燒寫(xiě)有三種方法:通過(guò)JTAG接口使用命令燒寫(xiě)、使用仿真器燒寫(xiě)和交叉燒寫(xiě),其中交叉燒寫(xiě)要求嵌入式系統(tǒng)中含有兩個(gè)啟動(dòng)部分。
ARM9_2410EP可以直接從FLASH硬盤的零地址執(zhí)行代碼,也就是說(shuō)將初始啟動(dòng)代碼燒寫(xiě)到FLASH零地址開(kāi)始的地方就可以啟動(dòng)目標(biāo)系統(tǒng)。支持ARM結(jié)構(gòu)的啟動(dòng)軟件有:U_BOOT、PPCBOOT、REBOOT和BLOB,本文以PPCBOOT為例進(jìn)行說(shuō)明。
PPCBOOT是源代碼開(kāi)放并遵守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,編譯過(guò)程請(qǐng)參閱文獻(xiàn)[1]。
1.通過(guò)JTAG接口燒寫(xiě)
JTAG技術(shù)可以實(shí)現(xiàn)在目標(biāo)機(jī)是裸機(jī)的情況下將程序燒寫(xiě)到目標(biāo)機(jī),是簡(jiǎn)單和直接的燒寫(xiě)方法。
用JTAG連接線連接宿主機(jī)的并口和目標(biāo)機(jī)的JTAG接口,確認(rèn)已經(jīng)將JTAG 連接好,通過(guò)跳線開(kāi)關(guān)配置要燒寫(xiě)的NOR FLASH。在Red Hat Linux或 Windows XP打開(kāi)命令窗口,運(yùn)行命令:
./JFLASH_2410EP_Nor /f: ppcboot.bin
其中JFLASH為燒寫(xiě)工具,/f表示文件,ppcboot.bin是OURS_ARM9_2410EP系統(tǒng)引導(dǎo)程序。
后面有兩個(gè)選擇,表示要燒寫(xiě)的目標(biāo)地址,分別選擇0,0,即開(kāi)始對(duì)FLASH燒寫(xiě)引導(dǎo)程序ppcboot.bin。此后大約等待六七分鐘,燒寫(xiě)完成。燒寫(xiě)結(jié)束后又出現(xiàn)選擇,輸入2退出,這時(shí)目標(biāo)板的啟動(dòng)部分燒寫(xiě)完成。使用這種方法燒寫(xiě)的時(shí)間比較長(zhǎng),一般較少使用。
2.通過(guò)仿真器燒寫(xiě)
在Windows XP中安裝ARM ADS集成開(kāi)發(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)后,仿真器連接成功。
通過(guò)仿真器可以使程序直接運(yùn)行在目標(biāo)機(jī)的內(nèi)存中,不使用目標(biāo)機(jī)的FLASH,有很多程序就是通過(guò)仿真器在目標(biāo)機(jī)運(yùn)行和調(diào)試的。
在Windows XP中打開(kāi)超級(jí)終端,在ADS集成開(kāi)發(fā)環(huán)境中編譯項(xiàng)目ProgramFlash,ProgramFlash是專門編寫(xiě)的操作FLASH的一個(gè)軟件。通過(guò)仿真器運(yùn)行ProgramFlash,ProgramFlash在超級(jí)終端的運(yùn)行界面如圖2所示。
選擇寫(xiě)入的FLASH,然后在超級(jí)終端發(fā)送ppcboot.bin,按照提示就可以完成啟動(dòng)的燒寫(xiě)。
3.交叉燒寫(xiě)
在目標(biāo)機(jī)支持多啟動(dòng)的情況下, 可以從一個(gè)FLASH啟動(dòng),利用啟動(dòng)軟件寫(xiě)FLASH的功能,通過(guò)熱跳線,寫(xiě)到另一個(gè)FLASH中。
如圖3所示是一個(gè)支持燒寫(xiě)FLASH的啟動(dòng)軟件的運(yùn)行界面,此時(shí)通過(guò)熱跳線到另一個(gè)FLASH, 然后選擇4就可以實(shí)現(xiàn)交叉燒寫(xiě)。
三、操作系統(tǒng)內(nèi)核的下載
操作系統(tǒng)內(nèi)核下載到目標(biāo)機(jī)有三種方法:通過(guò)JTAG燒寫(xiě)、通過(guò)網(wǎng)口和串口從宿主機(jī)下載。其中通過(guò)JTAG燒寫(xiě)的操作與第一部分相同。在目標(biāo)機(jī)啟動(dòng)PPCBOOT后,由于PPCBOOT支持網(wǎng)口和串口下載,操作系統(tǒng)內(nèi)核就通過(guò)網(wǎng)口或串口下載到目標(biāo)機(jī)。PPCBOOT的詳細(xì)使用說(shuō)明見(jiàn)參考文獻(xiàn)[2]。
目前使用較多的嵌入式實(shí)時(shí)操作系統(tǒng)有:美國(guó)WindRiver公司設(shè)計(jì)開(kāi)發(fā)的嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks、微軟公司的WindowsCE、Linux、UC/OS、eCos、Lynx實(shí)時(shí)系統(tǒng)公司的LynxOS和QNX軟件系統(tǒng)有限公司的QNX等。
本文以Linux為例說(shuō)明操作過(guò)程,Linux內(nèi)核的交叉編譯是在Red Hat Linux環(huán)境中實(shí)現(xiàn)的,編譯后內(nèi)核的文件名是bzImage,內(nèi)核的編譯過(guò)程見(jiàn)文獻(xiàn)[3]。
下面分別說(shuō)明通過(guò)網(wǎng)口和串口內(nèi)核的下載過(guò)程。
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]
下面分別說(shuō)明在Red Hat Linux和Windows XP環(huán)境中的操作過(guò)程。SMDK2410 #表示PPCBOOT的提示符。
(1)Red Hat Linux環(huán)境
實(shí)現(xiàn)過(guò)程: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)核燒寫(xiě)到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)過(guò)程: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.通過(guò)串口
從串口下載操作系統(tǒng)內(nèi)核,同樣需要在Red Hat Linux或Windows XP中啟動(dòng)超級(jí)終端。啟動(dòng)目標(biāo)機(jī)的PPCBOOT,在PPCBOOT的提示符下輸入loadb命令, loadb命令的功能是通過(guò)串行線下載可執(zhí)行文件到目標(biāo)機(jī),命令格式是:loadb [offset] [baud], 其中Offset是地址偏移量,baud是串口的波特率。
這個(gè)命令開(kāi)始執(zhí)行后,在超級(jí)終端中打開(kāi)發(fā)送文件選項(xiàng),出現(xiàn)發(fā)送文件對(duì)話框,在文件名選擇項(xiàng)中加入要燒寫(xiě)的內(nèi)核,然后單擊發(fā)送,注意超級(jí)終端的波特率要與loadb命令的波特率一致。
四、根文件系統(tǒng)
根文件系統(tǒng)(Root File System)下載到目標(biāo)機(jī)的方法與操作系統(tǒng)內(nèi)核的方法相同。
首先制作根文件系統(tǒng),Linux根文件系統(tǒng)的制作見(jiàn)文獻(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)用程序的交叉開(kāi)發(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)無(wú)關(guān)。當(dāng)使用者想使用遠(yuǎn)端檔案時(shí)只要用“mount”就可把遠(yuǎn)端檔案系統(tǒng)掛接在自己的檔案系統(tǒng)之下,使得遠(yuǎn)端的檔案在使用上和本地的檔案沒(méi)兩樣。
NFS系統(tǒng)配置包括目標(biāo)機(jī)和宿主機(jī)的配置,其中以宿主機(jī)已配置為主。
在NFS服務(wù)中,宿主機(jī)(Servers)是被掛載(mount)端,為了遠(yuǎn)端目標(biāo)機(jī)(Clients)可以訪問(wèn)宿主機(jī)的文件,宿主機(jī)配置兩方面內(nèi)容:打開(kāi)NFS服務(wù),允許“指定用戶”使用。
在Red Hat Linux或Windows XP中均可以使用NFS服務(wù),本文以Red Hat Linux為例進(jìn)行說(shuō)明。
1.NFS文件系統(tǒng)配置
宿主機(jī)NFS 文件系統(tǒng)的配置過(guò)程如下。
首先打開(kāi)/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)是由一些命令來(lái)完成的,它們是: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)中沒(méi)有,就下載工具包nfs-utils-1.0.7.tar.gz,然后編譯安裝就可以了。在目標(biāo)機(jī)也應(yīng)該啟動(dòng)NFS服務(wù)。在上述的工作完成以后,目標(biāo)機(jī)和宿主機(jī)就可以通過(guò)NFS 文件系統(tǒng)進(jìn)行軟件的調(diào)試和運(yùn)行,即軟件編譯在宿主機(jī)完成,運(yùn)行在目標(biāo)機(jī)。
2.通過(guò)NFS文件系統(tǒng)進(jìn)行訪問(wèn)
訪問(wèn)過(guò)程的實(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
硬件流、軟件流均選擇無(wú)
然后按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ì)嵌入式開(kāi)發(fā)進(jìn)行了總結(jié),總結(jié)了嵌入式目標(biāo)機(jī)軟件的各個(gè)部分各種不同的實(shí)現(xiàn)方法,詳細(xì)介紹了它們的實(shí)現(xiàn)過(guò)程。本文選用OURS_ARM9_2410EP作為實(shí)驗(yàn)對(duì)象,OURS_ARM9_2410EP是一款具有代表性的嵌入式實(shí)驗(yàn)平臺(tái),其他產(chǎn)品的操作是類似的。本文介紹的方法可在S3C2410的產(chǎn)品中使用,可對(duì)嵌入式開(kāi)發(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)開(kāi)發(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.