劉淑影,王光陽(yáng),魏梨君,楊 穎,張永華
(阜陽(yáng)師范大學(xué),安徽 阜陽(yáng)236037)
目前大部分高校的計(jì)算機(jī)及其相關(guān)專業(yè)都陸續(xù)開(kāi)設(shè)了嵌入式相關(guān)課程,而Linux以其開(kāi)源、免費(fèi)、多用戶等優(yōu)勢(shì)已成為高校合理利用資源的最佳選擇[1-3]。在VMware虛擬機(jī)上搭建嵌入式Linux開(kāi)發(fā)環(huán)境有以下優(yōu)勢(shì):一是方便用戶的使用。目前大部分用戶習(xí)慣在Window操作系統(tǒng)上進(jìn)行日常辦公,所以在Window基礎(chǔ)之上安裝VMware進(jìn)而進(jìn)行嵌入式開(kāi)發(fā),省去了重新裝機(jī)的麻煩。二是減少了對(duì)硬件的依賴。在虛擬機(jī)上安裝Linux能夠減少軟硬件之間的不兼容問(wèn)題。三是維護(hù)方便。虛擬機(jī)環(huán)境下Linux操作系統(tǒng)能夠更快捷地完成數(shù)據(jù)備份功能,從而達(dá)到統(tǒng)一管理、維護(hù)和降低維護(hù)成本的目的[4]。
本文給出一種基于Linux的嵌入式虛擬實(shí)驗(yàn)平臺(tái)的搭建方法,通過(guò)在VMware虛擬機(jī)上安裝Linux操作系統(tǒng)、搭建虛擬開(kāi)發(fā)平臺(tái),為高校的實(shí)驗(yàn)教學(xué)活動(dòng)增加了靈活性,對(duì)創(chuàng)新現(xiàn)代化實(shí)驗(yàn)教學(xué)起到推動(dòng)作用。
嵌入式虛擬開(kāi)發(fā)平臺(tái)可以減少嵌入式開(kāi)發(fā)成本,并且為嵌入式開(kāi)發(fā)人員降低了入門(mén)難度。下面從三個(gè)方面介紹嵌入式虛擬開(kāi)發(fā)平臺(tái)的搭建。
實(shí)驗(yàn)平臺(tái)采用VMware Workstation虛擬機(jī),其使用范圍較廣,很多網(wǎng)站都可以下載,本文使用的是10.0版本。搭建嵌入式虛擬開(kāi)發(fā)環(huán)境的第一步是安裝虛擬機(jī),然后在虛擬機(jī)上安裝Linux操作系統(tǒng)(具體鏡像文件可以從網(wǎng)上下載或通過(guò)Linux光盤(pán))。
使用VMware Workstation虛擬機(jī)軟件VMware Tools增強(qiáng)工具包,可以增強(qiáng)虛擬機(jī)中的虛擬顯卡和硬盤(pán)性能、同步虛擬機(jī)與主機(jī)文件的驅(qū)動(dòng)程序,因此要在搭建的開(kāi)發(fā)環(huán)境中安裝VMware Tools工具包。
在嵌入式開(kāi)發(fā)環(huán)境中安裝NFS,可以實(shí)現(xiàn)網(wǎng)絡(luò)中計(jì)算機(jī)通過(guò)Interent共享資源,同時(shí)也可以實(shí)現(xiàn)掛載系統(tǒng)的目的,這種方式對(duì)于系統(tǒng)的調(diào)試非常方便。NFS安裝簡(jiǎn)單,具體步驟如下。
Step1:在Linux系統(tǒng)中打開(kāi)命令終端,輸入命令nfs-sudo apt-get install nfs-kernel-server。
Step2:新建立一個(gè)NFS專用文件夾(sudo mkdir/mnt/nfs),其中/mnt/nfs是將要共享的文件目錄。打開(kāi)exports文件(vi/etc/exports),在其末尾添加指令-/mnt/nfs*(rw,sync,no_root_squash,no_sub?tree_check),然后保存并退出。
Step3:首先通過(guò)命令restart重新啟動(dòng)portmap服務(wù),再重新啟動(dòng)NFS服務(wù)。
Step4:將Ubuntu系統(tǒng)的"/mnt/nfs"目錄掛在到實(shí)驗(yàn)箱(嵌入式Linux系統(tǒng))的"/mnt"目錄下面,從而實(shí)現(xiàn)文件的共享。
建立交叉開(kāi)發(fā)環(huán)境是嵌入式應(yīng)用軟件開(kāi)發(fā)的第一步。在交叉開(kāi)發(fā)環(huán)境中,在一臺(tái)PC機(jī)(宿主機(jī))上對(duì)源程序進(jìn)行編輯、編譯、鏈接之后,生成應(yīng)用程序,然后將其下載到能夠運(yùn)行、調(diào)試該程序的目標(biāo)設(shè)備中。其中宿主機(jī)是裝有VM虛擬機(jī)的計(jì)算機(jī),而目標(biāo)機(jī)則一般指嵌入式設(shè)備。下面給出安裝交叉編譯器的步驟。
Step1:通過(guò)Linux系統(tǒng)終端,將交叉編譯器復(fù)制到本地Ubuntu的"/usr/local/arm"目錄下,如果本地沒(méi)有此文件夾,則新建一個(gè)。
Step2:修改交叉編譯工具中環(huán)境變量的路徑。首先打開(kāi)環(huán)境變量文件".bashrc"("cd/root"-"gedit.bashrc"),然后添加代碼-"export PATH=$PATH:/usr/local/arm/arm-2009q3/bin"到該文件、保存、退出,最后更新環(huán)境變量("source.bashrc")。
Step3:交叉編譯環(huán)境的測(cè)試。在Ubuntu終端輸入"arm",通過(guò)鍵盤(pán)上的TAB切換到root權(quán)限,如果命令行中出現(xiàn)arm編譯器信息,就表明交叉編譯環(huán)境安裝好了,測(cè)試成功,如圖1所示。

