日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
uclinux內(nèi)核移植:打造嵌入式系統(tǒng)的新選擇(uclinux內(nèi)核移植)

隨著物聯(lián)網(wǎng)的發(fā)展,嵌入式系統(tǒng)的需求不斷增加。嵌入式系統(tǒng)是指集成有限的計(jì)算資源,在現(xiàn)有的硬件平臺(tái)上運(yùn)行的操作系統(tǒng),這些系統(tǒng)具有響應(yīng)速度快、功耗低、可靠性高等特點(diǎn)。而在嵌入式系統(tǒng)中,操作系統(tǒng)內(nèi)核是不可或缺的一部分,它負(fù)責(zé)管理系統(tǒng)的資源,使硬件和應(yīng)用程序之間形成必要的抽象層,因此嵌入式系統(tǒng)的開發(fā)者需要考慮選擇適合自己的操作系統(tǒng)內(nèi)核。在很長一段時(shí)間內(nèi),嵌入式系統(tǒng)中使用較多的是Linux內(nèi)核,但隨著技術(shù)進(jìn)步,不同版本的Linux內(nèi)核越來越復(fù)雜,導(dǎo)致嵌入式系統(tǒng)的開發(fā)難度也不斷增加。而在這個(gè)背景下,uclinux內(nèi)核的出現(xiàn)給嵌入式系統(tǒng)的開發(fā)提供了新的選擇。

uclinux是一個(gè)精簡版Linux內(nèi)核,與標(biāo)準(zhǔn)的Linux內(nèi)核相比,uclinux內(nèi)核對于嵌入式系統(tǒng)的資源要求更低,占用更少的內(nèi)存和存儲(chǔ)空間,針對嵌入式系統(tǒng)設(shè)計(jì)了易于移植的接口。在uclinux內(nèi)核的基礎(chǔ)上,嵌入式系統(tǒng)的開發(fā)者可以靈活地選擇需要的功能模塊,根據(jù)實(shí)際的需求定制自己的內(nèi)核。這樣一來,嵌入式系統(tǒng)的開發(fā)難度被降低了不少,同時(shí)也使得系統(tǒng)的運(yùn)行效率得到了提升。因此,uclinux內(nèi)核在嵌入式系統(tǒng)開發(fā)領(lǐng)域中受到了廣泛的關(guān)注和應(yīng)用。

那么,如何進(jìn)行uclinux內(nèi)核移植呢?嵌入式系統(tǒng)的開發(fā)者需要確定自己的硬件平臺(tái),并了解平臺(tái)的具體技術(shù)規(guī)范。然后,需要針對硬件平臺(tái)對uclinux內(nèi)核進(jìn)行移植。針對不同的硬件平臺(tái),uclinux內(nèi)核的移植方式也不同,但一般情況下,uclinux內(nèi)核移植的流程可歸納為以下幾個(gè)步驟:

1. 總體規(guī)劃。需要確定uclinux內(nèi)核移植的具體目標(biāo)和范圍,以及開發(fā)過程和測試過程中需要考慮的問題,以確保整個(gè)移植過程的成功。

2. 環(huán)境搭建。需要準(zhǔn)備開發(fā)環(huán)境和測試環(huán)境,包括安裝必要的軟件和硬件設(shè)備,并進(jìn)行適當(dāng)?shù)呐渲谩?/p>

3. 硬件適配。需要根據(jù)硬件平臺(tái)的技術(shù)規(guī)范,對uclinux內(nèi)核進(jìn)行適配,其中包括對設(shè)備驅(qū)動(dòng)程序的開發(fā)和調(diào)試。

4. 測試驗(yàn)證。需要對移植的uclinux內(nèi)核進(jìn)行測試驗(yàn)證,并對測試結(jié)果進(jìn)行分析和修正,以確保其符合要求。

5. 優(yōu)化改進(jìn)。需要對移植的uclinux內(nèi)核進(jìn)行優(yōu)化和改進(jìn),以進(jìn)一步提高其運(yùn)行效率和穩(wěn)定性。

有了以上步驟的指導(dǎo),就能夠順利地進(jìn)行uclinux內(nèi)核移植。但是值得注意的是,uclinux內(nèi)核和標(biāo)準(zhǔn)的Linux內(nèi)核有著一些區(qū)別,因此在進(jìn)行移植時(shí)需要注意以下幾點(diǎn):

1. 內(nèi)核配置。需要使用適當(dāng)?shù)呐渲眠x項(xiàng)并且配置適合嵌入式系統(tǒng)的系統(tǒng)調(diào)用接口。

2. 設(shè)備驅(qū)動(dòng)。需要根據(jù)硬件平臺(tái)要求開發(fā)驅(qū)動(dòng)程序,并且需要針對不同的設(shè)備進(jìn)行合適的選擇和適配。

3. 系統(tǒng)庫。需要適當(dāng)?shù)剡x擇系統(tǒng)庫,并對其進(jìn)行裁剪,以滿足硬件平臺(tái)的要求。

4. 內(nèi)存管理。需要根據(jù)硬件平臺(tái)的內(nèi)存情況對內(nèi)存管理進(jìn)行優(yōu)化和調(diào)整。

