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

uclinux是一個精簡版Linux內核,與標準的Linux內核相比,uclinux內核對于嵌入式系統(tǒng)的資源要求更低,占用更少的內存和存儲空間,針對嵌入式系統(tǒng)設計了易于移植的接口。在uclinux內核的基礎上,嵌入式系統(tǒng)的開發(fā)者可以靈活地選擇需要的功能模塊,根據(jù)實際的需求定制自己的內核。這樣一來,嵌入式系統(tǒng)的開發(fā)難度被降低了不少,同時也使得系統(tǒng)的運行效率得到了提升。因此,uclinux內核在嵌入式系統(tǒng)開發(fā)領域中受到了廣泛的關注和應用。
那么,如何進行uclinux內核移植呢?嵌入式系統(tǒng)的開發(fā)者需要確定自己的硬件平臺,并了解平臺的具體技術規(guī)范。然后,需要針對硬件平臺對uclinux內核進行移植。針對不同的硬件平臺,uclinux內核的移植方式也不同,但一般情況下,uclinux內核移植的流程可歸納為以下幾個步驟:
1. 總體規(guī)劃。需要確定uclinux內核移植的具體目標和范圍,以及開發(fā)過程和測試過程中需要考慮的問題,以確保整個移植過程的成功。
2. 環(huán)境搭建。需要準備開發(fā)環(huán)境和測試環(huán)境,包括安裝必要的軟件和硬件設備,并進行適當?shù)呐渲谩?/p>
3. 硬件適配。需要根據(jù)硬件平臺的技術規(guī)范,對uclinux內核進行適配,其中包括對設備驅動程序的開發(fā)和調試。
4. 測試驗證。需要對移植的uclinux內核進行測試驗證,并對測試結果進行分析和修正,以確保其符合要求。
5. 優(yōu)化改進。需要對移植的uclinux內核進行優(yōu)化和改進,以進一步提高其運行效率和穩(wěn)定性。
有了以上步驟的指導,就能夠順利地進行uclinux內核移植。但是值得注意的是,uclinux內核和標準的Linux內核有著一些區(qū)別,因此在進行移植時需要注意以下幾點:
1. 內核配置。需要使用適當?shù)呐渲眠x項并且配置適合嵌入式系統(tǒng)的系統(tǒng)調用接口。
2. 設備驅動。需要根據(jù)硬件平臺要求開發(fā)驅動程序,并且需要針對不同的設備進行合適的選擇和適配。
3. 系統(tǒng)庫。需要適當?shù)剡x擇系統(tǒng)庫,并對其進行裁剪,以滿足硬件平臺的要求。
4. 內存管理。需要根據(jù)硬件平臺的內存情況對內存管理進行優(yōu)化和調整。
通過對uclinux內核移植的學習和實踐,可以發(fā)現(xiàn),uclinux內核的移植并不是一件容易的事情,需要系統(tǒng)的學習和實踐,尤其需要對硬件平臺的了解和熟悉。但是,一旦完成了uclinux內核移植,就能夠在嵌入式系統(tǒng)中享受到更加靈活、高效和可靠的運行環(huán)境。因此,uclinux內核的出現(xiàn),為嵌入式系統(tǒng)的開發(fā)提供了全新的選擇,同時也在一定程度上推動了嵌入式系統(tǒng)技術的發(fā)展和創(chuàng)新。
成都網(wǎng)站建設公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設、網(wǎng)站制作、網(wǎng)頁設計及定制高端網(wǎng)站建設服務!
單片機與OS區(qū)別在哪
1、兩個是不同的概念,單片機是微處理的范疇,OS是操作系統(tǒng)的簡稱,包括WINDOW系統(tǒng),linux系統(tǒng)都屬于OS領域。而我們最早接觸的單片機,代表有89C51,AVR系列,以及現(xiàn)在用的比較多的M3內核單片機。
2、目前高端一點的單片機上面可以移植簡單的OS系統(tǒng),比如在M3或者M4內核的單片機上移植RTOS,uclinux等等。
3、擁有ARM9或者CORTEX內核的處理器,可以直接移植linux或者wince系統(tǒng)了,該處理器由于能處理大量復雜運算,這個地方就不叫單片機了,
關于Linux
Linux正在嵌入式開發(fā)領域穩(wěn)步發(fā)展。因為Linux使用GPL(請參閱本文后面的參考資料),所以任何對將Linux定制于PDA、掌上機或者可佩帶設備感興趣的人都可以從因特網(wǎng)免費下載其內核和應用程序,并開始移植或開發(fā)。許多仔畢Linux改良品種迎合了嵌入式/實時市場。它們包括RTLinux(實時Linux)、uclinux(用于非MMU設備的Linux)、MontavistaLinux(用于ARM、MIPS、PPC的Linux分發(fā)版)、ARM-Linux(ARM上的Linux)和其它Linux系統(tǒng)
嵌入式Linux開發(fā)大致涉及三個層次:引導裝載程序、Linux內核和圖形用戶界面(或稱GUI)。引導裝載程序通常是在任何硬件上執(zhí)行的之一段代碼。在象臺式機這樣的常規(guī)系統(tǒng)中,通常將引導裝載程序裝入主引導記錄(MasterBootRecord,(MBR))中,或者裝入Linux駐留的磁盤的之一個扇區(qū)中。通常,在臺式機或其它系統(tǒng)上,BIOS將控制移交給引導裝載程序。
專用軟件可以直接與遠程系統(tǒng)上的閃存設備進行交互并將引導裝載程序安裝在閃存的給定位置中。閃存設備是與存儲設備功能類似的特殊芯片,而且它們能持久存儲信息—即,在重新引導時不會擦除其內容。
某些種類的嵌入式設備具有微小的引導代碼—根據(jù)幾個字節(jié)的指令—它將初始化一些DRAM設置并啟用目標上的一個串行(或者USB,或者以太網(wǎng))端口與主機程序通信。然后,主機程序或裝入程序可以使用這個連接將引導裝載程序傳送到目標上,并將它寫入閃存。設置工具鏈在主機機器上創(chuàng)建一個用于編譯將在目標上運行的內核和應用程序的構建環(huán)境—這是因為目標硬件可能沒有與主機兼容的二進制執(zhí)行級別。
工具鏈由一套用于編譯、匯編和鏈接內核及應用程序的組件組成。這些組件包括:Binutils—用哪檔于操作二進制文件的實用程序。它們包括諸如ar、as、objmp、objcopy這樣的實用程序。G—GNUC編譯器。Glibc—所有用戶應用程序都將鏈接到的C庫。避免使用任何C庫函數(shù)的內核和其它應用程序可以在沒有該庫的情況下進行編譯。構建工具鏈建立了一個交叉編譯器環(huán)境。本地編譯器編譯與本機同類的處理器的指令。交叉編譯器運行在某一種處理器上,卻可以編譯另一種處理器的指令。重頭設置交叉編譯器工具鏈可不是一項簡單的任務:它包括下載源代碼、修補補丁、配置、編譯、設置頭文件、安裝以及很多很多的操作。另外,這樣一個徹底的構建過程對內存和硬盤的需求是巨大的。如果沒有足夠的內存和硬盤空間,那么在構建階段由于相關性、配置或頭文件設置等念緩芹問題會突然冒出許多問題。
因此能夠從因特網(wǎng)上獲得已預編譯的二進制文件是一件好事(但不太好的一點是,它們大多數(shù)只限于基于ARM的系統(tǒng),但遲早會改變的)。一些比較流行的已預編譯的工具鏈包括那些來自Compaq(FamiliarLinux)、LART(LARTLinux)和Embedian(基于Debian但與它無關)的工具鏈—所有這些工具鏈都用于基于ARM的平臺。從用戶的觀點來看,圖形用戶界面(GUI)是系統(tǒng)的一個最至關重要的方面:用戶通過GUI與系統(tǒng)進行交互。所以GUI應該易于使用并且非常可靠。但它還需要是有內存意識的,以便在內存受限的、微型嵌入式設備上可以無縫執(zhí)行。所以,它應該是輕量級的,并且能夠快速裝入。
另一個要考慮的重要方面涉及許可證問題。一些GUI分發(fā)版具有允許免費使用的許可證,甚至在一些商業(yè)產(chǎn)品中也是如此。另一些許可證要求如果想將GUI合并入項目中則要支付版稅。
最后,大多數(shù)開發(fā)人員可能會選擇XFree86,因為XFree86為他們提供了一個能使用他們喜歡的工具的熟悉環(huán)境。但是市場上較新的GUI,象CenturySoftware的(Nano-X)和TrolltechQT/Embedded,與X在嵌入式Linux的競技舞臺中展開了激烈競爭,這主要是因為它們占用很少的資源、執(zhí)行的速度很快并且具有定制窗口構件的支持。
求嵌入式linux開發(fā)詳細流程(步驟)?
1.首先,建立交叉編譯環(huán)境:交叉編譯是指:在PC機上編譯,在目標板上執(zhí)行,我PC是linux+ arm-elf-gcc編譯器.扳子是ARM3000.板子上的系統(tǒng)是uclinux,這時一個剪裁的很小的實時嵌入式linux操作系統(tǒng).推薦使用這個.
2.然后就是你寫程序嘍,不過注意可能有些庫函數(shù)不能用,因為哪個編譯器稍微受限一點,不是所由的c庫函數(shù)都支持,不過一般開發(fā)的都有.
3.連起你的主機和開發(fā)板,這個你會不?要連兩個:串口(用來控制板子)和以太口(用來下載程序),我們板子上這些外設都有,你要使沒有可以用其他的口代替?zhèn)鞒绦?但串口可是該有的阿!
4.在你主機上編譯程序生成目標代碼,建議用makefile文件來組織你的聯(lián)編關系.
5.把生成代碼下載到目標板執(zhí)行調試.我是用的主機的NFS(網(wǎng)落文件)服務,下載到目標板的.
6.注:目標板是怎么控制的呢?是用串口控制的,可用minicom,設置好你要控制的串口,也應該是你連板子的那個.在命令行里敲上minicom,即進入minicom截面,開啟你的板子,應該就是板子uclinux系統(tǒng)解壓安裝的畫面了.然后用ifconfig eth0…..
配置ip,這個ip就是你板子的ip了,注意與主機一個網(wǎng)段.然后mount -t nfs 主機ip:/uclinux /板子上的一個目錄,就把主機的 uclinux目錄放到板子上了(這么說其實不合理,應該叫掛載). 然后找到你剛才一經(jīng)編譯好的哪個目標代碼執(zhí)行即可.
因不了解你的具體環(huán)境和配置,暫說這些,有問題可再聯(lián)系:)
嵌入式LINUX開發(fā)入門
V1.5
華恒對社區(qū)的貢獻華恒對社區(qū)的貢獻
本文適用于對嵌入式系統(tǒng)沒有概念和經(jīng)驗,
渴望進入嵌入式系統(tǒng)開發(fā)的領域,
但又覺得系統(tǒng)太復雜,要學的東西太多,
感覺完全無從學起,無從下手
的
初級開發(fā)人員
簡述簡述
1,嵌入式系統(tǒng)必須以實踐入門,所以要學習必須購買嵌入式開發(fā)系統(tǒng)
(開發(fā)板或實驗箱),否則永遠只能停留在紙上談兵的階段.
2,學習嵌入式LINUX開發(fā),必須注意學習的方式和方法!就把這個嵌
入式開發(fā)板當作一臺WINDOWS PC,就像用VC一樣在上面做開發(fā)(只是
開發(fā)模式由原來完全的本地開發(fā)變成宿主機–目標板的模式了).
絕對不要去盲目閱讀LINUX內核分析之類的書籍,對于初學者一兩年內
根本用不到這個!就像在WINDOWS下開發(fā)永遠不要關心WINDOWS內核一
個道理,不要因為LINUX內核是源代碼開放的,就非要去研究LINUX內
核.90%的開發(fā)人員關心的還是”外設接口驅動+應用程序(如GUI)”
,所以對于初學者,進入嵌入式LINUX開發(fā)的殿堂,必須邁過如下兩個
臺階:
嵌入式基本C程序開發(fā)及調試方法
基本驅動的概念和開發(fā)調試方法
嵌入式開發(fā)上手學習大綱嵌入式開發(fā)上手學習大綱
安裝配置一臺REDHAT 9的LINUX PC機.宿主機配置(TFTP/NFS)
參見:
通過終端軟件minicom熟悉一下嵌入式系統(tǒng)的基本操作,否則你
根本就不會操作板子!
通過NFS mount的方式,學習用C語言開發(fā)最基本的嵌入式應用程
序,并熟悉嵌入式的調試方法.(HHARM9-EDU實驗1)
熟悉掌握嵌入式LINUX下的編譯方法和技巧,并進一步掌握調試
復雜嵌入式應用程序的方法和技巧.(HHARM9-EDU實驗2,3)
通過NFS mount的方式,學習如何使用一個基本的嵌入式LINUX下
的設備驅動(inod驅動+測試用應用程序),并嘗試著改改看
如何發(fā)生變化和如何調試.(HHARM9-EDU實驗6中斷,
14GPIO/key,AD/DA,I2C等)
進一步深入學習其它的接口技術.(HHARM9-EDU其它剩余實驗)
【注意】
做到這里您一次都不需要燒寫FLASH!
Tips–再談學習的方式方法Tips–再談學習的方式方法
早早安裝一臺REDHAT 9 LINUX的PC,下面這些必須熟悉了解(因為它將是我
們日后開發(fā)更佳的測試伙伴):
telnet/ncftp/tar(xzf/czf)/vi/grep/find/NFS/tftp等常用操作;熟悉了解
LINUX系統(tǒng)的文件目錄構成(/bin/in/etc/home/dev/usr等的意義,系統(tǒng)搜
索路徑PATH因為嵌入式LINUX上和這個完全一樣)(關于這些LINUX常用知識
請參見HHARM2410產(chǎn)品技術手冊附錄B,那里沒有無用的抄襲,而是一線研發(fā)
人員實際的總結)
大致了解LINUX內核源代碼的文件目錄的構成(主要就是drivers目錄,它是我
們最常打交道的驅動的目錄).因為我們對于LINUX下驅動的開發(fā)最重要的工
作學習的方法就是:”搜索+模仿”.大家都知道LINUX是開放源代碼的,但
其實很多人并沒有意識到這個對于我們實際的開發(fā)有什么意義.就像面前擺
了一座寶庫,但卻不知如何去尋寶.我們尋寶的手段就是搜索.對于驅動,
LINUX開放的代碼(drivers目錄+google網(wǎng)絡)里面提供了無數(shù)常見接口芯片
的驅動代碼或模板(如串口serial.c,framebuffer驅動等),我們首先要知道
這些文件在哪個目錄下,找到后就是大致讀一下,找出與自己實際硬件的差
異,以此為基礎修修改改即可.而修改時一個重要的手段就是模仿現(xiàn)有的代
碼!
Tips–再談學習的方式方法Tips–再談學習的方式方法
在嵌入式板卡上做任何稍微復雜些的工作,心里沒底的話,就一定養(yǎng)成先在
REDHAT LINUX PC上測試的好習慣.無論你做GPRS/CDMA/PPP/ADSL撥號還是做
USB無線網(wǎng)卡驅動,還是做SAMBA/VPN/SNMP等協(xié)議軟件,都先在REDHAT LINUX
上配置好,測試通過有了感覺之后再到嵌入式上試,因為ARMLINUX跟REDHAT
LINUX對于我們開發(fā)人員而言幾乎沒有任何區(qū)別!切忌冒進!
不要試圖去通讀CPU的manual,沒有用的,就像不要為了做嵌入式LINUX就要
通讀LINUX內核源代碼分析一個道流.以目前實際的工作為主線,涉及到什么
再去大致了解一下相關內容,例如我們第二步要做MODULES形式的驅動,那么
這時去大致翻翻那本《LINUX驅動開發(fā)》一書的幾頁還是會有些幫助的,但也
沒有必要全部通讀!
嵌入式開發(fā)模式嵌入式開發(fā)模式
【宿主機】
網(wǎng)線
網(wǎng)線
交換機
串口線
HHARM開發(fā)板
假設IP為:192.168.2.120
【目標板】
運行RedhatLinux的PC機
假設IP為:192.168.2.2.122
交叉編譯
之一部分
嵌入式基本C程序開發(fā)和調試
嵌入式基本C程序開發(fā)和調試嵌入式基本C程序開發(fā)和調試
關于Makefile關于Makefile
Makefile就是一個批處理的腳本!通過執(zhí)行make來調用
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
#表示注釋,這是個通用的模板,我們的例子里面只用到一個hello1.c,而
且也不需要鏈接加密庫(libcrypt.a)和數(shù)學庫(libm.a).hello1.c的
內容就不需要寫了吧,就一個printf語句
NFS mount調試方法進階NFS mount調試方法進階
前面./hello的方式用來調試最簡單的主動執(zhí)行的應用程序.還有很多的
應用程序要復雜一些,例如minigui/qt/microwin等GUI系統(tǒng),它除了
可執(zhí)行文件外,還涉及自己的動態(tài)庫libxxx.so;還有另外一些如CGI類
的被動的被其它程序激發(fā)執(zhí)行的程序對于這樣的復雜程序調試,可如下
操作: (細節(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調試帶動態(tài)庫的復雜程序了
注意:
從上可見,板子可以多次mount多個目錄,或者多個不同IP的PC的不同硬盤目錄,甚至可以將
板子上所有的目錄都用PC硬盤上的同類目錄覆蓋掉
同時可以看出這時的目標板就像一臺UNIX主機一樣可以為多個開發(fā)人員提供并行開發(fā)的環(huán)境.
第二部分
基本驅動的概念和開發(fā)調試方法
基本驅動的概念和開發(fā)調試方法基本驅動的概念和開發(fā)調試方法
ARMLINUX不同于uClinux,因為啟動了MMU,所以應用程序不能直接
讀寫物理地址(包括CPU寄存器,
MEMORY,外設芯片內部寄存器等),而必須借助與驅動的形式,切入
內核用ioremap來實現(xiàn)對這些物理地址的訪問.
下面以一個最常見的GPIO操作為例來說明:
就是選擇S3C2410的GPIO_C6口作為一個輸出口線,用戶通過一個應用程序調用驅
動程序來控制這個口線輸出1或者0,即高低電平.
例子由兩部分構成:”驅動(gpio_driv.c)+應用程序(gpio_test.c)”
LINUX下的驅動有兩種形式:
MODULES形式的可動態(tài)加載的驅動(這是LINUX內核一個非常重要
的特點),我們測試用建議都用這種形式的,因為它調試就和普通應用
程序一樣,可以通過NFS mount的方式來調試,非常方便.
靜態(tài)編譯到內核里面的驅動
基本驅動的概念和開發(fā)調試方法基本驅動的概念和開發(fā)調試方法
樣例modules形式驅動的測試用法如下:
NFS mount宿主機后,
inod gpio_driv.o #在板上嵌入式LINUX內核已經(jīng)跑起來之后動態(tài)加載驅動module
mknod/dev/gpiotest c 220 0
./gpio_test#執(zhí)行測試用的應用程序來調用驅動,來驅動IO輸出高低電平
0:set ,1:clear,2: quit :
用戶輸入0,則C6口輸出3.3V高電平;用戶輸入1,則C6口輸出0低電平.
應用程序如何調用驅動以及驅動要注意的一些細節(jié)在下面的詳細代碼中通過注釋
的形式一一說明.
驅動MODULE源代碼驅動MODULE源代碼
#include //FILE: gpio_driv.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define IOPORT_MAJOR 220 //定義主設備號,和前面的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);
驅動MODULE源代碼驅動MODULE源代碼
static structfile_operations gpio_ctl_fops= {
ioctl: gpio_ctl_ioctl,
open: gpio_open,
release: gpio_release,
};
//所有的操作系統(tǒng)將硬件設備當作文件處理,所有外設的操作就封裝在這個file_operations 結構體里面
//就是文件的open/read/write/close等操作,剩余的都放到一個ioctl函數(shù)里面做處理.
int__init gpio_init(void)
{
inti;
//可以看到下面這句向操作系統(tǒng)注冊的函數(shù)里面和前面我們在minicom里面手工創(chuàng)建的設備文件是
//要完全匹配的:mknod/dev/gpiotestc 220 0,這表明創(chuàng)建的是一個字符設備(chrdev),
//主設備號220,次設備號0,因為操作系統(tǒng)不理會”gpiotest”這個設備名字符串的,它只認數(shù)字的主次
//設備號,而應用程序到時是open(“/dev/gpiotest”,xx)的,中間就是通過這兩個數(shù)字聯(lián)系起來的.
register_chrdev(IOPORT_MAJOR, “gpiotest”, &gpio_ctl_fops);
return 0;
}
module_init(gpio_init); //用戶加載該驅動時執(zhí)行inod gpio_driv.o就會自動調用gpio_init函數(shù),它是驅動
//的入口點,相當于應用程序的main函數(shù).
module_exit(gpio_release); //用戶卸載該驅動rmmod gpio_driv時執(zhí)行
驅動MODULE源代碼驅動MODULE源代碼
int gpio_open(struct inode*inode, structfile *filp)
{
intminor;
minor = MINOR(inode->i_rdev);
#if 0 //這里是通常的做法,因為S3C2410的LINUX內核提供了set_gpio_ctrl專用函數(shù),所以不要下面
這樣做了
(void *)(port_addr) = ioremap(0x,0x8);
*(volatile unsigned int*)(port_addr)|=0x;
#endif
//驅動里面在open這個設備的時候設置這個口為輸出(因為GPIO必須設置方向,做輸入還是輸出)
set_gpio_ctrl(GPIO_MODE_OUT | GPIO_C6);
gpio_devices++;
return 0;
}
驅動MODULE源代碼驅動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;
}
基本驅動MODULE的Makefile基本驅動MODULE的Makefile
注意!驅動程序的Makefile和應用程序的參數(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
測試驅動的應用程序測試驅動的應用程序
#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 //這里是通常的做法,因為S3C2410的LINUX內核提供了set_gpio_ctrl專用函數(shù),所以不要下面
這樣做了
(void *)(port_addr) = ioremap(0x,0x8);
*(volatile unsigned int*)(port_addr)|=0x;
#endif
//驅動里面在open這個設備的時候設置這個口為輸出(因為GPIO必須設置方向,做輸入還是輸出)
set_gpio_ctrl(GPIO_MODE_OUT | GPIO_C6);
gpio_devices++;
return 0;
}
18
驅動MODULE源代碼驅動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
基本驅動MODULE的Makefile基本驅動MODULE的Makefile
注意!驅動程序的Makefile和應用程序的參數(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
測試驅動的應用程序測試驅動的應用程序
#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);//應用程序就是這樣調用驅動的
else if(val==1)
ioctl(fd,IOCLEAR,0);//應用程序就是這樣調用驅動的
else if(val==2){
close(fd); …
}
}
21
最后可試試燒寫FLASH了最后可試試燒寫FLASH了
完成自己的小驅動和測試用應用程序后,您可以將自己的初步成就燒寫到板子里去了,具體的燒
寫可參見我們產(chǎn)品手冊或者HHARM FAQ
如何加入到板子的文件系統(tǒng)里
文件系統(tǒng)就是用來存放用戶應用程序的.
HHARM9系列嵌入式LINUX開發(fā)系統(tǒng)的根文件系統(tǒng)采用的是ramdisk.
下面舉例說明用戶如何把自己的hello程序燒寫到板子上去:
先把ramdisk.image.gz解壓后mount -o loop 到一個目錄上,這樣就可以看到ramdisk里面的文
件及目錄內容,這時再把你編譯號的hello這個可執(zhí)行文件復制到這個目錄的bin目錄下面,再
umount這個目錄,再gzip壓縮,這樣你所作的改動就被帶到這個新生成的ramdisk.image.gz文件
里面了,然后你燒寫這個文件就可以在板子上看到你的hello了.
簡單命令序列:注意要自己調整目錄路徑,所有操作均在REDHAT LINUX PC機上完成:
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實驗指導書
參見:華恒ARM9+LINUX+WINCE雙系統(tǒng)嵌入式教學實驗箱
HHARM FAQ
華恒HHARM2410系列產(chǎn)品手冊
可EMAIL至華恒ARM產(chǎn)品系列技術支持信箱:
華恒嵌入式LINUX技術論壇
嵌入式LINUX開發(fā)資源
回答者:bingxiang81 – 經(jīng)理 四級:46
Tips–再談學習的方式方法Tips–再談學習的方式方法
在嵌入式板卡上做任何稍微復雜些的工作,心里沒底的話,就一定養(yǎng)成先在
REDHAT LINUX PC上測試的好習慣.無論你做GPRS/CDMA/PPP/ADSL撥號還是做
USB無線網(wǎng)卡驅動,還是做SAMBA/VPN/SNMP等協(xié)議軟件,都先在REDHAT LINUX
上配置好,測試通過有了感覺之后再到嵌入式上試,因為ARMLINUX跟REDHAT
LINUX對于我們開發(fā)人員而言幾乎沒有任何區(qū)別!切忌冒進!
不要試圖去通讀CPU的manual,沒有用的,就像不要為了做嵌入式LINUX就要
通讀LINUX內核源代碼分析一個道流.以目前實際的工作為主線,涉及到什么
再去大致了解一下相關內容,例如我們第二步要做MODULES形式的驅動,那么
這時去大致翻翻那本《LINUX驅動開發(fā)》一書的幾頁還是會有些幫助的,但也
沒有必要全部通讀!好好看把
建立以Linux系統(tǒng)為基礎的開發(fā)環(huán)境;
配置開發(fā)主機(MINICOM調試嵌入式開發(fā)板、NFS網(wǎng)絡文件系統(tǒng),防火墻);
建立引導裝載程序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等);
建立應用程序的Flash磁盤分區(qū),一般使用JFFS2或YAFFS文件系統(tǒng);
開發(fā)應用程序,應用程序可以放入根文件系統(tǒng)中,也可以放入YAFFS、JFFS2文件系統(tǒng)中;
uclinux 內核移植的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于uclinux 內核移植,uclinux內核移植:打造嵌入式系統(tǒng)的新選擇,單片機與OS區(qū)別在哪,關于Linux,求嵌入式linux開發(fā)詳細流程(步驟)?的信息別忘了在本站進行查找喔。
香港服務器選創(chuàng)新互聯(lián),香港虛擬主機被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機/香港空間。香港虛擬主機特點是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機精選cn2+bgp線路訪問快、穩(wěn)定!
文章名稱:uclinux內核移植:打造嵌入式系統(tǒng)的新選擇(uclinux內核移植)
本文鏈接:http://m.5511xx.com/article/cdphdhi.html


咨詢
建站咨詢
