1 前言 嵌入式Linux下的應用程序的開發,與Windows下應用程序的開發大不相同。在Windows環境中,可以直接在PC上使用各種集成編譯開發工具,完成程序編輯、編譯和運行,而在嵌入式Linux環境下,缺少簡單、高效的開發工具,程序的開發需要在PC+嵌入式Linux平臺完成。因此,在程序的調試運行過程中,需要在Linux服務器和嵌入式開發板間交換信息,這種信息交換目前最常用的方式是FTP方式,即:先在Linux服務器上編輯源文件,然后交叉編譯生成可執行文件,再通過FTP下載到嵌入式主機系統中運行,如出現錯誤則回到Linux服務器上重新編譯,再下載運行,直到程序正確運行為止。但FTP方式缺點是效率比較低,而且無法在線調試。這里筆者討論另一種更高效率的信息交換方式,即:NFS(網絡文件系統)方式下嵌入式Linux下的應用程序的實現方法。本文以三星公司ARM9內核芯片S3C2410開發板接口為基礎,軟件采用Linux 2.4.21,編譯器為arm-linux-gcc的交叉編譯器。 2 嵌入式Linux開發平臺的建立 在嵌入式Linux下開發應用程序,必須建立一個完善的嵌入式Linux開發環境。 2.1 嵌入式Linux開發平臺構架 嵌入式Linux 開發平臺構架主要包括:嵌入式Linux 服務器、工作站、嵌入式開發板系統,其結構如圖1所示。 嵌入式Linux 服務器由一臺PC充當,主要作為嵌入式Linux內核編譯、應用程序編譯的公共平臺,這里安裝標準的Redhat Linux操作系統 ,工作站為普通局域網計算機,可以是一臺或多臺,安裝Windows操作系統,一般用來完成各種日常工作,可視需要與Linux 服務器、嵌入式開發板系統連接,嵌入式開發板系統是用來開發嵌入式應用程序,它必須與Linux 服務器進行網絡連接,目的是建立網絡文件系統,把Linux服務器上的特定目錄共享到待調試的嵌入式開發板系統上,從而實時地對應用程序進行編輯、編譯、調試。另外嵌入式開發板系統可通過串口與工作站RS232連接,使用工作站上的超級終端作為嵌入式開發板系統上的輸入/輸出終端。 2.2 嵌入式開發板操作系統的移植 嵌入式開發板操作系統就是嵌入式Linux,它指的是標準Linux操作系統的內核,把標準Linux操作系統的進行適當的裁剪,加入一些特定的功能,形成一個小巧、高效的滿足特定需要的專用操作系統,然后移植到ARM體系結構的開發板系統上,移植主要包括建立交叉編譯環境、修改內核源碼、內核裁剪和內核編譯4個環節。 2.2.1建立交叉編譯環境 交叉編譯是指利用運行在某臺計算機上的編譯器編譯某個源程序生成在另一種結構計算機上運行的目標代碼的過程。編譯器的生成依賴于相應的函數庫,而這些函數庫又得依靠編譯器來編譯。建立交叉編譯環境就是將ARM使用的編譯器(如:arm-linux-gcc)和函數庫(如:glibc)安裝到指定目錄,并使用configure配置好Makefile文件。 2.2.2 修改內核源代碼 Linux內核分為體系結構相關部分和體系結構無關部分。在Linux啟動的第一階段,內核與體系結構相關部分首先執行,它會完成硬件寄存器設置,內存映射等初始化工作。然后把控制權轉給內核中與系統體系結構無關的部分。在移植工作中要修改的代碼主要集中在與體系結構相關的部分。ARM芯片的體系結構在arch/arm目錄下。首先根據芯片手冊修改boot/init.S文件中的:片選組基地址寄存器、DRAM存儲配置寄存器、DRAM片選寄存器、中斷屏蔽寄存器等。然后修改內核的鏈接及裝入ELF。最后將系統中可用頁面的數目、文件系統大小等信息以參數形式從啟動代碼傳給內核,完成設置陷阱,初始化中斷,初始化計時器,初始化控制臺等一系列操作而使內核正常啟動。 2.2.3 內核裁剪和編譯 Linux內核的裁剪支持三種配置方式,即make confg、make menuconfig、make xconfg,一般采用菜單式用命令make menuconfig對系統進行裁剪樣較為簡單(具體見ARM9配置手冊)。內核裁剪之后,最后要進行交叉編譯后在arch/arm目錄下生成內核映象文件zImage,分別使用命令如下:make clean(清理編譯環境);make dep(編譯依賴文件);make zImage(編譯內核)進行內核編譯。 3 嵌入式Linux NFS開發環境的建立 NFS(Network File System)即:網絡文件系統,它是一種將遠程主機上的目錄通過網絡連接到本地主機的一種機制。通過對網絡文件系統的支持,用戶可以很方便地在本地主機上操作遠程主機上的共享目錄。因此,可以通過建立網絡文件系統,把Linux服務器上的特定目錄共享到嵌入式開發板系統上,這樣就可以直接在嵌入式開發板上操作Linux服務器,特別是能夠實時在線地對程序進行編輯、調試、運行,極大地提高了嵌入式Linux下的應用程序的開發的效率。 嵌入式Linux 開發平臺下的NFS環境配置,主要是對嵌入式Linux服務器端的NFS配置和嵌入式開發板系統的NFS客戶端配置,使其支持NFS。 3.1 Linux服務器端的NFS配置 以root賬戶登錄Linux服務器,編輯共享目錄配置文件exports,設定共享目錄及權限,執行# vi/etc/exports命令,在exports文件中添加 /home/work 192.168.33.*(rw)后保存,其作用是是將/home/work設為共享目錄,IP地址在192.168.33.*范圍內的計算機可以用讀寫的方式訪問共享目錄/home/work;接著執著命令 #/etc /rc.d /init.d /protmap start來進行端口映射;最后執行命令 #/etc /rc.d /init.d /nfs start來啟動NFS服務,啟動NFS服務后,還需檢查Linux服務器的iptables、ipchains等選項及文件/etc/hosts.deny、/etc/hosts.allow來確保沒有屏蔽NFS使用的端口和允許通信的主機。配置完畢后,可以在Linux服務器上運行如下命令: # mount –t nfs 192.168.33.1:/home/work /mnt 進行NFS服務器的回環測試,驗證共享目錄是否能夠被訪問,若配置成功,執行 # is/mnt命令后,能夠在/mnt目錄中看到/home/work共享目錄中的內容。 3.2 嵌入式開發板系統NFS客戶端的配置 首先運行在嵌入式開發板系統的Linux內核支持NFS客戶端,運行#make menuconfig命令后,選擇菜單中Fils System--->選項,按車回鍵后選擇下級菜單中的Network File System--- >選項,按車回鍵后選中級菜單中的NFS system support和Provide NFSv3 client support兩項,保存退出;然后分別運行# make clean、# make dep、# make zImage命令來重新編譯內核,最后在arch/arm/boot中生成一個內核映像文件zImage;然后在Redboot下運行命令Redboot >load –v –r –b 0x312000,將Linux內核文件zImage下載到嵌入式開發板系統的SDRAM并燒寫到FLASH中,其中0x312000為開發板系統SDRAM的地址,文件下載完畢后出現如下提示信息:Raw file loaded 0x00312000-0x003fae5f,再運行命令Redboot >fis create –b 0x312000 -1 0xc37df zImage將其保存在FLASH文件系統中;最后分別執行命令fis load ramdisk.gz、 load zImageis、exec –r ox1000000 0x312000后,開發板系統中的配置好嵌入式Linux NFS開始運行。在嵌入式開發板系統的Linux Shell下,運行# mkdir /mnt/nfs命令來建立Linux服務器輸出共享目錄的掛載點,運行# mount –o nolock –t nfs 92.168.33.1: /home/work /mnt/nfs命令使Linux服務器的輸出目錄:/home/work通過NFS映射到了嵌入開發板系統的/mnt/nfs。 4 嵌入式Linux NFS方式下應用程序的實現 完成了對Linux服務器端的NFS配置和嵌入式開發板系統NFS客戶端的配置后,使雙方均能支持NFS才能在此方式下進行應用程序的開發。 4.1 NFS方式的應用程序開發流程 首先在Linux服務器上編輯源文件,然后交叉編譯,最后生成可執行文件,生成的執行文件在嵌入式開發板端通過NFS方式掛載Linux服務器的共享目錄,讓應用程序直接運行在嵌入式開發板系統中,進行編譯、調試。其具體開發流程如圖2所示。 當完成了應用程序的調試與運行后,就可以將調試好的應用程序下載到嵌入式開發板系統的FLASH文件系統,或直接編譯到嵌入式Linux內核并燒寫到系統的FLASH,從而最終形成一個獨立的嵌入式應用系統。 4.2 NFS方式下的一個應用程序實例 下面是一個求n!的階乘的簡單示例,來說明基于嵌入式Linux的應用程序的實現方法。 第一步:編輯應用程序: 在Linux服務器的工作目錄:即輸出共享目錄/home/work下使用Vi文本編輯器來編輯應用程序,應用程序取名為jiecheng.c。輸入命令 # vi jieccheng.c,完成源程序代碼編輯后,保存文件并退出Vi。 源程序代碼如下: 第二步:編譯應用程序: 輸入命令 # arm-linux-gcc –o jiecheng jieccheng.c來編譯應用程序,當命令執行完畢后,會在/home/work目錄下生成可執行文件jiecheng。 第三步:在嵌入式開發板端掛載Linux服務器的輸出共享目錄: 啟動在嵌入式開發板端系統的配置好的Linux,使用PC超級終端作為用戶操作界面,輸入如下命令樣 # mkdir /mnt/fns //建立Linux服務器的輸出共享目錄掛載點 # mount –o nolock –t fns 1992.169.3.1:/home/work/ /mnt/nfs //Linux服務器的輸出目錄:/home/work通過NFS映射到了嵌入開發板系統的/mnt/nfs。 # cd /mnt/nfs //進入目錄 # ls //顯示目內容 # ./jiecheng //運行求階乘程序 程序運行后,用戶可以在使用PC超級終端上輸入一個整數后可以看到輸出結果。 5 結束語 由于采用NFS方式避免了將可執行文件從Linux服務器頻繁下載到嵌入式開發板端的過程,因此用這種方式開發應用程序可以大大提高應用程序的開發效率。本文的創新點是:在自已構造的基于ARM9內核芯片,處理器為S3C2410為基礎的開發板系統上,實現了NFS方式下的應用程序開發。 |