通過對uclinux內(nèi)核移植的學(xué)習(xí)和實(shí)踐,可以發(fā)現(xiàn),uclinux內(nèi)核的移植并不是一件容易的事情,需要系統(tǒng)的學(xué)習(xí)和實(shí)踐,尤其需要對硬件平臺(tái)的了解和熟悉。但是,一旦完成了uclinux內(nèi)核移植,就能夠在嵌入式系統(tǒng)中享受到更加靈活、高效和可靠的運(yùn)行環(huán)境。因此,uclinux內(nèi)核的出現(xiàn),為嵌入式系統(tǒng)的開發(fā)提供了全新的選擇,同時(shí)也在一定程度上推動(dòng)了嵌入式系統(tǒng)技術(shù)的發(fā)展和創(chuàng)新。

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!

單片機(jī)與OS區(qū)別在哪

1、兩個(gè)是不同的概念,單片機(jī)是微處理的范疇,OS是操作系統(tǒng)的簡稱,包括WINDOW系統(tǒng),linux系統(tǒng)都屬于OS領(lǐng)域。而我們最早接觸的單片機(jī),代表有89C51,AVR系列,以及現(xiàn)在用的比較多的M3內(nèi)核單片機(jī)。

2、目前高端一點(diǎn)的單片機(jī)上面可以移植簡單的OS系統(tǒng),比如在M3或者M(jìn)4內(nèi)核的單片機(jī)上移植RTOS,uclinux等等。

3、擁有ARM9或者CORTEX內(nèi)核的處理器,可以直接移植linux或者wince系統(tǒng)了,該處理器由于能處理大量復(fù)雜運(yùn)算,這個(gè)地方就不叫單片機(jī)了,

關(guān)于Linux

Linux正在嵌入式開發(fā)領(lǐng)域穩(wěn)步發(fā)展。因?yàn)長inux使用GPL(請參閱本文后面的參考資料),所以任何對將Linux定制于PDA、掌上機(jī)或者可佩帶設(shè)備感興趣的人都可以從因特網(wǎng)免費(fèi)下載其內(nèi)核和應(yīng)用程序,并開始移植或開發(fā)。許多仔畢Linux改良品種迎合了嵌入式/實(shí)時(shí)市場。它們包括RTLinux(實(shí)時(shí)Linux)、uclinux(用于非MMU設(shè)備的Linux)、MontavistaLinux(用于ARM、MIPS、PPC的Linux分發(fā)版)、ARM-Linux(ARM上的Linux)和其它Linux系統(tǒng)

嵌入式Linux開發(fā)大致涉及三個(gè)層次:引導(dǎo)裝載程序、Linux內(nèi)核和圖形用戶界面(或稱GUI)。引導(dǎo)裝載程序通常是在任何硬件上執(zhí)行的之一段代碼。在象臺(tái)式機(jī)這樣的常規(guī)系統(tǒng)中,通常將引導(dǎo)裝載程序裝入主引導(dǎo)記錄(MasterBootRecord,(MBR))中,或者裝入Linux駐留的磁盤的之一個(gè)扇區(qū)中。通常,在臺(tái)式機(jī)或其它系統(tǒng)上,BIOS將控制移交給引導(dǎo)裝載程序。

專用軟件可以直接與遠(yuǎn)程系統(tǒng)上的閃存設(shè)備進(jìn)行交互并將引導(dǎo)裝載程序安裝在閃存的給定位置中。閃存設(shè)備是與存儲(chǔ)設(shè)備功能類似的特殊芯片,而且它們能持久存儲(chǔ)信息—即,在重新引導(dǎo)時(shí)不會(huì)擦除其內(nèi)容。

某些種類的嵌入式設(shè)備具有微小的引導(dǎo)代碼—根據(jù)幾個(gè)字節(jié)的指令—它將初始化一些DRAM設(shè)置并啟用目標(biāo)上的一個(gè)串行(或者USB,或者以太網(wǎng))端口與主機(jī)程序通信。然后,主機(jī)程序或裝入程序可以使用這個(gè)連接將引導(dǎo)裝載程序傳送到目標(biāo)上,并將它寫入閃存。設(shè)置工具鏈在主機(jī)機(jī)器上創(chuàng)建一個(gè)用于編譯將在目標(biāo)上運(yùn)行的內(nèi)核和應(yīng)用程序的構(gòu)建環(huán)境—這是因?yàn)槟繕?biāo)硬件可能沒有與主機(jī)兼容的二進(jìn)制執(zhí)行級別。