圖1 ARM編譯器
本文所采用的實(shí)驗(yàn)環(huán)境及開(kāi)發(fā)流程如圖2所示,在主機(jī)的Ubuntu操作系統(tǒng)下安裝交叉編譯器,對(duì)Linux內(nèi)核配置make menuconfi,編譯生成Linux的鏡像文件boot.img。最后通過(guò)文件夾共享和USB的方式將生成的鏡像文件下載到目標(biāo)板,通過(guò)Uboot引導(dǎo)執(zhí)行[5-6],圖2給出了嵌入式Linux環(huán)境下的開(kāi)發(fā)流程。

圖2 嵌入式Linux環(huán)境下的開(kāi)發(fā)流程
本實(shí)驗(yàn)選取ARM A8系統(tǒng)自帶8位LED流水燈,使用復(fù)用的IO接口和8位數(shù)據(jù)線,通過(guò)74AHC138 3-8線譯碼器產(chǎn)生不同模塊所需要的片選信號(hào),作為74LVCH273鎖存器CLK時(shí)鐘信號(hào),達(dá)到復(fù)用IO接口的目的。其電路如圖3所示。

圖3 流水燈工作原理
在圖3所示的電路圖中,將8個(gè)發(fā)光二極管LED的一端與鎖存器74LVCH273的8個(gè)輸出口進(jìn)行連接,另一端經(jīng)過(guò)一個(gè)限流電阻接地,當(dāng)鎖存器輸出高電平使LED兩端出現(xiàn)壓降產(chǎn)生電流會(huì)點(diǎn)亮LED燈。將鎖存器的控制引腳連接到ARM端的GPIOA23引腳,如果GPIOA23為低電平時(shí),鎖存器74LVCH273的8個(gè)輸出口處于無(wú)效狀態(tài),GPIOA23輸出高電平時(shí)鎖存器的8個(gè)輸出口會(huì)根據(jù)8個(gè)輸入口持續(xù)輸出對(duì)應(yīng)高低電平,8個(gè)輸入口連接ARM端的GPIOA0~A7端口。鎖存器的某個(gè)輸出端為高電平時(shí),此時(shí)LED有電流通過(guò)并發(fā)光。如果當(dāng)鎖存器的某個(gè)輸出端輸出低電平時(shí),LED就會(huì)熄滅。
由于驅(qū)動(dòng)程序沒(méi)有主函數(shù),因此進(jìn)行流水燈驅(qū)動(dòng)程序設(shè)計(jì)的第一步就是進(jìn)行流水燈的初始化,初始化過(guò)程中使用misc_register()函數(shù)注冊(cè)設(shè)備名和驅(qū)動(dòng)的接口。該接口通過(guò)cled_ioctl()函數(shù)傳遞cled_gpio_ctl()函數(shù)的返回值。其中cled_gpio_ctl()函數(shù)的具體操作步驟如下。
Step1:首選通過(guò)gpio_request()函數(shù)來(lái)顯示配置該通用輸出輸出GPIO端口的pinmux,再申請(qǐng)GPIO端口。
Step2:標(biāo)記該通用輸出輸出GPIO的使用方向(是輸入還是輸出)。
Step3:通過(guò)函數(shù)gpio_get_value()獲取GPIO引腳并使用函數(shù)gpio_set_value()設(shè)置GPIO引腳的值。
Step4:使用通用輸出端口的導(dǎo)出函數(shù)gpio_ex?port()將GPIO端口導(dǎo)出到用戶空間。
在嵌入式虛擬開(kāi)發(fā)平臺(tái)上將編好的GPIO流水燈驅(qū)動(dòng)程序進(jìn)行交叉編譯。首先編輯Kconfig、makefile文件,將cled.c加入到內(nèi)核編譯,設(shè)置環(huán)境變量“export ARCH=arm”,然后執(zhí)行make menucon?fig,選中繼電器驅(qū)動(dòng),流水燈的選擇如圖4所示。

