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