工具鏈由一套用于編譯、匯編和鏈接內(nèi)核及應(yīng)用程序的組件組成。這些組件包括:Binutils—用哪檔于操作二進(jìn)制文件的實(shí)用程序。它們包括諸如ar、as、objmp、objcopy這樣的實(shí)用程序。G—GNUC編譯器。Glibc—所有用戶應(yīng)用程序都將鏈接到的C庫。避免使用任何C庫函數(shù)的內(nèi)核和其它應(yīng)用程序可以在沒有該庫的情況下進(jìn)行編譯。構(gòu)建工具鏈建立了一個(gè)交叉編譯器環(huán)境。本地編譯器編譯與本機(jī)同類的處理器的指令。交叉編譯器運(yùn)行在某一種處理器上,卻可以編譯另一種處理器的指令。重頭設(shè)置交叉編譯器工具鏈可不是一項(xiàng)簡單的任務(wù):它包括下載源代碼、修補(bǔ)補(bǔ)丁、配置、編譯、設(shè)置頭文件、安裝以及很多很多的操作。另外,這樣一個(gè)徹底的構(gòu)建過程對內(nèi)存和硬盤的需求是巨大的。如果沒有足夠的內(nèi)存和硬盤空間,那么在構(gòu)建階段由于相關(guān)性、配置或頭文件設(shè)置等念緩芹問題會(huì)突然冒出許多問題。

因此能夠從因特網(wǎng)上獲得已預(yù)編譯的二進(jìn)制文件是一件好事(但不太好的一點(diǎn)是,它們大多數(shù)只限于基于ARM的系統(tǒng),但遲早會(huì)改變的)。一些比較流行的已預(yù)編譯的工具鏈包括那些來自Compaq(FamiliarLinux)、LART(LARTLinux)和Embedian(基于Debian但與它無關(guān))的工具鏈—所有這些工具鏈都用于基于ARM的平臺(tái)。從用戶的觀點(diǎn)來看,圖形用戶界面(GUI)是系統(tǒng)的一個(gè)最至關(guān)重要的方面:用戶通過GUI與系統(tǒng)進(jìn)行交互。所以GUI應(yīng)該易于使用并且非??煽俊5€需要是有內(nèi)存意識的,以便在內(nèi)存受限的、微型嵌入式設(shè)備上可以無縫執(zhí)行。所以,它應(yīng)該是輕量級的,并且能夠快速裝入。

另一個(gè)要考慮的重要方面涉及許可證問題。一些GUI分發(fā)版具有允許免費(fèi)使用的許可證,甚至在一些商業(yè)產(chǎn)品中也是如此。另一些許可證要求如果想將GUI合并入項(xiàng)目中則要支付版稅。

最后,大多數(shù)開發(fā)人員可能會(huì)選擇XFree86,因?yàn)閄Free86為他們提供了一個(gè)能使用他們喜歡的工具的熟悉環(huán)境。但是市場上較新的GUI,象CenturySoftware的(Nano-X)和TrolltechQT/Embedded,與X在嵌入式Linux的競技舞臺(tái)中展開了激烈競爭,這主要是因?yàn)樗鼈冋加煤苌俚馁Y源、執(zhí)行的速度很快并且具有定制窗口構(gòu)件的支持。

求嵌入式linux開發(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è).

2.然后就是你寫程序嘍,不過注意可能有些庫函數(shù)不能用,因?yàn)槟膫€(gè)編譯器稍微受限一點(diǎn),不是所由的c庫函數(shù)都支持,不過一般開發(fā)的都有.

3.連起你的主機(jī)和開發(fā)板,這個(gè)你會(huì)不?要連兩個(gè):串口(用來控制板子)和以太口(用來下載程序),我們板子上這些外設(shè)都有,你要使沒有可以用其他的口代替?zhèn)鞒绦?但串口可是該有的阿!

4.在你主機(jī)上編譯程序生成目標(biāo)代碼,建議用makefile文件來組織你的聯(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截面,開啟你的板子,應(yīng)該就是板子uclinux系統(tǒng)解壓安裝的畫面了.然后用ifconfig eth0…..

配置ip,這個(gè)ip就是你板子的ip了,注意與主機(jī)一個(gè)網(wǎng)段.然后mount -t nfs 主機(jī)ip:/uclinux /板子上的一個(gè)目錄,就把主機(jī)的 uclinux目錄放到板子上了(這么說其實(shí)不合理,應(yīng)該叫掛載). 然后找到你剛才一經(jīng)編譯好的哪個(gè)目標(biāo)代碼執(zhí)行即可.

因不了解你的具體環(huán)境和配置,暫說這些,有問題可再聯(lián)系:)

嵌入式LINUX開發(fā)入門

V1.5

華恒對社區(qū)的貢獻(xiàn)華恒對社區(qū)的貢獻(xiàn)

本文適用于對嵌入式系統(tǒng)沒有概念和經(jīng)驗(yàn),

渴望進(jìn)入嵌入式系統(tǒng)開發(fā)的領(lǐng)域,

但又覺得系統(tǒng)太復(fù)雜,要學(xué)的東西太多,

感覺完全無從學(xué)起,無從下手

初級開發(fā)人員

簡述簡述

1,嵌入式系統(tǒng)必須以實(shí)踐入門,所以要學(xué)習(xí)必須購買嵌入式開發(fā)系統(tǒng)

(開發(fā)板或?qū)嶒?yàn)箱),否則永遠(yuǎn)只能停留在紙上談兵的階段.

2,學(xué)習(xí)嵌入式LINUX開發(fā),必須注意學(xué)習(xí)的方式和方法!就把這個(gè)嵌

入式開發(fā)板當(dāng)作一臺(tái)WINDOWS PC,就像用VC一樣在上面做開發(fā)(只是

開發(fā)模式由原來完全的本地開發(fā)變成宿主機(jī)–目標(biāo)板的模式了).

