新聞中心
求嵌入式linux開(kāi)發(fā)詳細(xì)流程(步驟)?
1.首先,建立交叉編譯環(huán)境:交叉編譯是指:在PC機(jī)上編譯,在目標(biāo)板上執(zhí)行,我PC是linux+ arm-elf-gcc編譯器.扳子是ARM3000.板子上的系統(tǒng)是uclinux,這時(shí)一個(gè)剪裁的很小的實(shí)時(shí)嵌入式linux操作系統(tǒng).推薦使用這個(gè).

成都服務(wù)器托管,創(chuàng)新互聯(lián)建站提供包括服務(wù)器租用、四川服務(wù)器托管、帶寬租用、云主機(jī)、機(jī)柜租用、主機(jī)租用托管、CDN網(wǎng)站加速、域名申請(qǐng)等業(yè)務(wù)的一體化完整服務(wù)。電話(huà)咨詢(xún):18982081108
2.然后就是你寫(xiě)程序嘍,不過(guò)注意可能有些庫(kù)函數(shù)不能用,因?yàn)槟膫€(gè)編譯器稍微受限一點(diǎn),不是所由的c庫(kù)函數(shù)都支持,不過(guò)一般開(kāi)發(fā)的都有.
3.連起你的主機(jī)和開(kāi)發(fā)板,這個(gè)你會(huì)不?要連兩個(gè):串口(用來(lái)控制板子)和以太口(用來(lái)下載程序),我們板子上這些外設(shè)都有,你要使沒(méi)有可以用其他的口代替?zhèn)鞒绦?但串口可是該有的阿!
4.在你主機(jī)上編譯程序生成目標(biāo)代碼,建議用makefile文件來(lái)組織你的聯(lián)編關(guān)系.
5.把生成代碼下載到目標(biāo)板執(zhí)行調(diào)試.我是用的主機(jī)的NFS(網(wǎng)落文件)服務(wù),下載到目標(biāo)板的.
6.注:目標(biāo)板是怎么控制的呢?是用串口控制的,可用minicom,設(shè)置好你要控制的串口,也應(yīng)該是你連板子的那個(gè).在命令行里敲上minicom,即進(jìn)入minicom截面,開(kāi)啟你的板子,應(yīng)該就是板子uclinux系統(tǒng)解壓安裝的畫(huà)面了.然后用ifconfig eth0.....
配置ip,這個(gè)ip就是你板子的ip了,注意與主機(jī)一個(gè)網(wǎng)段.然后mount -t nfs 主機(jī)ip:/uclinux /板子上的一個(gè)目錄,就把主機(jī)的 uclinux目錄放到板子上了(這么說(shuō)其實(shí)不合理,應(yīng)該叫掛載). 然后找到你剛才一經(jīng)編譯好的哪個(gè)目標(biāo)代碼執(zhí)行即可.
因不了解你的具體環(huán)境和配置,暫說(shuō)這些,有問(wèn)題可再聯(lián)系:)
linux arm嵌入式開(kāi)發(fā)中的 MSR指令什么意思?
在ARM處理器中,只有MSR指令可以對(duì)狀態(tài)寄存器CPSR和SPSR進(jìn)行寫(xiě)操作。與MRS配合使用,可以實(shí)現(xiàn)對(duì)CPSR或SPSR寄存器的讀-修改-寫(xiě)操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。
由于xPSR寄存器代表了CPU的狀態(tài),其每個(gè)位有特殊意義,在執(zhí)行對(duì)xPSR狀態(tài)寄存器寫(xiě)入時(shí)(讀取時(shí)不存在該用法),為了防止誤操作和方便記憶,將xPSR里32位分成四個(gè)區(qū)域,每個(gè)區(qū)域用小寫(xiě)字母表示:
c 控制域屏蔽 psr[7..0]
x 擴(kuò)展域屏蔽 psr[15..8]
s 狀態(tài)域屏蔽 psr[23..16]
f 標(biāo)志域屏蔽 psr[31..24]
注意:區(qū)域名必須為小寫(xiě)字母
向?qū)?yīng)區(qū)域進(jìn)行執(zhí)行寫(xiě)入時(shí),使用xPSR_x可以指定寫(xiě)入?yún)^(qū)域,而不影響狀態(tài)寄存器其它位,如:
使能IRQ中斷:
ENABLE_IRQ
MRS R0, CPSR ; 將CPSR寄存器內(nèi)容讀出到R0
BIC R0, R0,#0x80 ; 清掉CPSR中的I控制位
MSR CPSR_c,R0 ; 將修改后的值寫(xiě)回 CPSR寄存器的對(duì)應(yīng)控制域
MOV PC,LR ; 返回上一層函數(shù)
禁用IRQ中斷:
DISABLE_IRQ
MRS R0 CPSR ; 將CPSR寄存器內(nèi)容讀出到R0
ORR R0, R0,#0x80 ; 設(shè)置CPSR中的I控制位
MSR CPSR_c,R0 ; 將修改后的值寫(xiě)回 CPSR寄存器的對(duì)應(yīng)控制域
MOV PC,LR ; 返回上一層函數(shù)
嵌入式開(kāi)發(fā)板上的linux系統(tǒng),為什么有些命令不能使用?
嵌入式開(kāi)發(fā)板上的linux 系統(tǒng)一般是和PC機(jī)上的不一樣的,他一般是經(jīng)過(guò)剪裁的,至于你說(shuō)的各種命令,也是經(jīng)過(guò)裁剪的,在編譯linux內(nèi)核或者文件系統(tǒng)的時(shí)候,會(huì)有一個(gè)工具,必須用到,這是busy_box,就是傳說(shuō)中的嵌入式軍刀,他是可以裁剪系統(tǒng)上的命令的,你可以通過(guò)它來(lái)選擇需要什么命令,具體情況可以百度一下busy_box。
「干貨」嵌入式Linux系統(tǒng)移植的四大步驟(上)
在學(xué)習(xí)系統(tǒng)移植的相關(guān)知識(shí),在學(xué)習(xí)和調(diào)試過(guò)程中,發(fā)現(xiàn)了很多問(wèn)題,也解決了很多問(wèn)題,但總是對(duì)于我們的開(kāi)發(fā)結(jié)果有一種莫名其妙的感覺(jué),糾其原因,主要對(duì)于我們的開(kāi)發(fā)環(huán)境沒(méi)有一個(gè)深刻的認(rèn)識(shí),有時(shí)候幾個(gè)簡(jiǎn)單的命令就可以完成非常復(fù)雜的功能,可是我們有沒(méi)有想過(guò),為什么會(huì)有這樣的效果?
如果沒(méi)有去追問(wèn),只是機(jī)械地完成,并且看到實(shí)驗(yàn)效果,這樣做其實(shí)并沒(méi)有真正的掌握系統(tǒng)移植的本質(zhì)。
在做每一個(gè)步驟的時(shí)候, 首先問(wèn)問(wèn)自己,為什么要這樣做,然后再問(wèn)問(wèn)自己正在做什么? 搞明白這幾個(gè)問(wèn)題,我覺(jué)得就差不多了,以后不管更換什么平臺(tái),什么芯片,什么開(kāi)發(fā)環(huán)境,你都不會(huì)迷糊,很快就會(huì)上手。對(duì)于嵌入式的學(xué)習(xí)方法,我個(gè)人方法就是:從宏觀(guān)上把握(解決為什么的問(wèn)題),微觀(guān)上研究(解決正在做什么的問(wèn)題),下面以自己學(xué)習(xí)的arm-cortex_a8開(kāi)發(fā)板為目標(biāo),介紹下自己的學(xué)習(xí)方法和經(jīng)驗(yàn)。
嵌入式Linux系統(tǒng)移植主要由四大部分組成:
一、搭建交叉開(kāi)發(fā)環(huán)境
二、bootloader的選擇和移植
三、kernel的配置、編譯、和移植
四、根文件系統(tǒng)的制作
第一部分:搭建交叉開(kāi)發(fā)環(huán)境
先介紹第一分部的內(nèi)容:搭建交叉開(kāi)發(fā)環(huán)境,首先必須得思考兩個(gè)問(wèn)題,什么是交叉環(huán)境? 為什么需要搭建交叉環(huán)境?
先回答第一個(gè)問(wèn)題,在嵌入式開(kāi)發(fā)中,交叉開(kāi)發(fā)是很重要的一個(gè)概念,開(kāi)發(fā)的第一個(gè)環(huán)節(jié)就是搭建環(huán)境,第一步不能完成,后面的步驟從無(wú)談起,這里所說(shuō)的交叉開(kāi)發(fā)環(huán)境主要指的是:在開(kāi)發(fā)主機(jī)上(通常是我的pc機(jī))開(kāi)發(fā)出能夠在目標(biāo)機(jī)(通常是我們的開(kāi)發(fā)板)上運(yùn)行的程序。嵌入式比較特殊的是不能在目標(biāo)機(jī)上開(kāi)發(fā)程序(狹義上來(lái)說(shuō)),因?yàn)閷?duì)于一個(gè)原始的開(kāi)發(fā)板,在沒(méi)有任何程序的情況下它根本都跑不起來(lái),為了讓它能夠跑起來(lái),我們還必須要借助pc機(jī)進(jìn)行燒錄程序等相關(guān)工作,開(kāi)發(fā)板才能跑起來(lái),這里的pc機(jī)就是我們說(shuō)的開(kāi)發(fā)主機(jī),想想如果沒(méi)有開(kāi)發(fā)主機(jī),我們的目標(biāo)機(jī)基本上就是無(wú)法開(kāi)發(fā),這也就是電子行業(yè)的一句名言:搞電子,說(shuō)白了,就是玩電腦!
然后回答第二個(gè)問(wèn)題,為什么需要交叉開(kāi)發(fā)環(huán)境?主要原因有以下幾點(diǎn):
原因 1: 嵌入式系統(tǒng)的硬件資源有很多限制,比如cpu主頻相對(duì)較低,內(nèi)存容量較小等,想想讓幾百M(fèi)HZ主頻的MCU去編譯一個(gè)Linux kernel會(huì)讓我們等的不耐煩,相對(duì)來(lái)說(shuō),pc機(jī)的速度更快,硬件資源更加豐富,因此利用pc機(jī)進(jìn)行開(kāi)發(fā)會(huì)提高開(kāi)發(fā)效率。
原因2: 嵌入式系統(tǒng)MCU體系結(jié)構(gòu)和指令集不同,因此需要安裝交叉編譯工具進(jìn)行編譯,這樣編譯的目標(biāo)程序才能夠在相應(yīng)的平臺(tái)上比如:ARM、MIPS、 POWEPC上正常運(yùn)行。
交叉開(kāi)發(fā)環(huán)境的硬件組成主要由以下幾大部分 :
1.開(kāi)發(fā)主機(jī)
2.目標(biāo)機(jī)(開(kāi)發(fā)板)
3.二者的鏈接介質(zhì),常用的主要有3種方式:(1)串口線(xiàn) (2)USB線(xiàn) (3)網(wǎng)線(xiàn)
對(duì)應(yīng)的硬件介質(zhì),還必須要有相應(yīng)的軟件“介質(zhì)”支持:
1.對(duì)于串口,通常用的有串口調(diào)試助手,putty工具等,工具很多,功能都差不多,會(huì)用一兩款就可以;
2.對(duì)于USB線(xiàn),當(dāng)然必須要有USB的驅(qū)動(dòng)才可以,一般芯片公司會(huì)提供,比如對(duì)于三星的芯片,USB下載主要由DNW軟件來(lái)完成;
3.對(duì)于網(wǎng)線(xiàn),則必須要有網(wǎng)絡(luò)協(xié)議支持才可以, 常用的服務(wù)主要兩個(gè)
第一:tftp服務(wù):
主要用于實(shí)現(xiàn)文件的下載,比如開(kāi)發(fā)調(diào)試的過(guò)程中,主要用tftp把要測(cè)試的bootloader、kernel和文件系統(tǒng)直接下載到內(nèi)存中運(yùn)行,而不需要預(yù)先燒錄到Flash芯片中,一方面,在測(cè)試的過(guò)程中,往往需要頻繁的下載,如果每次把這些要測(cè)試的文件都燒錄到Flash中然后再運(yùn)行也可以,但是缺點(diǎn)是:過(guò)程比較麻煩,而且Flash的擦寫(xiě)次數(shù)是有限的;另外一方面:測(cè)試的目的就是把這些目標(biāo)文件加載到內(nèi)存中直接運(yùn)行就可以了,而tftp就剛好能夠?qū)崿F(xiàn)這樣的功能,因此,更沒(méi)有必要把這些文件都燒錄到Flash中去。
第二: nfs服務(wù):
主要用于實(shí)現(xiàn)網(wǎng)絡(luò)文件的掛載,實(shí)際上是實(shí)現(xiàn)網(wǎng)絡(luò)文件的共享,在開(kāi)發(fā)的過(guò)程中,通常在系統(tǒng)移植的最后一步會(huì)制作文件系統(tǒng),那么這是可以把制作好的文件系統(tǒng)放置在我們開(kāi)發(fā)主機(jī)PC的相應(yīng)位置,開(kāi)發(fā)板通過(guò)nfs服務(wù)進(jìn)行掛載,從而測(cè)試我們制作的文件系統(tǒng)是否正確,在整個(gè)過(guò)程中并不需要把文件系統(tǒng)燒錄到Flash中去,而且掛載是自動(dòng)進(jìn)行掛載的,bootload啟動(dòng)后,kernel運(yùn)行起來(lái)后會(huì)根據(jù)我們?cè)O(shè)置的啟動(dòng)參數(shù)進(jìn)行自動(dòng)掛載,因此,對(duì)于開(kāi)發(fā)測(cè)試來(lái)講,這種方式非常的方便,能夠提高開(kāi)發(fā)效率。
另外,還有一個(gè)名字叫 samba 的服務(wù)也比較重要,主要用于文件的共享,這里說(shuō)的共享和nfs的文件共享不是同一個(gè)概念,nfs的共享是實(shí)現(xiàn)網(wǎng)絡(luò)文件的共享,而samba實(shí)現(xiàn)的是開(kāi)發(fā)主機(jī)上 Windows主機(jī)和Linux虛擬機(jī)之間的文件共享,是一種跨平臺(tái)的文件共享 ,方便的實(shí)現(xiàn)文件的傳輸。
以上這幾種開(kāi)發(fā)的工具在嵌入式開(kāi)發(fā)中是必備的工具,對(duì)于嵌入式開(kāi)發(fā)的效率提高做出了偉大的貢獻(xiàn),因此,要對(duì)這幾個(gè)工具熟練使用,這樣你的開(kāi)發(fā)效率會(huì)提高很多。等測(cè)試完成以后,就會(huì)把相應(yīng)的目標(biāo)文件燒錄到Flash中去,也就是等發(fā)布產(chǎn)品的時(shí)候才做的事情,因此對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),所有的工作永遠(yuǎn)是測(cè)試。
通過(guò)前面的工作,我們已經(jīng)準(zhǔn)備好了交叉開(kāi)發(fā)環(huán)境的硬件部分和一部分軟件,最后還缺少交叉編譯器,讀者可能會(huì)有疑問(wèn),為什么要用交叉編譯器?前面已經(jīng)講過(guò),交叉開(kāi)發(fā)環(huán)境必然會(huì)用到交叉編譯工具,通俗地講就是在一種平臺(tái)上編譯出能運(yùn)行在體系結(jié)構(gòu)不同的另一種平臺(tái)上的程序,開(kāi)發(fā)主機(jī)PC平臺(tái)(X86 CPU)上編譯出能運(yùn)行在以ARM為內(nèi)核的CPU平臺(tái)上的程序,編譯得到的程序在X86 CPU平臺(tái)上是不能運(yùn)行的,必須放到ARM CPU平臺(tái)上才能運(yùn)行,雖然兩個(gè)平臺(tái)用的都是Linux系統(tǒng)。相對(duì)于交叉編譯,平常做的編譯叫本地編譯,也就是在當(dāng)前平臺(tái)編譯,編譯得到的程序也是在本地執(zhí)行。用來(lái)編譯這種跨平臺(tái)程序的編譯器就叫交叉編譯器,相對(duì)來(lái)說(shuō),用來(lái)做本地編譯的工具就叫本地編譯器。所以要生成在目標(biāo)機(jī)上運(yùn)行的程序,必須要用交叉編譯工具鏈來(lái)完成。
這里又有一個(gè)問(wèn)題,不就是一個(gè)交叉編譯工具嗎?為什么又叫交叉工具鏈呢?原因很簡(jiǎn)單,程序不能光編譯一下就可以運(yùn)行,還得進(jìn)行匯編和鏈接等過(guò)程,同時(shí)還需要進(jìn)行調(diào)試,對(duì)于一個(gè)很大工程,還需要進(jìn)行工程管理等等,所以,這里 說(shuō)的交叉編譯工具是一個(gè)由 編譯器、連接器和解釋器 組成的綜合開(kāi)發(fā)環(huán)境,交叉編譯工具鏈主要由binutils(主要包括匯編程序as和鏈接程序ld)、gcc(為GNU系統(tǒng)提供C編譯器)和glibc(一些基本的C函數(shù)和其他函數(shù)的定義) 3個(gè)部分組成。有時(shí)為了減小libc庫(kù)的大小,也可以用別的 c 庫(kù)來(lái)代替 glibc,例如 uClibc、dietlibc 和 newlib。
那么,如何得到一個(gè)交叉工具鏈呢?是從網(wǎng)上下載一個(gè)“程序”然后安裝就可以使用了嗎?回答這個(gè)問(wèn)題之前先思考這樣一個(gè)問(wèn)題,我們的交叉工具鏈顧名思義就是在PC機(jī)上編譯出能夠在我們目標(biāo)開(kāi)發(fā)平臺(tái)比如ARM上運(yùn)行的程序,這里就又有一個(gè)問(wèn)題了,我們的ARM處理器型號(hào)非常多,難道有專(zhuān)門(mén)針對(duì)我們某一款的交叉工具鏈嗎?若果有的話(huà),可以想一想,這么多處理器平臺(tái),每個(gè)平臺(tái)專(zhuān)門(mén)定制一個(gè)交叉工具鏈放在網(wǎng)絡(luò)上,然后供大家去下載,想想可能需要找很久才能找到適合你的編譯器,顯然這種做法不太合理,且浪費(fèi)資源!因此,要得到一個(gè)交叉工具鏈,就像我們移植一個(gè)Linux內(nèi)核一樣,我們只關(guān)心我們需要的東西,編譯我們需要的東西在我們的平臺(tái)上運(yùn)行,不需要的東西我們不選擇不編譯,所以,交叉工具鏈的制作方法和系統(tǒng)移植有著很多相似的地方,也就是說(shuō),交叉開(kāi)發(fā)工具是一個(gè)支持很多平臺(tái)的工具集的集合(類(lèi)似于Linux源碼),然后我們只需從這些工具集中找出跟我們平臺(tái)相關(guān)的工具就行了,那么如何才能找到跟我們的平臺(tái)相關(guān)的工具,這就是涉及到一個(gè)如何制作交叉工具鏈的問(wèn)題了。
通常構(gòu)建交叉工具鏈有如下三種方法:
方法一 : 分步編譯和安裝交叉編譯工具鏈所需要的庫(kù)和源代碼,最終生成交叉編譯工具鏈。該方法相對(duì)比較困難,適合想深入學(xué)習(xí)構(gòu)建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用下列的方法二構(gòu)建交叉工具鏈。
方法二: 通過(guò)Crosstool-ng腳本工具來(lái)實(shí)現(xiàn)一次編譯,生成交叉編譯工具鏈,該方法相對(duì)于方法一要簡(jiǎn)單許多,并且出錯(cuò)的機(jī)會(huì)也非常少,建議大多數(shù)情況下使用該方法構(gòu)建交叉編譯工具鏈。
方法三 : 直接通過(guò)網(wǎng)上下載已經(jīng)制作好的交叉編譯工具鏈。該方法的優(yōu)點(diǎn)不用多說(shuō),當(dāng)然是簡(jiǎn)單省事,但與此同時(shí)該方法有一定的弊端就是局限性太大,因?yàn)楫吘故莿e人構(gòu)建好的,也就是固定的,沒(méi)有靈活性,所以構(gòu)建所用的庫(kù)以及編譯器的版本也許并不適合你要編譯的程序,同時(shí)也許會(huì)在使用時(shí)出現(xiàn)許多莫名其妙的錯(cuò)誤,建議讀者慎用此方法。
crosstool-ng是一個(gè)腳本工具,可以制作出適合不同平臺(tái)的交叉編譯工具鏈,在進(jìn)行制作之前要安裝一下軟件:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool腳本工具可以在下載到本地,然后解壓,接下來(lái)就是進(jìn)行安裝配置了,這個(gè)配置優(yōu)點(diǎn)類(lèi)似內(nèi)核的配置。主要的過(guò)程有以下幾點(diǎn):
1. 設(shè)定源碼包路徑和交叉編譯器的安裝路徑
2. 修改交叉編譯器針對(duì)的構(gòu)架
3. 增加編譯時(shí)的并行進(jìn)程數(shù),以增加運(yùn)行效率,加快編譯,因?yàn)檫@個(gè)編譯會(huì)比較慢。
4. 關(guān)閉JAVA編譯器 ,減少編譯時(shí)間
5. 編譯
6. 添加環(huán)境變量
7. 刷新環(huán)境變量。
8. 測(cè)試交叉工具鏈
到此,嵌入式Linux系統(tǒng)移植四大部分的第一部分工作全部完成,接下來(lái)可以進(jìn)行后續(xù)的開(kāi)發(fā)了。
第二部分:bootloader的選擇和移植
01 Boot Loader 概念
就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過(guò)這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境,他就是所謂的引導(dǎo)加載程序(Boot Loader)。
02 為什么系統(tǒng)移植之前要先移植BootLoader?
BootLoader的任務(wù)是引導(dǎo)操作系統(tǒng),所謂引導(dǎo)操作系統(tǒng),就是啟動(dòng)內(nèi)核,讓內(nèi)核運(yùn)行就是把內(nèi)核加載到內(nèi)存RAM中去運(yùn)行,那先問(wèn)兩個(gè)問(wèn)題:第一個(gè)問(wèn)題,是誰(shuí)把內(nèi)核搬到內(nèi)存中去運(yùn)行?第二個(gè)問(wèn)題:我們說(shuō)的內(nèi)存是SDRAM,大家都知道,這種內(nèi)存和SRAM不同,最大的不同就是SRAM只要系統(tǒng)上電就可以運(yùn)行,而SDRAM需要軟件進(jìn)行初始化才能運(yùn)行,那么在把內(nèi)核搬運(yùn)到內(nèi)存運(yùn)行之前必須要先初始化內(nèi)存吧,那么內(nèi)存是由誰(shuí)來(lái)初始化的呢?其實(shí)這兩件事情都是由bootloader來(lái)干的,目的是為內(nèi)核的運(yùn)行準(zhǔn)備好軟硬件環(huán)境,沒(méi)有bootloadr我們的系統(tǒng)當(dāng)然不能跑起來(lái)。
03 bootloader的分類(lèi)
首先更正一個(gè)錯(cuò)誤的說(shuō)法,很多人說(shuō)bootloader就是U-boot,這種說(shuō)法是錯(cuò)誤的,確切來(lái)說(shuō)是u-boot是bootloader的一種。也就是說(shuō)bootloader具有很多種類(lèi),
由上圖可以看出,不同的bootloader具有不同的使用范圍,其中最令人矚目的就是有一個(gè)叫U-Boot的bootloader,是一個(gè)通用的引導(dǎo)程序,而且同時(shí)支持X86、ARM和PowerPC等多種處理器架構(gòu)。U-Boot,全稱(chēng) Universal Boot Loader,是遵循GPL條款的開(kāi)放源碼項(xiàng)目,是由德國(guó)DENX小組開(kāi)發(fā)的用于多種嵌入式CPU的bootloader程序,對(duì)于Linux的開(kāi)發(fā),德國(guó)的u-boot做出了巨大的貢獻(xiàn),而且是開(kāi)源的。
u-boot具有以下特點(diǎn):
① 開(kāi)放源碼;
② 支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多個(gè)處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 較高的可靠性和穩(wěn)定性;
⑤ 高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;
⑥ 豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤(pán)等;
⑦ 較為豐富的開(kāi)發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)技術(shù)支持;
其實(shí),把u-boot可以理解為是一個(gè)小型的操作系統(tǒng)。
04 u-boot的目錄結(jié)構(gòu)
* board 目標(biāo)板相關(guān)文件,主要包含SDRAM、FLASH驅(qū)動(dòng);
* common 獨(dú)立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測(cè)與故障檢測(cè);
* cpu 與處理器相關(guān)的文件。如mpc8xx子目錄下含串口、網(wǎng)口、LCD驅(qū)動(dòng)及中斷初始化等文件;
* driver 通用設(shè)備驅(qū)動(dòng),如CFI FLASH驅(qū)動(dòng)(目前對(duì)INTEL FLASH支持較好)
* doc U-Boot的說(shuō)明文檔;
* examples可在U-Boot下運(yùn)行的示例程序;如hello_world.c,timer.c;
* include U-Boot頭文件;尤其configs子目錄下與目標(biāo)板相關(guān)的配置頭文件是移植過(guò)程中經(jīng)常要修改的文件;
* lib_xxx 處理器體系相關(guān)的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結(jié)構(gòu)相關(guān)的文件;
* net 與網(wǎng)絡(luò)功能相關(guān)的文件目錄,如bootp,nfs,tftp;
* post 上電自檢文件目錄。尚有待于進(jìn)一步完善;
* rtc RTC驅(qū)動(dòng)程序;
* tools 用于創(chuàng)建U-Boot S-RECORD和BIN鏡像文件的工具;
05 u-boot的工作模式
U-Boot的工作模式有 啟動(dòng)加載模式和下載模式 。啟動(dòng)加載模式是Bootloader的正常工作模式,嵌入式產(chǎn)品發(fā)布時(shí),Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統(tǒng)從FLASH中加載到SDRAM中運(yùn)行,整個(gè)過(guò)程是自動(dòng)的。 下載模式 就是Bootloader通過(guò)某些通信手段將內(nèi)核映像或根文件系統(tǒng)映像等從PC機(jī)中下載到目標(biāo)板的SDRAM中運(yùn)行,用戶(hù)可以利用Bootloader提供的一些令接口來(lái)完成自己想要的操作,這種模式主要用于測(cè)試和開(kāi)發(fā)。
06 u-boot的啟動(dòng)過(guò)程
大多數(shù)BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴(lài)于cpu體系結(jié)構(gòu)的代碼(如設(shè)備初始化代碼等)通常都放在stage1且可以用匯編語(yǔ)言來(lái)實(shí)現(xiàn),而stage2則通常用C語(yǔ)言來(lái)實(shí)現(xiàn),這樣可以實(shí)現(xiàn)復(fù)雜的功能,而且有更好的可讀性和移植性。
1、 stage1(start.s代碼結(jié)構(gòu))
U-boot的stage1代碼通常放在start.s文件中,它用匯編語(yǔ)言寫(xiě)成,其主要代碼部分如下:
(1) 定義入口。由于一個(gè)可執(zhí)行的image必須有一個(gè)入口點(diǎn),并且只能有一個(gè)全局入口,通常這個(gè)入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個(gè)入口,該工作可通過(guò)修改連接器腳本來(lái)完成。
(2)設(shè)置異常向量(exception vector)。
(3)設(shè)置CPU的速度、時(shí)鐘頻率及中斷控制寄存器。
(4)初始化內(nèi)存控制器 。
(5)將rom中的程序復(fù)制到ram中。
(6)初始化堆棧 。
(7)轉(zhuǎn)到ram中執(zhí)行,該工作可使用指令ldrpc來(lái)完成。
2、 stage2(C語(yǔ)言代碼部分)
lib_arm/board.c中的start armboot是C語(yǔ)言開(kāi)始的函數(shù),也是整個(gè)啟動(dòng)代碼中C語(yǔ)言的主函數(shù),同時(shí)還是整個(gè)u-boot(armboot)的主函數(shù),該函數(shù)主要完成如下操作:
(1)調(diào)用一系列的初始化函數(shù)。
(2)初始化flash設(shè)備。
(3)初始化系統(tǒng)內(nèi)存分配函數(shù)。
(4)如果目標(biāo)系統(tǒng)擁有nand設(shè)備,則初始化nand設(shè)備。
(5)如果目標(biāo)系統(tǒng)有顯示設(shè)備,則初始化該類(lèi)設(shè)備。
(6)初始化相關(guān)網(wǎng)絡(luò)設(shè)備,填寫(xiě)ip,c地址等。
(7)進(jìn)入命令循環(huán)(即整個(gè)boot的工作循環(huán)),接受用戶(hù)從串口輸入的命令,然后進(jìn)行相應(yīng)的工作。
07 基于cortex-a8的s5pc100bootloader啟動(dòng)過(guò)程分析
s5pc100支持兩種啟動(dòng)方式,分別為USB啟動(dòng)方式和NandFlash啟動(dòng)方式:
1. S5PC100 USB啟動(dòng)過(guò)程
[1] A8 reset, 執(zhí)行iROM中的程序
[2] iROM中的程序根據(jù)S5PC100的配置管腳(SW1開(kāi)關(guān)4,撥到4對(duì)面),判斷從哪里啟動(dòng)(USB)
[3] iROM中的程序會(huì)初始化USB,然后等待PC機(jī)下載程序
[4] 利用DNW程序,從PC機(jī)下載SDRAM的初始化程序到iRAM中運(yùn)行,初始化SDRAM
[5] SDRAM初始化完畢,iROM中的程序繼續(xù)接管A8, 然后等待PC下載程序(BootLoader)
[6] PC利用DNW下載BootLoader到SDRAM
[7] 在SDRAM中運(yùn)行BootLoader
2. S5PC100 Nandflash啟動(dòng)過(guò)程
[1] A8 reset, 執(zhí)行IROM中的程序
[2] iROM中的程序根據(jù)S5PC100的配置管腳(SW1開(kāi)關(guān)4,撥到靠4那邊),判斷從哪里啟動(dòng)(Nandflash)
[3] iROM中的程序驅(qū)動(dòng)Nandflash
[4] iROM中的程序會(huì)拷貝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然后拷貝完整的BootLoader到SDRAM并運(yùn)行
[6] BootLoader拷貝內(nèi)核到SDRAM,并運(yùn)行它
[7] 內(nèi)核運(yùn)行起來(lái)后,掛載rootfs,并且運(yùn)行系統(tǒng)初始化腳本
08 u-boot移植(基于cortex_a8的s5pc100為例)
1.建立自己的平臺(tái)
(1).下載源碼包2010.03版本,比較穩(wěn)定
(2).解壓后添加我們自己的平臺(tái)信息,以smdkc100為參考版,移植自己s5pc100的開(kāi)發(fā)板
(3).修改相應(yīng)目錄的文件名,和相應(yīng)目錄的Makefile,指定交叉工具鏈。
(4).編譯
(5).針對(duì)我們的平臺(tái)進(jìn)行相應(yīng)的移植,主要包括修改SDRAM的運(yùn)行地址,從0x20000000
(6).“開(kāi)關(guān)”相應(yīng)的宏定義
(7).添加Nand和網(wǎng)卡的驅(qū)動(dòng)代碼
(8).優(yōu)化go命令
(9).重新編譯 make distclean(徹底刪除中間文件和配置文件) make s5pc100_config(配置我們的開(kāi)發(fā)板) make(編譯出我們的u-boot.bin鏡像文件)
(10).設(shè)置環(huán)境變量,即啟動(dòng)參數(shù),把編譯好的u-boot下載到內(nèi)存中運(yùn)行,過(guò)程如下:
1. 配置開(kāi)發(fā)板網(wǎng)絡(luò)
ip地址配置:
$setenv ipaddr 192.168.0.6 配置ip地址到內(nèi)存的環(huán)境變量
$saveenv 保存環(huán)境變量的值到nandflash的參數(shù)區(qū)
網(wǎng)絡(luò)測(cè)試:
在開(kāi)發(fā)開(kāi)發(fā)板上ping虛擬機(jī):
$ ping 192.168.0.157(虛擬機(jī)的ip地址)
如果網(wǎng)絡(luò)測(cè)試失敗,從下面幾個(gè)方面檢查網(wǎng)絡(luò):
1. 網(wǎng)線(xiàn)連接好
2. 開(kāi)發(fā)板和虛擬機(jī)的ip地址是否配置在同一個(gè)網(wǎng)段
3. 虛擬機(jī)網(wǎng)絡(luò)一定要采用橋接(VM--Setting--option)
4. 連接開(kāi)發(fā)板時(shí),虛擬機(jī)需要設(shè)置成 靜態(tài)ip地址
2. 在開(kāi)發(fā)板上,配置tftp服務(wù)器(虛擬機(jī))的ip地址
$setenv serverip 192.168.0.157(虛擬機(jī)的ip地址)
$saveenv
3. 拷貝u-boot.bin到/tftpboot(虛擬機(jī)上的目錄)
4. 通過(guò)tftp下載u-boot.bin到開(kāi)發(fā)板內(nèi)存
$ tftp 20008000(內(nèi)存地址即可) u-boot.bin(要下載的文件名)
如果上面的命令無(wú)法正常下載:
1. serverip配置是否正確
2. tftp服務(wù)啟動(dòng)失敗,重啟tftp服務(wù)
#sudo service tftpd-hpa restart
5. 燒寫(xiě)u-boot.bin到nandflash的0地址
$nand erase 0(起始地址) 40000(大小) 擦出nandflash 0 - 256k的區(qū)域
$nand write 20008000((緩存u-boot.bin的內(nèi)存地址) 0(nandflash上u-boot的位置) 40000(燒寫(xiě)大小)
6. 切換開(kāi)發(fā)板的啟動(dòng)方式到nandflash
1. 關(guān)閉開(kāi)發(fā)板
2. 把SW1的開(kāi)關(guān)4撥到4的那邊
3. 啟動(dòng)開(kāi)發(fā)板,它就從nandflash啟動(dòng)
在嵌入式Linux設(shè)備上如何安裝一些命令,例如yum等
所有的命令其實(shí)都是程序,除了 sh 內(nèi)建的有限的幾個(gè)命令。
所以你明白了沒(méi)?想要用 yum ,那就去給你這個(gè)嵌入式設(shè)備裝 yum 程序。
很多命令都要去針對(duì)的編譯安裝。嵌入式在開(kāi)發(fā)邏輯上,你需要什么命令,就去編譯什么命令的支持程序。而不是去找已經(jīng)做好的二進(jìn)制程序。那是 Linux 用戶(hù)而不是開(kāi)發(fā)者的想法。
不過(guò)我可以告訴你,嵌入式用 yum 根本不實(shí)際。因?yàn)榍度胧?Linux 系統(tǒng)是針對(duì)性很強(qiáng)的系統(tǒng),這種針對(duì)性對(duì)于嵌入式系統(tǒng)開(kāi)發(fā)者來(lái)說(shuō),控制軟件組成基本是確定的工作。桌面 Linux 的 yum 是由這個(gè)操作系統(tǒng)的制作者們進(jìn)行系統(tǒng)整體軟件組成及管理的一個(gè)程序,他主要的是提供一個(gè)在線(xiàn)軟件倉(cāng)庫(kù)的功能。因?yàn)?yum 本身是基于 rpm 再開(kāi)發(fā)的類(lèi) deb 在線(xiàn)倉(cāng)庫(kù)程序。rpm 本身沒(méi)有在線(xiàn)軟件庫(kù)的功能功能。只是一個(gè)簡(jiǎn)單的軟件包管理,依賴(lài)管理程序。
但你一個(gè)嵌入式系統(tǒng),卻非要去用 yum 。難道你想做一個(gè)基于 arm 的桌面操作系統(tǒng)?嵌入式很多情況下,連軟件包管理器都不需要。更何況這種在線(xiàn)軟件倉(cāng)庫(kù)?
就算你想弄軟件倉(cāng)庫(kù),那你的軟件頂多是應(yīng)用程序倉(cāng)庫(kù),類(lèi)似 android 的軟件商店就足夠了。根本不需要 yum 這種支持依賴(lài)管理等等各種的功能。而且一套 yum 和 rpm 的支持庫(kù),就可以吃掉你的嵌入式設(shè)備的大部分存儲(chǔ)空間。而且為了實(shí)現(xiàn) yum 的主要功能你還要去維護(hù)一個(gè) yum 軟件倉(cāng)庫(kù)服務(wù)器才行。
有那功夫自己寫(xiě)一個(gè)軟件管理器都來(lái)得及。本身嵌入式系統(tǒng)就不需要太多的軟件包管理功能。
分享標(biāo)題:嵌入式開(kāi)發(fā)linux命令,嵌入式linux應(yīng)用開(kāi)發(fā)
當(dāng)前地址:http://m.biofuelwatch.net/article/hojhos.html


咨詢(xún)
建站咨詢(xún)