圖4 流水燈的選擇
編譯內(nèi)核,重新將內(nèi)核燒寫(xiě)到實(shí)驗(yàn)箱上。設(shè)備啟動(dòng)后,在“/dev”目錄下可查看到設(shè)備節(jié)點(diǎn),如圖5所示。

圖5 查看設(shè)備節(jié)點(diǎn)
將編寫(xiě)好的繼電器驅(qū)動(dòng)程序在嵌入式虛擬開(kāi)發(fā)平臺(tái)上進(jìn)行交叉編譯,生成文件名為cled的目標(biāo)文件,將此目標(biāo)文件復(fù)制到/mnt/nfs目錄下。
打開(kāi)Putty終端,連接實(shí)驗(yàn)箱串口,將實(shí)驗(yàn)箱/mnt目錄掛載到Linux系統(tǒng)/mnt/nfs目錄下,運(yùn)行程序如圖6所示。

圖6 試驗(yàn)箱掛載到Linux上
運(yùn)行程序,觀察試驗(yàn)箱下面的跑馬燈開(kāi)始依次點(diǎn)亮,如圖7所示。

圖7 實(shí)驗(yàn)運(yùn)行結(jié)果
綜上所述,基于Linux的嵌入式虛擬實(shí)驗(yàn)平臺(tái)的搭建是切實(shí)可行的。本文主要介紹了虛擬實(shí)驗(yàn)平臺(tái)的搭建過(guò)程,然后通過(guò)嵌入式GPIO流水燈驅(qū)動(dòng)的開(kāi)發(fā)來(lái)證明該平臺(tái)的有效性。嵌入式系統(tǒng)應(yīng)用開(kāi)發(fā)更偏重實(shí)踐和應(yīng)用,學(xué)生需要多動(dòng)手、多寫(xiě)程序、多去實(shí)踐操作,親自搭建虛擬實(shí)驗(yàn)平臺(tái),調(diào)試程序代碼,以此來(lái)增加學(xué)生提動(dòng)手實(shí)踐和進(jìn)行嵌入式開(kāi)發(fā)的機(jī)會(huì)。通過(guò)2年多的實(shí)踐,證明采用基于Linux的嵌入式虛擬實(shí)驗(yàn)平臺(tái)進(jìn)行教學(xué)后學(xué)生的學(xué)習(xí)興趣和嵌入式開(kāi)發(fā)能力都有所提高[4]。
廊坊師范學(xué)院學(xué)報(bào)(自然科學(xué)版)2020年3期