絕對不要去盲目閱讀LINUX內(nèi)核分析之類的書籍,對于初學(xué)者一兩年內(nèi)

根本用不到這個(gè)!就像在WINDOWS下開發(fā)永遠(yuǎn)不要關(guān)心WINDOWS內(nèi)核一

個(gè)道理,不要因?yàn)長INUX內(nèi)核是源代碼開放的,就非要去研究LINUX內(nèi)

核.90%的開發(fā)人員關(guān)心的還是”外設(shè)接口驅(qū)動(dòng)+應(yīng)用程序(如GUI)”

,所以對于初學(xué)者,進(jìn)入嵌入式LINUX開發(fā)的殿堂,必須邁過如下兩個(gè)

臺(tái)階:

嵌入式基本C程序開發(fā)及調(diào)試方法

基本驅(qū)動(dòng)的概念和開發(fā)調(diào)試方法

嵌入式開發(fā)上手學(xué)習(xí)大綱嵌入式開發(fā)上手學(xué)習(xí)大綱

安裝配置一臺(tái)REDHAT 9的LINUX PC機(jī).宿主機(jī)配置(TFTP/NFS)

參見:

通過終端軟件minicom熟悉一下嵌入式系統(tǒng)的基本操作,否則你

根本就不會(huì)操作板子!

通過NFS mount的方式,學(xué)習(xí)用C語言開發(fā)最基本的嵌入式應(yīng)用程

序,并熟悉嵌入式的調(diào)試方法.(HHARM9-EDU實(shí)驗(yàn)1)

熟悉掌握嵌入式LINUX下的編譯方法和技巧,并進(jìn)一步掌握調(diào)試

復(fù)雜嵌入式應(yīng)用程序的方法和技巧.(HHARM9-EDU實(shí)驗(yàn)2,3)

通過NFS mount的方式,學(xué)習(xí)如何使用一個(gè)基本的嵌入式LINUX下

的設(shè)備驅(qū)動(dòng)(inod驅(qū)動(dòng)+測試用應(yīng)用程序),并嘗試著改改看

如何發(fā)生變化和如何調(diào)試.(HHARM9-EDU實(shí)驗(yàn)6中斷,

14GPIO/key,AD/DA,I2C等)

進(jìn)一步深入學(xué)習(xí)其它的接口技術(shù).(HHARM9-EDU其它剩余實(shí)驗(yàn))

【注意】

做到這里您一次都不需要燒寫FLASH!

Tips–再談學(xué)習(xí)的方式方法Tips–再談學(xué)習(xí)的方式方法

早早安裝一臺(tái)REDHAT 9 LINUX的PC,下面這些必須熟悉了解(因?yàn)樗鼘⑹俏?/p>

們?nèi)蘸箝_發(fā)更佳的測試伙伴):

telnet/ncftp/tar(xzf/czf)/vi/grep/find/NFS/tftp等常用操作;熟悉了解

LINUX系統(tǒng)的文件目錄構(gòu)成(/bin/in/etc/home/dev/usr等的意義,系統(tǒng)搜

索路徑PATH因?yàn)榍度胧絃INUX上和這個(gè)完全一樣)(關(guān)于這些LINUX常用知識

請參見HHARM2410產(chǎn)品技術(shù)手冊附錄B,那里沒有無用的抄襲,而是一線研發(fā)

人員實(shí)際的總結(jié))

大致了解LINUX內(nèi)核源代碼的文件目錄的構(gòu)成(主要就是drivers目錄,它是我

們最常打交道的驅(qū)動(dòng)的目錄).因?yàn)槲覀儗τ贚INUX下驅(qū)動(dòng)的開發(fā)最重要的工

作學(xué)習(xí)的方法就是:”搜索+模仿”.大家都知道LINUX是開放源代碼的,但

其實(shí)很多人并沒有意識到這個(gè)對于我們實(shí)際的開發(fā)有什么意義.就像面前擺

了一座寶庫,但卻不知如何去尋寶.我們尋寶的手段就是搜索.對于驅(qū)動(dòng),

LINUX開放的代碼(drivers目錄+google網(wǎng)絡(luò))里面提供了無數(shù)常見接口芯片

的驅(qū)動(dòng)代碼或模板(如串口serial.c,framebuffer驅(qū)動(dòng)等),我們首先要知道

這些文件在哪個(gè)目錄下,找到后就是大致讀一下,找出與自己實(shí)際硬件的差

異,以此為基礎(chǔ)修修改改即可.而修改時(shí)一個(gè)重要的手段就是模仿現(xiàn)有的代

碼!

Tips–再談學(xué)習(xí)的方式方法Tips–再談學(xué)習(xí)的方式方法

在嵌入式板卡上做任何稍微復(fù)雜些的工作,心里沒底的話,就一定養(yǎng)成先在

REDHAT LINUX PC上測試的好習(xí)慣.無論你做GPRS/CDMA/PPP/ADSL撥號還是做

USB無線網(wǎng)卡驅(qū)動(dòng),還是做SAMBA/VPN/SNMP等協(xié)議軟件,都先在REDHAT LINUX

