劉睿洋
(山東科技大學(xué) 山東省泰安市 271000)
嵌入式系統(tǒng)的構(gòu)成上主要包括兩個(gè)部分,即計(jì)算機(jī)的硬件部分和軟件部分。ARM系列屬于計(jì)算機(jī)硬件;Linux系統(tǒng)屬于計(jì)算機(jī)軟件類。嵌入式系統(tǒng)所以計(jì)算機(jī)技術(shù)成果,是建立在滿足用戶個(gè)性化需求的基礎(chǔ)上的。在硬件和軟件方面,具有加減特性,無論是部件的增加或者減少,都會(huì)保證系統(tǒng)的正常運(yùn)行,而且系統(tǒng)的性能可靠。系統(tǒng)在運(yùn)行中具有良好的靈活度,功耗比較低,而且成本得到有效控制,且具有長(zhǎng)時(shí)間的待機(jī)時(shí)間。嵌入式系統(tǒng)中,ARM作為架構(gòu)硬件平臺(tái)存在。系統(tǒng)的各項(xiàng)操作80%以上都可以在這個(gè)平臺(tái)上完成[1]。Linux系統(tǒng)所發(fā)揮的作用也是如此。ARM將位數(shù)不斷擴(kuò)展,功能也會(huì)不斷增強(qiáng),使得智能化的軟件系統(tǒng)的建構(gòu)更為方便。嵌入式系統(tǒng)的CPU與普通的計(jì)算機(jī)系統(tǒng)不同,ARM的編址上,內(nèi)存與I/O設(shè)備是同時(shí)進(jìn)行的,指令系統(tǒng)得到優(yōu)化,指令的靈活度比較高,也提高了系統(tǒng)的運(yùn)行效率。ARM將存儲(chǔ)器使用寄存器代替,系統(tǒng)的運(yùn)行速度得到提升。在編址的時(shí)候,將大端格式與小端格式結(jié)合,靈活的組織形式使得操作更加方便。ARM和Linux都是嵌入式系統(tǒng)具有代表性的產(chǎn)品,要在ARM平臺(tái)下實(shí)現(xiàn)Linux嵌入式系統(tǒng)移植,就要針對(duì)相關(guān)的問題深入研究。
Linux系統(tǒng)作為一個(gè)操作系統(tǒng),其是公開源代碼的操作系統(tǒng)軟件,開放的源代碼,只要登上Linux官方網(wǎng)站,每個(gè)版本都可以下載后安裝使用。這項(xiàng)功能與嵌入式系統(tǒng)的要求相符合,也就是說代碼的使用的過程中是可以靈活定制的,以滿足個(gè)性化需求,當(dāng)然,在普通的計(jì)算機(jī)上可以運(yùn)行,在任何的智能終端設(shè)備上也可以運(yùn)行。根據(jù)有關(guān)統(tǒng)計(jì)數(shù)據(jù)顯示,當(dāng)前Linux軟件已經(jīng)在超過一半的智能設(shè)計(jì)軟件上應(yīng)用,內(nèi)核使用模塊化的配置,在使用中可以靈活組合。Linux軟件有一個(gè)非常重要的特點(diǎn)就是編譯非常容易。即便是非常簡(jiǎn)單的代碼也可以使用GCC編譯,代碼模塊化,使用make就可以統(tǒng)一編譯。編譯代碼完成后,在下一次編譯的時(shí)候,對(duì)修改之后的代碼進(jìn)行編譯即可,編譯時(shí)間縮短了,工作效率提高了。這種編譯方法更加靈活,代碼開發(fā)效率也有所提高[2]。
從Linux操作系統(tǒng)的構(gòu)成上來看,引導(dǎo)程序、根文件系統(tǒng)和內(nèi)核程序是重要的內(nèi)容。Linux系統(tǒng)所具備的優(yōu)勢(shì)是其是可以移植的。在普通的計(jì)算機(jī)上將Linux系統(tǒng)安裝好,安裝的方法有兩種選擇,一種是單獨(dú)安裝,一種是虛擬機(jī)安裝,之后進(jìn)行交叉編譯,程序再編譯好之后,可以通過串行口下載,也可以通過模擬串行口下載到主機(jī)上,運(yùn)行之前要做好調(diào)試工作。在Linux操作系統(tǒng)的應(yīng)用中,修改I/O設(shè)備加方便,能夠靈活調(diào)試軟件和硬件。
構(gòu)建交叉開放環(huán)境,需要將交叉工具鏈構(gòu)建起來,主要采用如下的三種方法。
第一種方法,分步編譯并將庫和源代碼都安裝好,滿足交叉編譯工具鏈的需求,交叉編譯工具鏈形成。使用這種方法有很大的難度,具備專業(yè)能力的人可以嘗試使用這種方法,如果是普通用戶,究和構(gòu)建跨工具鏈的讀者。如果只想使用交叉刀具鏈,可以考慮使用如下的兩種方法[3]。
第二種方法,使用Crosstool-ng腳本工具進(jìn)行一次編譯,交叉編譯工具鏈就能夠形成。這種方法比第一種方法要簡(jiǎn)單得多,而且誤差很小,建議使用。
第三種方法,下載直接通過Internet生成的交叉編譯工具鏈。這種方法的優(yōu)點(diǎn)是毋庸置疑的,當(dāng)然,它既簡(jiǎn)單又容易,但同時(shí)也有一些缺點(diǎn),即在應(yīng)用的過程中有一定的局限性,畢竟它是由別人建造的,也就是說,它是固定不變的,沒有很強(qiáng)的靈活性[4]。因此,用于生成的庫和編譯器版本與正在編譯的程序很有可能存在不適應(yīng)性。在使用過程中會(huì)有一些錯(cuò)誤是無法解釋的,所以使用這種方法的時(shí)候也要謹(jǐn)慎。cross tool-ng是一種腳本工具,交叉編譯工具鏈的使用中能夠適合各種平臺(tái)。制作之前,需要安裝軟件才可以,諸如bison、crosstool、g++、patch、libncurses5-dev、libtool、flex texinfo automake等等。其中,crosstool腳本工具的使用中,可以將軟件下載到本地,解壓處理后就可以按照提示安裝了。這種配置與內(nèi)核的配置有相似制定出,將源碼包路徑設(shè)置好,將安裝交叉編譯器的路徑設(shè)置好,根據(jù)需要對(duì)交叉編譯器進(jìn)行修改[5]。增加編譯的時(shí)候,并行進(jìn)程數(shù)增加,運(yùn)行效率就會(huì)有所增加,編譯的速度加快。將JAVA編譯器編譯,編譯的時(shí)間就會(huì)有所減少。
u-boot編譯好之后下載到計(jì)算機(jī)內(nèi)存中就可以運(yùn)行的。具體的操作過程是,將開發(fā)板網(wǎng)配置好之后,配置IP地址到內(nèi)存,形成環(huán)境變量,為$setenv ipaddr 191.164.0.5,之后在nandflash的參數(shù)區(qū)保存。
在測(cè)試網(wǎng)絡(luò)的過程中,設(shè)置好虛擬機(jī)的IP地址,191.164.0.7。
在網(wǎng)絡(luò)測(cè)試中,如果存在沒有連接好的問題,就要對(duì)網(wǎng)絡(luò)進(jìn)行檢查并及時(shí)處理。網(wǎng)絡(luò)正常運(yùn)行之后,要檢查開發(fā)板和虛擬機(jī)的IP地址,要求兩者都處于同一個(gè)網(wǎng)段上。使用橋接的方式使得虛擬機(jī)網(wǎng)絡(luò)運(yùn)行正常。在開發(fā)板的連接過程中,對(duì)虛擬機(jī)進(jìn)行靜態(tài)IP地址設(shè)置[6]。
啟動(dòng)開發(fā)板的時(shí)候,可以切換到nandflash。具體的方法是,將開發(fā)板關(guān)閉,將SW1的開關(guān)4向4的那邊波動(dòng)。此時(shí),開發(fā)板啟動(dòng)的時(shí)候,就可以通過nandflash啟動(dòng)。
kernel的配置中,第一次進(jìn)去時(shí)候,不需要有任何的操作,推出的過程中可以看到配置信息是否保存的問題,此時(shí)已經(jīng)要進(jìn)行保存操作,這樣就可以在.config中將開發(fā)平臺(tái)的各項(xiàng)信息保存好,避免丟失[7]。
需要注意的是,make menuconfig的過程中,系統(tǒng)處于哪種運(yùn)行狀態(tài)?當(dāng)有界面圖形化呈現(xiàn)的時(shí)候,要知道為什么會(huì)這樣?圖形化的界面中有一些內(nèi)容,要明確這些內(nèi)容是從哪里來的?
當(dāng)然,圖形界面的形成不是偶然,是通過圖形庫實(shí)現(xiàn)的。在首次進(jìn)行menuconfig制作的時(shí)候,系統(tǒng)中不會(huì)顯示圖形界面,而是報(bào)告了錯(cuò)誤操作,并提示我們?nèi)鄙賜curses devel。這個(gè)時(shí)候就需要進(jìn)行l(wèi)ibncurses 5-dev安裝。受到圖形庫的支持,Sudo apt get install libncurses運(yùn)行,就會(huì)有圖形界面呈現(xiàn)出來。
當(dāng)內(nèi)核進(jìn)行make menuconfig配置的時(shí)候,系統(tǒng)會(huì)自動(dòng)將菜單配置讀出來,這是kconfig在發(fā)揮作用,之后在kconfig保存。在內(nèi)核的編譯過程中,.config會(huì)被makefile調(diào)用,使得配置信息能夠完整地保存下來,避免出現(xiàn)配置信息丟失的問題,此時(shí)需要正確選擇源代碼,還要將編譯源代碼作為重要的參考依據(jù)。這樣的操作之后,對(duì)于內(nèi)核的用戶配置就可以明確了[8]。Kconfig是對(duì)應(yīng)于內(nèi)核的配置菜單。針對(duì)內(nèi)核的源代碼,如果需要將新的驅(qū)動(dòng)程序添加到其中,就要對(duì)kconfig進(jìn)行修改,將配置菜單添加到驅(qū)動(dòng)程序中,就可以對(duì)驅(qū)動(dòng)程序進(jìn)行選擇了。驅(qū)動(dòng)程序的編譯過程中,對(duì)驅(qū)動(dòng)程序中的makefile要做出修改,以滿足程序運(yùn)行的需求。
內(nèi)存地址為setenv bootcmd tftp 20008000;zImage;go 20008000。虛擬機(jī)的地址為setenv bootargs nfs nfsroot=191.166.1.189;開發(fā)板的地址為/source/rootfs ip=191.166.1.199。在啟動(dòng)用戶程序的時(shí)候,首先啟動(dòng)的是init=/linuxrc,串口設(shè)置為ttySAC0,115200,波特率是115200。
將環(huán)境變量保存,對(duì)開發(fā)板復(fù)位操作。將nfs掛載的文件系統(tǒng)設(shè)置好之后測(cè)試能否啟動(dòng),這樣就可以看到效果了[9]。在進(jìn)行.內(nèi)核測(cè)試以及啟動(dòng)的時(shí)候,整個(gè)的過程都有一定的復(fù)雜性,所以在操作之前需要做好各項(xiàng)準(zhǔn)備工作,保證測(cè)試工作正常進(jìn)行,才能獲得準(zhǔn)確的測(cè)試值。
Linux系統(tǒng)的引導(dǎo)程序運(yùn)行的過程中,與普通的計(jì)算機(jī)差不多,即熟悉的BIOS,最接近硬件的軟件程序。Linux系統(tǒng)所發(fā)揮的作用是在嵌入式系統(tǒng)中發(fā)揮橋梁作用,軟件和硬件連接起來。在移植的過程中,將傳輸指令放置在物理地址00000000h的位置,跳轉(zhuǎn)到系統(tǒng)程序的入口,進(jìn)行硬件初始化運(yùn)行,這些硬件包括ARM硬件、I/O設(shè)備、緩存、存儲(chǔ)器、并行端口、串行以及LCD驅(qū)動(dòng)程序。在移植的過程中,最為重要的是bootloader編程,所要實(shí)現(xiàn)的目的是保證bootloader和硬件初始化的安全性和可靠性,對(duì)硬件進(jìn)行分析,提高移植效率。
Linux內(nèi)核在arm平臺(tái)下的移植是運(yùn)用通信的方式將開發(fā)的程序下載到產(chǎn)品中,這其中所涉及到的內(nèi)容很多,諸如arch、kenel、lib、boot、Mach等等,還包括一些文件目錄,均屬于Linux文件系統(tǒng)。在移植操作的過程中:首先是地址的配置工作,其中所涵蓋的內(nèi)容包括計(jì)算機(jī)的IP地址配置、主機(jī)的IP地址配置和虛擬機(jī)的IP地址;其次是對(duì)文件進(jìn)行配置,所涵蓋的內(nèi)容包括xshell通信文件、模擬終端接口以及menuconfig文件等等;再次是make file文件的生成,之后要做好編譯調(diào)試工作。Linux系統(tǒng)的根文件中涵蓋有多項(xiàng)內(nèi)容,主要包括JFFS2、ext2、cmpfs等等。在配置文件系統(tǒng)的時(shí)候,要考慮到系統(tǒng)運(yùn)行的需要選擇相應(yīng)的文件。比如,選擇CRAFS是為了滿足系統(tǒng)的內(nèi)存需要[10]。
通過對(duì)上面內(nèi)容的研究可以明確,在嵌入式系統(tǒng)的ARM硬件和Linux軟件進(jìn)行研究的過程中,對(duì)于其優(yōu)勢(shì)予以分析,提出Linux操作系統(tǒng)具有移植功能。在ARM平臺(tái)下移植,需要將交叉開放的環(huán)境搭建起來,重視bootloader的選擇和移植工作,對(duì)kernel合理配置,并進(jìn)行編譯,保證移植順利進(jìn)行。