基于LPC2210的嵌入式Linux開發(fā)平臺構(gòu)建
摘要:本文描述了ARM7 與uCLinux 操作系統(tǒng)的特點,詳細(xì)討論了基于ARM7 與uCLinux開發(fā)的平臺構(gòu)建過程。利用構(gòu)建好的開發(fā)平臺,通過示例來說明了基于NFS 方式的嵌入式Linux 的應(yīng)用程序開發(fā)流程,該開發(fā)平臺將進(jìn)一步應(yīng)用于放射性氣體氣溶膠連續(xù)監(jiān)測系統(tǒng)的數(shù)據(jù)采集。
0 引言
隨著網(wǎng)絡(luò)、通信、多媒體和信息家電時代的到來,嵌入式系統(tǒng)在經(jīng)歷了近 20 年的發(fā)展歷程之后,進(jìn)入了一個全新的發(fā)展階段。Linux 操作系統(tǒng)以其穩(wěn)定性好、可靠性高、源代碼公開、可裁剪等優(yōu)點已成為嵌入式領(lǐng)域的一股新興力量,具有巨大的市場潛力和商業(yè)價值。而ARM 處理器是目前應(yīng)用的最為廣泛的嵌入式處理器架構(gòu)。因此,將Linux 操作系統(tǒng)移植到ARM 處理器平臺上并應(yīng)用于實際的產(chǎn)品是最為流行的嵌入式產(chǎn)品解決方案。
放射性氣體氣溶膠監(jiān)測系統(tǒng)的數(shù)據(jù)采集與處理一般是以 8 位單片機(jī)作為控制核心,直接導(dǎo)致硬件電路復(fù)雜、設(shè)計和調(diào)試難度加大、集成度低、穩(wěn)定性差、系統(tǒng)升級難度較大等缺點。因此,本文采用LPC2210+uCLinux 的開發(fā)模式來設(shè)計整個監(jiān)測系統(tǒng)的數(shù)據(jù)采集與處理模塊,能夠很好的提升整個系統(tǒng)的穩(wěn)定性和可操作性。其中LPC2210 是基于32 位ARM7TDMI 內(nèi)核的處理器,uCLinux 操作系統(tǒng)是開放源代碼的嵌入式Linux 的典范之作,主要針對沒有MMU(存儲器管理單元)的處理器,具有良好的可移植性和優(yōu)秀的網(wǎng)絡(luò)功能。
1 硬件平臺介紹
硬件平臺采用 LPC2210 為系統(tǒng)硬件核心開發(fā)板,系統(tǒng)框圖如圖1 所示。主要包括:存儲系統(tǒng)、系統(tǒng)接口、用戶接口3 個部分。LPC2000 系列ARM7 處理器I/O 口供電電源為3.3V,內(nèi)核及片內(nèi)外設(shè)供電電源為1.8V,所以,系統(tǒng)設(shè)計為3.3V 應(yīng)用系統(tǒng)。該系列的處理器可以使用外部時鐘源,內(nèi)部PLL 電路可調(diào)整系統(tǒng)時鐘,使系統(tǒng)運(yùn)行速度更快(CPU 最大操作時鐘為60MHz)。
該硬件平臺擴(kuò)展了2MB NOR Flash 和8MB PSRAM。為了方便程序調(diào)試以及最終代碼的固化應(yīng)用,使用LPC2210 外部存儲器接口的Bank0 和Bank1 地址空間。在使用uCLinux操作系統(tǒng)時,NOR Flash 用來存放bootloader 程序,以便于加載并引導(dǎo)放在NAND Flash 中的uCLinux 內(nèi)核。
LPC2210 具有外部總線接口,設(shè)計電路為16 位總線方式對網(wǎng)卡芯片RTL8019AS 進(jìn)行訪問,即數(shù)據(jù)總線D0~D15 與網(wǎng)卡芯片的SD0~SD15 連接,由于RTL8019AS 工作電壓是5V,而LPC2210 的I/O 電壓是3.3V,故需在總線上串接470 歐的保護(hù)電阻。網(wǎng)卡芯片的Vih 最小值為2.0V,故與LPC2210 連接時不需要加電平轉(zhuǎn)換芯片。
圖 1 系統(tǒng)結(jié)構(gòu)框圖
2 嵌入式Linux 開發(fā)平臺的構(gòu)建
本研究采用在宿主機(jī)上編寫程序,然后通過交叉編譯生成目標(biāo)平臺上可以運(yùn)行的可執(zhí)行文件,最后下載到目標(biāo)板的特定位置運(yùn)行的方法構(gòu)建平臺,即通常稱為的“宿主機(jī)+目標(biāo)板”的開發(fā)模式,如圖2 所示。目標(biāo)板分別通過RS-232 串口和RJ-45 以太網(wǎng)接口與宿主機(jī)連接。
宿主機(jī)上需要運(yùn)行 2 個窗口,即宿主機(jī)本機(jī)操作窗口和串口終端窗口。宿主機(jī)操作窗口可以是本機(jī)的操作終端,也可以是通過遠(yuǎn)程登錄登錄到Linux 服務(wù)器的操作界面。串口終端窗口可以是Linux 下的minicom,也可以是windows 下的超級終端。目標(biāo)板可以看成一臺計算機(jī),串口終端就相當(dāng)于這臺計算機(jī)的顯示器,作為人機(jī)交互界面。在宿主機(jī)編譯、鏈接后得到的可執(zhí)行文件下載到目標(biāo)板上運(yùn)行。
圖2 嵌入式Linux 交叉開發(fā)環(huán)境[!--empirenews.page--]
2.1 uCLinux 操作系統(tǒng)的移植
在開始移植操作系統(tǒng)之前,先準(zhǔn)備好移植所需要的軟件包,主要包括:交叉編譯所需的編譯工具包、uCLinux 源碼包、完整的bootloader 程序及根文件系統(tǒng)。上述二種工具包都有眾多版本,本文分別選擇的是uCLinux-dist-20040408.tar.gz、arm-elf-tools-20040427.sh。整個移植工作分為三步:建立交叉編譯環(huán)境;編譯配置內(nèi)核;bootloader 及根文件系統(tǒng)的移植。
2.1.1 建立交叉編譯環(huán)境
將工具包 arm-elf-tools-20040427.sh 拷貝到目錄/usr/src 下,為其增加可執(zhí)行權(quán)限(#chmod755 arm-elf-tools-20040427.sh);然后安裝arm-elf-gcc(# ./ arm-elf-tools-20040427.sh),安裝完畢后查看/usr/local/bin 目錄下是否存在arm-elf-gcc 等文件,如存在,表明交叉編譯器安裝成功;最后是添加交叉編譯的路徑,這一步在安裝過程會自動執(zhí)行和保存,并在下次啟動之后仍然有效(#export PATH=$PATH:/usr/local/arm-elf/bin)。至此,交叉編譯環(huán)境已經(jīng)建立完畢。
2.1.2 交叉編譯uCLinux 內(nèi)核
在交叉編譯內(nèi)核之前,首先要對編譯選項進(jìn)行配置。為了配置過程的直觀性,一般選擇“make menuconfig”命令,進(jìn)入uCLinux v3.1.0 Configuration 界面,主要是設(shè)置嵌入式處理器的型號以及操作系統(tǒng)的版本,然后選擇Default all settings 后進(jìn)行編譯即可。交叉編譯工作一次由以下命令完成:
#cd /usr/src/uCLinux-dist // uCLinux-dist 為uCLinux 源代碼所在目錄
#make distclean // 清除上一次編譯所產(chǎn)生的輔助文件和目標(biāo)文件
#make menuconfig // 通過文本菜單方式配置uCLinux
#make dep // 建立源代碼文件的依賴關(guān)系
#make //編譯內(nèi)核
編譯結(jié)束之后會在 uCLinux 安裝目錄下建立romfs 和images 兩個目錄。其中romfs 為romfs 文件系統(tǒng)的臨時存放目錄;images 為生成的目標(biāo)代碼目錄,其中romfs.img 為romfs文件系統(tǒng)的映像文件,image.bin 為文件系統(tǒng)和內(nèi)核代碼的目標(biāo)文件。
2.1.3 bootloader 及根文件系統(tǒng)的移植
通過 RS-232 串口將完整的bootloader 程序下載到目標(biāo)板的NOR Flash 中。主要工作是在WinXP 下設(shè)置超級終端,波特率38400、8 位數(shù)據(jù)位、1 位停止位、無奇偶校驗位、無流控制。通過運(yùn)行下載程序,可以將bootloader 下載到NOR Flash 中。
建立 uCLinux 超級終端,設(shè)置波特率為115200、8 位數(shù)據(jù)位、1 位停止位、無奇偶校驗位、無流控制。命名為uCLinux。然后啟動開發(fā)板,在超級終端中也即嵌入式開發(fā)板的“顯示器”中,可以看到bootloader 的啟動界面,通過FlashFXP 軟件可以將目錄bin、boot、etc下的文件下載到開發(fā)板。
2.1.4 uCLinux 的啟動
通過 bootloader 轉(zhuǎn)載和引導(dǎo)剛剛生成的內(nèi)核和文件系統(tǒng)。bootloader 引導(dǎo)內(nèi)核的方式是:將內(nèi)核影像文件和根文件系統(tǒng)下載至PSRAM 中直接啟動,而不是從NAND Flash 中讀入PSRAM,這種方法不需要燒寫Flash。如圖3 是uCLinux 操作系統(tǒng)啟動后的界面。
圖3 uCLinux 操作系統(tǒng)的啟動界面
2.2 NFS 輔助開發(fā)環(huán)境的建立
網(wǎng)絡(luò)文件系統(tǒng)(NFS,Network File System)是一種將遠(yuǎn)程主機(jī)上的分區(qū)(目錄)經(jīng)網(wǎng)絡(luò)掛載到本地系統(tǒng)的一種機(jī)制,通過對網(wǎng)絡(luò)文件系統(tǒng)的支持,用戶可以在本地系統(tǒng)上像操作本地分區(qū)一樣來對遠(yuǎn)程主機(jī)的共享分區(qū)(目錄)進(jìn)行操作。因此,通過建立NFS,把Linux 宿主機(jī)上的特定分區(qū)共享到待調(diào)試的目標(biāo)板上,就可以直接在目標(biāo)板上操作Linux 宿主機(jī)的特定分區(qū),同時可以在線對程序進(jìn)行調(diào)試和修改,大大方便了軟件的開發(fā)。故NFS 是嵌入式Linux 開發(fā)的一個重要組成部分,下面詳細(xì)說明如何建立NFS 輔助開發(fā)環(huán)境。
2.2.1 宿主機(jī)端NFS 服務(wù)器的配置
以 root 身份登錄Linux 服務(wù)器,編輯/etc 目錄下的共享目錄配置文件exports,指定共享目錄及權(quán)限等。
執(zhí)行如下命令編輯文件 /etc/exports:
#vi /etc/exports
在該文件中添加如下內(nèi)容:
/home/work 192.168.0.* (rw, sync, no_root_squash)
然后保存退出。
添加的內(nèi)容表示允許 IP 地址范圍在192.168.0.*的計算機(jī)以讀寫的權(quán)限來訪問/home/work 目錄。
其中,/home/work 也稱為服務(wù)器輸出共享目錄;rw 讀寫權(quán)限;sync 數(shù)據(jù)同步寫入內(nèi)存和硬盤;no_root_squash 為NFS 服務(wù)器共享目錄用戶的屬性,如果用戶是root,那么對于這個共享目錄來說就具有root 權(quán)限。
接著執(zhí)行如下命令,以啟動端口映射:
#/etc/rc.d/init.d/portmap start
最后執(zhí)行如下命令啟動 NFS 服務(wù),此時NFS 就會激活守護(hù)進(jìn)程,然后開始*client 端的請求:
#/etc/rc.d/init.d/nfs start
在 NFS 服務(wù)器啟動后,還需檢查Linux 服務(wù)器的防火墻等設(shè)置(一般需要關(guān)閉防火墻服務(wù)),確保沒有屏蔽掉NFS 使用的端口和允許通信的主機(jī),主要是檢查Linux 服務(wù)器iptables,ipchains 等選項的設(shè)置,以及/etc/hosts.deny,/etc/hosts.allow 等文件。
到此,宿主機(jī)端 NFS 服務(wù)器配置完成。
最后在宿主機(jī)上進(jìn)行 NFS 服務(wù)器的回環(huán)測試,驗證共享目錄是否能夠被訪問。在宿主機(jī)上運(yùn)行如下命令:
# mount –t nfs –o nolock 192.168.0.10:/home/work /mnt
# ls /mnt
命令將宿主機(jī)的 NFS 輸出共享目錄掛載到/mnt 目錄下,因此如果NFS 配置正確的話,應(yīng)該可以在/mnt 目錄下看到/home/work 共享目錄的內(nèi)容。
2.2.2 目標(biāo)板端NFS 客戶端的配置
在宿主機(jī)端的設(shè)置成功之后,還需要對客戶端進(jìn)行相關(guān)的設(shè)置。在目標(biāo)板系統(tǒng)的命令行下,執(zhí)行如下命令來進(jìn)行NFS 共享目錄的掛載:
/> mkdir /mnt/nfs //建立宿主機(jī)輸出共享目錄的掛載點
/> mount –t nfs –o nolock 192.168.0.10:/home/work /mnt/nfs
/> cd /mnt/nfs
/> ls
此時,目標(biāo)板終端所顯示的內(nèi)容即為宿主機(jī)的輸出目錄的內(nèi)容,即宿主機(jī)的輸出目錄/home/work 通過NFS 映射到了嵌入式目標(biāo)板的/mnt/nfs 目錄。由于Linux 默認(rèn)下不啟動NFS,每次宿主機(jī)進(jìn)入Linux 之后都要重新完成NFS 的啟動和掛載,比較麻煩??梢詫⒁陨系拿顚懭胨拗鳈C(jī)的腳本文件/etc/rc.d/rc.local 中,宿主機(jī)啟動時會執(zhí)行此文件。[!--empirenews.page--]
3 嵌入式Linux 應(yīng)用程序的開發(fā)
完成上述工作之后,嵌入式Linux 開發(fā)平臺搭建成功。在這個平臺上即可以進(jìn)行相關(guān)應(yīng)用程序的開發(fā)。本文采用NFS 方式進(jìn)行應(yīng)用程序的開發(fā)。
基于 NFS 方式的應(yīng)用程序開發(fā),首先在宿主機(jī)上通過vi 編輯器進(jìn)行源代碼的編輯,然后通過交叉編譯,最后生成可執(zhí)行文件,在嵌入式目標(biāo)板端通過NFS 方式掛載宿主機(jī)的共享分區(qū),讓應(yīng)用程序直接運(yùn)行在嵌入式目標(biāo)系統(tǒng),并進(jìn)行調(diào)試。基于 NFS 方式的開發(fā)流程如圖4 所示。
圖 4 基于NFS 方式的開發(fā)流程圖
當(dāng)開發(fā)人員完成了應(yīng)用程序的調(diào)試之后,可以將調(diào)試好的應(yīng)用程序下載到目標(biāo)系統(tǒng)的Flash 中或者直接編譯到嵌入式Linux 內(nèi)核中,從而最終形成一個獨立的嵌入式應(yīng)用系統(tǒng)。下面介紹一個示例來說明基于嵌入式 Linux的應(yīng)用程序開發(fā)流程。該示例使用MiniGUI的靜態(tài)框、按鈕和編輯框空間,實現(xiàn)一個Login 系統(tǒng)登錄的對話框。對話框中要求輸入用戶名和密碼,如果輸入正確的用戶名和密碼(例如用戶名為51,密碼為888888)則進(jìn)入系統(tǒng)(顯示一個主窗口),否則彈出錯誤對話框,并要求用戶再次輸入用戶名和密碼。實現(xiàn)本示例之前,必須確保已經(jīng)搭建好MiniGUI 編譯和開發(fā)板上的運(yùn)行環(huán)境。
實驗步驟如下:
第一步:編輯源程序
在宿主機(jī)的工作目錄/home/work 下使用vi 編輯器編輯源程序,源程序名為login.c。
部分程序源代碼如下:
// 定義對話框
static DLGTEMPLATE MyDlg =
{ WS_BORDER | WS_CAPTION,
WS_EX_NONE,
2, 50, 235, 190,
"登錄",
0,
0,
6,
NULL,
0
};
// 定義對話框中的控件
static CTRLDATA CtrlInitData[] =
{
{ "static",
WS_VISIBLE | SS_SIMPLE,
25,10, 200, 16,
IDC_SLOGIN,
"請輸入用戶名和密碼.",
0,
WS_EX_NONE
},
{ "static",
WS_VISIBLE | SS_SIMPLE,
10,40, 60, 16,
IDC_SUSER,
"用戶名:",
0,
WS_EX_NONE
},
{ "static",
WS_VISIBLE | SS_SIMPLE,
10,80, 60, 16,
IDC_SPASS,
"密碼:",
0,
WS_EX_NONE
},
{ "edit",
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
70,40, 140,25,
IDC_EUSER,
"",
0,
WS_EX_NONE
},
{ "edit",
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_PASSWORD | WS_TABSTOP,[!--empirenews.page--]
70,80, 140,25,
IDC_EPASS,
"",
0,
WS_EX_NONE
},
{ "button",
WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,
80,120, 80,25,
IDOK,
"確定",
0,
WS_EX_NONE
}
};
//設(shè)置用戶名和密碼
#define USER_NO 3
static char *g_user[USER_NO] = {"root",
"51",
"WXM"
};
static char *g_pass[USER_NO] = {"******",
"888888",
"2046"
};
第二步:修改對應(yīng)的 Makefile.am 文件,設(shè)置編譯login.c 文件
在命令行下輸入 # make
當(dāng)命令執(zhí)行完畢之后,會在當(dāng)前目錄下生成名為login 的可執(zhí)行文件。
第三步:在目標(biāo)板掛載共享目錄,并運(yùn)行程序。
/> cd usr
/>usr> portmap&
[26]
/usr> mount –t nfs 192.168.0.10:/home/work /usr/pro –o nolock //掛載共享目錄
/>cd /usr/pro
/usr/pro ./login //運(yùn)行程序,顯示登入對話框
第四步:使用目標(biāo)板上的功能鍵 0~9 輸入用戶名和密碼,使用TAB 鍵轉(zhuǎn)移到下一個焦點,使用BACK 鍵刪除已輸入的字符,使用ENTER 確定輸入。當(dāng)用戶名和密碼輸入正確時,登錄成功,登入界面被關(guān)閉,并顯示一個MiniGUI 主窗口。如圖5 示:
圖5 “登入”對話框和歡迎界面
4 結(jié)束語
作為實時放射性氣體氣溶膠監(jiān)測系統(tǒng)的數(shù)據(jù)采集系統(tǒng)開發(fā)的重要組成部分,本文通過分析ARM7 和uCLinux 特點,將二者有機(jī)結(jié)合,構(gòu)建了ARM7+uCLinux 的嵌入式通用開發(fā)平臺,并展示了應(yīng)用該開發(fā)平臺開發(fā)應(yīng)用程序的詳細(xì)過程。該平臺的應(yīng)用克服了大多數(shù)實時監(jiān)測系統(tǒng)因采用8 位單片機(jī)為控制核心實現(xiàn)數(shù)據(jù)采集而帶來的硬件電路復(fù)雜、穩(wěn)定性差、升級困難等問題。故本文作者創(chuàng)新點:通過采用ARM7+uCLinux 的嵌入式通用開發(fā)平臺克服了大多數(shù)實時監(jiān)測系統(tǒng)硬件電路復(fù)雜、穩(wěn)定性差、升級困難等缺點;同時采用該開發(fā)平臺在開發(fā)過程中使用NFS 方式下載開發(fā)的應(yīng)用程序,為嵌入式應(yīng)用軟件的開發(fā)節(jié)省了大量的時間,大大提高了開發(fā)效率。