上配置好,測試通過有了感覺之后再到嵌入式上試,因?yàn)锳RMLINUX跟REDHAT

LINUX對于我們開發(fā)人員而言幾乎沒有任何區(qū)別!切忌冒進(jìn)!

不要試圖去通讀CPU的manual,沒有用的,就像不要為了做嵌入式LINUX就要

通讀LINUX內(nèi)核源代碼分析一個(gè)道流.以目前實(shí)際的工作為主線,涉及到什么

再去大致了解一下相關(guān)內(nèi)容,例如我們第二步要做MODULES形式的驅(qū)動(dòng),那么

這時(shí)去大致翻翻那本《LINUX驅(qū)動(dòng)開發(fā)》一書的幾頁還是會(huì)有些幫助的,但也

沒有必要全部通讀!

嵌入式開發(fā)模式嵌入式開發(fā)模式

【宿主機(jī)】

網(wǎng)線

網(wǎng)線

交換機(jī)

串口線

HHARM開發(fā)板

假設(shè)IP為:192.168.2.120

【目標(biāo)板】

運(yùn)行RedhatLinux的PC機(jī)

假設(shè)IP為:192.168.2.2.122

交叉編譯

之一部分

嵌入式基本C程序開發(fā)和調(diào)試

嵌入式基本C程序開發(fā)和調(diào)試嵌入式基本C程序開發(fā)和調(diào)試

關(guān)于Makefile關(guān)于Makefile

Makefile就是一個(gè)批處理的腳本!通過執(zhí)行make來調(diào)用

EXEC = hello

OB = hello1.o #hello2.o hello3.o

LIBS += #-lcrypt -lm

all: $(EXEC)

$(EXEC) : $(OB)

$(CC) $(CFLAGS) $(LDFLAGS) -o $(EXEC) $(OB) $(LIBS)

clean:

rm-f $(OB) $(EXEC)

#Note

#表示注釋,這是個(gè)通用的模板,我們的例子里面只用到一個(gè)hello1.c,而

且也不需要鏈接加密庫(libcrypt.a)和數(shù)學(xué)庫(libm.a).hello1.c的

內(nèi)容就不需要寫了吧,就一個(gè)printf語句

NFS mount調(diào)試方法進(jìn)階NFS mount調(diào)試方法進(jìn)階

前面./hello的方式用來調(diào)試最簡單的主動(dòng)執(zhí)行的應(yīng)用程序.還有很多的

應(yīng)用程序要復(fù)雜一些,例如minigui/qt/microwin等GUI系統(tǒng),它除了

可執(zhí)行文件外,還涉及自己的動(dòng)態(tài)庫libxxx.so;還有另外一些如CGI類

的被動(dòng)的被其它程序激發(fā)執(zhí)行的程序?qū)τ谶@樣的復(fù)雜程序調(diào)試,可如下

操作: (細(xì)節(jié)處有一些操作目錄的變化)

在REDHAT LINUX PC上執(zhí)行:

mkdir /2410lib;

gunzip ramdisk.image.gz

mount -o loop ramdisk.image /tmp

cp -f /tmp/lib/* /2410lib

在minicom等終端里執(zhí)行:

mount -o nolock

192.168.2.122:/2410lib /lib

mount -o nolock 192.168.2.122:/ /mnt

/mnt/treeview&

#這樣就可以NFS調(diào)試帶動(dòng)態(tài)庫的復(fù)雜程序了

注意:

從上可見,板子可以多次mount多個(gè)目錄,或者多個(gè)不同IP的PC的不同硬盤目錄,甚至可以將

板子上所有的目錄都用PC硬盤上的同類目錄覆蓋掉

同時(shí)可以看出這時(shí)的目標(biāo)板就像一臺(tái)UNIX主機(jī)一樣可以為多個(gè)開發(fā)人員提供并行開發(fā)的環(huán)境.

第二部分

基本驅(qū)動(dòng)的概念和開發(fā)調(diào)試方法

基本驅(qū)動(dòng)的概念和開發(fā)調(diào)試方法基本驅(qū)動(dòng)的概念和開發(fā)調(diào)試方法

ARMLINUX不同于uClinux,因?yàn)閱?dòng)了MMU,所以應(yīng)用程序不能直接

讀寫物理地址(包括CPU寄存器,

MEMORY,外設(shè)芯片內(nèi)部寄存器等),而必須借助與驅(qū)動(dòng)的形式,切入

內(nèi)核用ioremap來實(shí)現(xiàn)對這些物理地址的訪問.

下面以一個(gè)最常見的GPIO操作為例來說明:

就是選擇S3C2410的GPIO_C6口作為一個(gè)輸出口線,用戶通過一個(gè)應(yīng)用程序調(diào)用驅(qū)

動(dòng)程序來控制這個(gè)口線輸出1或者0,即高低電平.

例子由兩部分構(gòu)成:”驅(qū)動(dòng)(gpio_driv.c)+應(yīng)用程序(gpio_test.c)”

LINUX下的驅(qū)動(dòng)有兩種形式:

MODULES形式的可動(dòng)態(tài)加載的驅(qū)動(dòng)(這是LINUX內(nèi)核一個(gè)非常重要

的特點(diǎn)),我們測試用建議都用這種形式的,因?yàn)樗{(diào)試就和普通應(yīng)用

程序一樣,可以通過NFS mount的方式來調(diào)試,非常方便.

靜態(tài)編譯到內(nèi)核里面的驅(qū)動(dòng)

基本驅(qū)動(dòng)的概念和開發(fā)調(diào)試方法基本驅(qū)動(dòng)的概念和開發(fā)調(diào)試方法

樣例modules形式驅(qū)動(dòng)的測試用法如下:

NFS mount宿主機(jī)后,

inod gpio_driv.o #在板上嵌入式LINUX內(nèi)核已經(jīng)跑起來之后動(dòng)態(tài)加載驅(qū)動(dòng)module

mknod/dev/gpiotest c 220 0

./gpio_test#執(zhí)行測試用的應(yīng)用程序來調(diào)用驅(qū)動(dòng),來驅(qū)動(dòng)IO輸出高低電平

0:set ,1:clear,2: quit :

用戶輸入0,則C6口輸出3.3V高電平;用戶輸入1,則C6口輸出0低電平.

應(yīng)用程序如何調(diào)用驅(qū)動(dòng)以及驅(qū)動(dòng)要注意的一些細(xì)節(jié)在下面的詳細(xì)代碼中通過注釋

的形式一一說明.

驅(qū)動(dòng)MODULE源代碼驅(qū)動(dòng)MODULE源代碼

#include //FILE: gpio_driv.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define IOPORT_MAJOR 220 //定義主設(shè)備號,和前面的mknod/dev/gpiotestc 220 0匹配

typedefchar ioport_device_t; long port_addr;

static ioport_device_t gpio_devices;

int gpio_open(struct inode*, structfile *);

int gpio_release(struct inode*, structfile *);

int gpio_ctl_ioctl(struct inode *, struct file *, unsigned int, unsigned long);

驅(qū)動(dòng)MODULE源代碼驅(qū)動(dòng)MODULE源代碼

static structfile_operations gpio_ctl_fops= {

ioctl: gpio_ctl_ioctl,

open: gpio_open,

release: gpio_release,

};

//所有的操作系統(tǒng)將硬件設(shè)備當(dāng)作文件處理,所有外設(shè)的操作就封裝在這個(gè)file_operations 結(jié)構(gòu)體里面

//就是文件的open/read/write/close等操作,剩余的都放到一個(gè)ioctl函數(shù)里面做處理.

int__init gpio_init(void)

{

inti;

//可以看到下面這句向操作系統(tǒng)注冊的函數(shù)里面和前面我們在minicom里面手工創(chuàng)建的設(shè)備文件是

//要完全匹配的:mknod/dev/gpiotestc 220 0,這表明創(chuàng)建的是一個(gè)字符設(shè)備(chrdev),

//主設(shè)備號220,次設(shè)備號0,因?yàn)椴僮飨到y(tǒng)不理會(huì)”gpiotest”這個(gè)設(shè)備名字符串的,它只認(rèn)數(shù)字的主次

//設(shè)備號,而應(yīng)用程序到時(shí)是open(“/dev/gpiotest”,xx)的,中間就是通過這兩個(gè)數(shù)字聯(lián)系起來的.

register_chrdev(IOPORT_MAJOR, “gpiotest”, &gpio_ctl_fops);

return 0;

}

module_init(gpio_init); //用戶加載該驅(qū)動(dòng)時(shí)執(zhí)行inod gpio_driv.o就會(huì)自動(dòng)調(diào)用gpio_init函數(shù),它是驅(qū)動(dòng)

//的入口點(diǎn),相當(dāng)于應(yīng)用程序的main函數(shù).

module_exit(gpio_release); //用戶卸載該驅(qū)動(dòng)rmmod gpio_driv時(shí)執(zhí)行

驅(qū)動(dòng)MODULE源代碼驅(qū)動(dòng)MODULE源代碼

int gpio_open(struct inode*inode, structfile *filp)

{

intminor;

minor = MINOR(inode->i_rdev);

#if 0 //這里是通常的做法,因?yàn)镾3C2410的LINUX內(nèi)核提供了set_gpio_ctrl專用函數(shù),所以不要下面

這樣做了

(void *)(port_addr) = ioremap(0x,0x8);

*(volatile unsigned int*)(port_addr)|=0x;

#endif

//驅(qū)動(dòng)里面在open這個(gè)設(shè)備的時(shí)候設(shè)置這個(gè)口為輸出(因?yàn)镚PIO必須設(shè)置方向,做輸入還是輸出)

set_gpio_ctrl(GPIO_MODE_OUT | GPIO_C6);

gpio_devices++;

return 0;

}

驅(qū)動(dòng)MODULE源代碼驅(qū)動(dòng)MODULE源代碼

int gpio_release(struct inode*inode, structfile *filp)

{ intminor;

minor = MINOR(inode->i_rdev);

if (gpio_devices)

gpio_devices–;

return 0;

}

int gpio_ctl_ioctl(struct inode*inode,structfile *flip,unsigned intcommand,unsigned long arg)

{

interr = 0;

intminor = MINOR(inode->i_rdev);

switch (command) {

case IOWRITE:

write_gpio_bit(GPIO_MODE_OUT | GPIO_C6,1); //輸出3.3V電平

return 0;

case IOCLEAR:

write_gpio_bit(GPIO_MODE_OUT | GPIO_C6,0); //輸出0電平

return 0;

}

return err;

}

基本驅(qū)動(dòng)MODULE的Makefile基本驅(qū)動(dòng)MODULE的Makefile

注意!驅(qū)動(dòng)程序的Makefile和應(yīng)用程序的參數(shù)不同!

CC = /opt/host/armv4l/bin/armv4l-unknown-linux-gcc

LD = /opt/host/armv4l/bin/armv4l-unknown-linux-ld

CFLAGS = -D__KERNEL__ -I/HHARM2410-R3/kernel/include/linux

-I/HHARM2410-R3/kernel/include -Wall -Wstrict-prototypes -Wno-trigraphs-

Os -mapcs-fno-strict-aliasing-fno-common -fno-common -pipe -mapcs-32

-march=armv4 -mtune=arm9tdmi -mshort-load-bytes -msoft-float

-DKBUILD_BASENAME= gpio_driv

-I/opt/host/armv4l/src/linux/include -DMODULE

gpio_driv.o: gpio_driv.c

$(CC) $(CFLAGS) -c $^ -o $@

cp gpio_driv.o / -f

clean:

-rm-f *.o

測試驅(qū)動(dòng)的應(yīng)用程序測試驅(qū)動(dòng)的應(yīng)用程序

#include //FILE: gpio_test.c

#include

#include …//省略一些頭文件

#include

#define DEVICE_GPIOTEST “/dev/gpiotest”

intmain()

{

int fd; int val=-1;

if((fd=open(DEVICE_ GPIOTEST,O_RDON | O_NONBLOCK))i_rdev);

#if 0 //這里是通常的做法,因?yàn)镾3C2410的LINUX內(nèi)核提供了set_gpio_ctrl專用函數(shù),所以不要下面

這樣做了

(void *)(port_addr) = ioremap(0x,0x8);

*(volatile unsigned int*)(port_addr)|=0x;

#endif

//驅(qū)動(dòng)里面在open這個(gè)設(shè)備的時(shí)候設(shè)置這個(gè)口為輸出(因?yàn)镚PIO必須設(shè)置方向,做輸入還是輸出)

set_gpio_ctrl(GPIO_MODE_OUT | GPIO_C6);

gpio_devices++;

return 0;

}

18

驅(qū)動(dòng)MODULE源代碼驅(qū)動(dòng)MODULE源代碼

int gpio_release(struct inode*inode, structfile *filp)

{ intminor;

minor = MINOR(inode->i_rdev);

if (gpio_devices)

gpio_devices–;

return 0;

}

int gpio_ctl_ioctl(struct inode*inode,structfile *flip,unsigned intcommand,unsigned long arg)

{

interr = 0;

intminor = MINOR(inode->i_rdev);

switch (command) {

case IOWRITE:

write_gpio_bit(GPIO_MODE_OUT | GPIO_C6,1); //輸出3.3V電平

return 0;

case IOCLEAR:

write_gpio_bit(GPIO_MODE_OUT | GPIO_C6,0); //輸出0電平

return 0;

}

return err;

}

19

基本驅(qū)動(dòng)MODULE的Makefile基本驅(qū)動(dòng)MODULE的Makefile

注意!驅(qū)動(dòng)程序的Makefile和應(yīng)用程序的參數(shù)不同!

CC = /opt/host/armv4l/bin/armv4l-unknown-linux-gcc

LD = /opt/host/armv4l/bin/armv4l-unknown-linux-ld

CFLAGS = -D__KERNEL__ -I/HHARM2410-R3/kernel/include/linux

-I/HHARM2410-R3/kernel/include -Wall -Wstrict-prototypes -Wno-trigraphs-

Os -mapcs-fno-strict-aliasing-fno-common -fno-common -pipe -mapcs-32

-march=armv4 -mtune=arm9tdmi -mshort-load-bytes -msoft-float

-DKBUILD_BASENAME= gpio_driv

-I/opt/host/armv4l/src/linux/include -DMODULE

gpio_driv.o: gpio_driv.c

$(CC) $(CFLAGS) -c $^ -o $@

cp gpio_driv.o / -f

clean:

-rm-f *.o

20

測試驅(qū)動(dòng)的應(yīng)用程序測試驅(qū)動(dòng)的應(yīng)用程序

#include //FILE: gpio_test.c

#include

#include …//省略一些頭文件

#include

#define DEVICE_GPIOTEST “/dev/gpiotest”

intmain()

{

int fd; int val=-1;

if((fd=open(DEVICE_ GPIOTEST,O_RDON | O_NONBLOCK))

{ perror(“can not open device”); exit(1); }

while(1){

printf(“0:set ,1:clear,2: quit :”);

scanf(“%d”,&val);

if(val==0)

ioctl(fd,IOWRITE,0);//應(yīng)用程序就是這樣調(diào)用驅(qū)動(dòng)的

else if(val==1)

ioctl(fd,IOCLEAR,0);//應(yīng)用程序就是這樣調(diào)用驅(qū)動(dòng)的

else if(val==2){

close(fd); …

}

}

21

最后可試試燒寫FLASH了最后可試試燒寫FLASH了

完成自己的小驅(qū)動(dòng)和測試用應(yīng)用程序后,您可以將自己的初步成就燒寫到板子里去了,具體的燒

寫可參見我們產(chǎn)品手冊或者HHARM FAQ

如何加入到板子的文件系統(tǒng)里

文件系統(tǒng)就是用來存放用戶應(yīng)用程序的.

HHARM9系列嵌入式LINUX開發(fā)系統(tǒng)的根文件系統(tǒng)采用的是ramdisk.

下面舉例說明用戶如何把自己的hello程序燒寫到板子上去:

先把ramdisk.image.gz解壓后mount -o loop 到一個(gè)目錄上,這樣就可以看到ramdisk里面的文

件及目錄內(nèi)容,這時(shí)再把你編譯號的hello這個(gè)可執(zhí)行文件復(fù)制到這個(gè)目錄的bin目錄下面,再

umount這個(gè)目錄,再gzip壓縮,這樣你所作的改動(dòng)就被帶到這個(gè)新生成的ramdisk.image.gz文件

里面了,然后你燒寫這個(gè)文件就可以在板子上看到你的hello了.

簡單命令序列:注意要自己調(diào)整目錄路徑,所有操作均在REDHAT LINUX PC機(jī)上完成:

gunzip ramdisk.image.gz

mkdir tmnt

mount -o loop ramdisk.image tmnt

cp -f busybox tmnt/bin

umount tmnt

gzip ramdisk.image

cp -f ramdisk.image.gz /tftpboot ;再后面的燒寫步驟這里就不再贅述,參見HHARM FAQ或者我們手冊即可

22

參考資料參考資料

HHARM9-EDU實(shí)驗(yàn)指導(dǎo)書

參見:華恒ARM9+LINUX+WINCE雙系統(tǒng)嵌入式教學(xué)實(shí)驗(yàn)箱

HHARM FAQ

華恒HHARM2410系列產(chǎn)品手冊

可EMAIL至華恒ARM產(chǎn)品系列技術(shù)支持信箱:

華恒嵌入式LINUX技術(shù)論壇

嵌入式LINUX開發(fā)資源

回答者:bingxiang81 – 經(jīng)理 四級:46

Tips–再談學(xué)習(xí)的方式方法Tips–再談學(xué)習(xí)的方式方法

在嵌入式板卡上做任何稍微復(fù)雜些的工作,心里沒底的話,就一定養(yǎng)成先在

REDHAT LINUX PC上測試的好習(xí)慣.無論你做GPRS/CDMA/PPP/ADSL撥號還是做

USB無線網(wǎng)卡驅(qū)動(dòng),還是做SAMBA/VPN/SNMP等協(xié)議軟件,都先在REDHAT LINUX

上配置好,測試通過有了感覺之后再到嵌入式上試,因?yàn)锳RMLINUX跟REDHAT

LINUX對于我們開發(fā)人員而言幾乎沒有任何區(qū)別!切忌冒進(jìn)!

不要試圖去通讀CPU的manual,沒有用的,就像不要為了做嵌入式LINUX就要

通讀LINUX內(nèi)核源代碼分析一個(gè)道流.以目前實(shí)際的工作為主線,涉及到什么

再去大致了解一下相關(guān)內(nèi)容,例如我們第二步要做MODULES形式的驅(qū)動(dòng),那么

這時(shí)去大致翻翻那本《LINUX驅(qū)動(dòng)開發(fā)》一書的幾頁還是會(huì)有些幫助的,但也

沒有必要全部通讀!好好看把

建立以Linux系統(tǒng)為基礎(chǔ)的開發(fā)環(huán)境;

配置開發(fā)主機(jī)(MINICOM調(diào)試嵌入式開發(fā)板、NFS網(wǎng)絡(luò)文件系統(tǒng),防火墻);

建立引導(dǎo)裝載程序BOOTLOADER(公開源代碼的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等);

下載別人已經(jīng)移植好的Linux操作系統(tǒng)(如μCLinux、ARM-Linux、PPC-Linux等);

建立根文件系統(tǒng)(包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等);

建立應(yīng)用程序的Flash磁盤分區(qū),一般使用JFFS2或YAFFS文件系統(tǒng);

開發(fā)應(yīng)用程序,應(yīng)用程序可以放入根文件系統(tǒng)中,也可以放入YAFFS、JFFS2文件系統(tǒng)中;

uclinux 內(nèi)核移植的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于uclinux 內(nèi)核移植,uclinux內(nèi)核移植:打造嵌入式系統(tǒng)的新選擇,單片機(jī)與OS區(qū)別在哪,關(guān)于Linux,求嵌入式linux開發(fā)詳細(xì)流程(步驟)?的信息別忘了在本站進(jìn)行查找喔。

香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問快、穩(wěn)定!


網(wǎng)頁名稱:uclinux內(nèi)核移植:打造嵌入式系統(tǒng)的新選擇(uclinux內(nèi)核移植)
本文鏈接:http://www.5511xx.com/article/cdphdhi.html