當前位置:首頁 » 操作系統 » rtems源碼

rtems源碼

發布時間: 2023-03-05 20:30:37

1. 「干貨」嵌入式linux系統移植的四大步驟(上)


在學習系統移植的相關知識,在學習和調試過程中,發現了很多問題,也解決了很多問題,但總是對於我們的開發結果有一種莫名其妙的感覺,糾其原因,主要對於我們的開發環境沒有一個深刻的認識,有時候幾個簡單的命令就可以完成非常復雜的功能,可是我們有沒有想過,為什麼會有這樣的效果?


如果沒有去追問,只是機械地完成,並且看到實驗效果,這樣做其實並沒有真正的掌握系統移植的本質。


在做每一個步驟的時候, 首先問問自己,為什麼要這樣做,然後再問問自己正在做什麼? 搞明白這幾個問題,我覺得就差不多了,以後不管更換什麼平台,什麼晶元,什麼開發環境,你都不會迷糊,很快就會上手。對於嵌入式的學習方法,我個人方法就是:從宏觀上把握(解決為什麼的問題),微觀上研究(解決正在做什麼的問題),下面以自己學習的arm-cortex_a8開發板為目標,介紹下自己的學習方法和經驗。


嵌入式Linux系統移植主要由四大部分組成:


一、搭建交叉開發環境
二、bootloader的選擇和移植
三、kernel的配置、編譯、和移植
四、根文件系統的製作


第一部分:搭建交叉開發環境


先介紹第一分部的內容:搭建交叉開發環境,首先必須得思考兩個問題,什麼是交叉環境? 為什麼需要搭建交叉環境?


先回答第一個問題,在嵌入式開發中,交叉開發是很重要的一個概念,開發的第一個環節就是搭建環境,第一步不能完成,後面的步驟從無談起,這里所說的交叉開發環境主要指的是:在開發主機上(通常是我的pc機)開發出能夠在目標機(通常是我們的開發板)上運行的程序。嵌入式比較特殊的是不能在目標機上開發程序(狹義上來說),因為對於一個原始的開發板,在沒有任何程序的情況下它根本都跑不起來,為了讓它能夠跑起來,我們還必須要藉助pc機進行燒錄程序等相關工作,開發板才能跑起來,這里的pc機就是我們說的開發主機,想想如果沒有開發主機,我們的目標機基本上就是無法開發,這也就是電子行業的一句名言:搞電子,說白了,就是玩電腦!


然後回答第二個問題,為什麼需要交叉開發環境?主要原因有以下幾點:


原因 1: 嵌入式系統的硬體資源有很多限制,比如cpu主頻相對較低,內存容量較小等,想想讓幾百MHZ主頻的MCU去編譯一個Linux kernel會讓我們等的不耐煩,相對來說,pc機的速度更快,硬體資源更加豐富,因此利用pc機進行開發會提高開發效率。


原因2: 嵌入式系統MCU體系結構和指令集不同,因此需要安裝交叉編譯工具進行編譯,這樣編譯的目標程序才能夠在相應的平台上比如:ARM、MIPS、 POWEPC上正常運行。


交叉開發環境的硬體組成主要由以下幾大部分


1.開發主機
2.目標機(開發板)
3.二者的鏈接介質,常用的主要有3種方式:(1)串口線 (2)USB線 (3)網線


對應的硬體介質,還必須要有相應的軟體「介質」支持:


1.對於串口,通常用的有串口調試助手,putty工具等,工具很多,功能都差不多,會用一兩款就可以;


2.對於USB線,當然必須要有USB的驅動才可以,一般晶元公司會提供,比如對於三星的晶元,USB下載主要由DNW軟體來完成;


3.對於網線,則必須要有網路協議支持才可以, 常用的服務主要兩個


第一:tftp服務:

主要用於實現文件的下載,比如開發調試的過程中,主要用tftp把要測試的bootloader、kernel和文件系統直接下載到內存中運行,而不需要預先燒錄到Flash晶元中,一方面,在測試的過程中,往往需要頻繁的下載,如果每次把這些要測試的文件都燒錄到Flash中然後再運行也可以,但是缺點是:過程比較麻煩,而且Flash的擦寫次數是有限的;另外一方面:測試的目的就是把這些目標文件載入到內存中直接運行就可以了,而tftp就剛好能夠實現這樣的功能,因此,更沒有必要把這些文件都燒錄到Flash中去。


第二: nfs服務:

主要用於實現網路文件的掛載,實際上是實現網路文件的共享,在開發的過程中,通常在系統移植的最後一步會製作文件系統,那麼這是可以把製作好的文件系統放置在我們開發主機PC的相應位置,開發板通過nfs服務進行掛載,從而測試我們製作的文件系統是否正確,在整個過程中並不需要把文件系統燒錄到Flash中去,而且掛載是自動進行掛載的,bootload啟動後,kernel運行起來後會根據我們設置的啟動參數進行自動掛載,因此,對於開發測試來講,這種方式非常的方便,能夠提高開發效率。


另外,還有一個名字叫 samba 的服務也比較重要,主要用於文件的共享,這里說的共享和nfs的文件共享不是同一個概念,nfs的共享是實現網路文件的共享,而samba實現的是開發主機上 Windows主機和Linux虛擬機之間的文件共享,是一種跨平台的文件共享 ,方便的實現文件的傳輸。


以上這幾種開發的工具在嵌入式開發中是必備的工具,對於嵌入式開發的效率提高做出了偉大的貢獻,因此,要對這幾個工具熟練使用,這樣你的開發效率會提高很多。等測試完成以後,就會把相應的目標文件燒錄到Flash中去,也就是等發布產品的時候才做的事情,因此對於開發人員來說,所有的工作永遠是測試。


通過前面的工作,我們已經准備好了交叉開發環境的硬體部分和一部分軟體,最後還缺少交叉編譯器,讀者可能會有疑問,為什麼要用交叉編譯器?前面已經講過,交叉開發環境必然會用到交叉編譯工具,通俗地講就是在一種平台上編譯出能運行在體系結構不同的另一種平台上的程序,開發主機PC平台(X86 CPU)上編譯出能運行在以ARM為內核的CPU平台上的程序,編譯得到的程序在X86 CPU平台上是不能運行的,必須放到ARM CPU平台上才能運行,雖然兩個平台用的都是Linux系統。相對於交叉編譯,平常做的編譯叫本地編譯,也就是在當前平台編譯,編譯得到的程序也是在本地執行。用來編譯這種跨平台程序的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標機上運行的程序,必須要用交叉編譯工具鏈來完成。

這里又有一個問題,不就是一個交叉編譯工具嗎?為什麼又叫交叉工具鏈呢?原因很簡單,程序不能光編譯一下就可以運行,還得進行匯編和鏈接等過程,同時還需要進行調試,對於一個很大工程,還需要進行工程管理等等,所以,這里 說的交叉編譯工具是一個由 編譯器、連接器和解釋器 組成的綜合開發環境,交叉編譯工具鏈主要由binutils(主要包括匯編程序as和鏈接程序ld)、gcc(為GNU系統提供C編譯器)和glibc(一些基本的C函數和其他函數的定義) 3個部分組成。有時為了減小libc庫的大小,也可以用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。

那麼,如何得到一個交叉工具鏈呢?是從網上下載一個「程序」然後安裝就可以使用了嗎?回答這個問題之前先思考這樣一個問題,我們的交叉工具鏈顧名思義就是在PC機上編譯出能夠在我們目標開發平台比如ARM上運行的程序,這里就又有一個問題了,我們的ARM處理器型號非常多,難道有專門針對我們某一款的交叉工具鏈嗎?若果有的話,可以想一想,這么多處理器平台,每個平台專門定製一個交叉工具鏈放在網路上,然後供大家去下載,想想可能需要找很久才能找到適合你的編譯器,顯然這種做法不太合理,且浪費資源!因此,要得到一個交叉工具鏈,就像我們移植一個Linux內核一樣,我們只關心我們需要的東西,編譯我們需要的東西在我們的平台上運行,不需要的東西我們不選擇不編譯,所以,交叉工具鏈的製作方法和系統移植有著很多相似的地方,也就是說,交叉開發工具是一個支持很多平台的工具集的集合(類似於Linux源碼),然後我們只需從這些工具集中找出跟我們平台相關的工具就行了,那麼如何才能找到跟我們的平台相關的工具,這就是涉及到一個如何製作交叉工具鏈的問題了。


通常構建交叉工具鏈有如下三種方法:


方法一 : 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用下列的方法二構建交叉工具鏈。


方法二: 通過Crosstool-ng腳本工具來實現一次編譯,生成交叉編譯工具鏈,該方法相對於方法一要簡單許多,並且出錯的機會也非常少,建議大多數情況下使用該方法構建交叉編譯工具鏈。


方法三 : 直接通過網上下載已經製作好的交叉編譯工具鏈。該方法的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的,沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名其妙的錯誤,建議讀者慎用此方法。

crosstool-ng是一個腳本工具,可以製作出適合不同平台的交叉編譯工具鏈,在進行製作之前要安裝一下軟體:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool腳本工具可以在http://ymorin.is-a-geek.org/projects/crosstool下載到本地,然後解壓,接下來就是進行安裝配置了,這個配置優點類似內核的配置。主要的過程有以下幾點:
1. 設定源碼包路徑和交叉編譯器的安裝路徑
2. 修改交叉編譯器針對的構架

3. 增加編譯時的並行進程數,以增加運行效率,加快編譯,因為這個編譯會比較慢。
4. 關閉JAVA編譯器 ,減少編譯時間
5. 編譯
6. 添加環境變數
7. 刷新環境變數。
8. 測試交叉工具鏈

到此,嵌入式Linux系統移植四大部分的第一部分工作全部完成,接下來可以進行後續的開發了。



第二部分:bootloader的選擇和移植


01 Boot Loader 概念


就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用操作系統內核准備好正確的環境,他就是所謂的引導載入程序(Boot Loader)。


02 為什麼系統移植之前要先移植BootLoader?


BootLoader的任務是引導操作系統,所謂引導操作系統,就是啟動內核,讓內核運行就是把內核載入到內存RAM中去運行,那先問兩個問題:第一個問題,是誰把內核搬到內存中去運行?第二個問題:我們說的內存是SDRAM,大家都知道,這種內存和SRAM不同,最大的不同就是SRAM只要系統上電就可以運行,而SDRAM需要軟體進行初始化才能運行,那麼在把內核搬運到內存運行之前必須要先初始化內存吧,那麼內存是由誰來初始化的呢?其實這兩件事情都是由bootloader來乾的,目的是為內核的運行准備好軟硬體環境,沒有bootloadr我們的系統當然不能跑起來。

03 bootloader的分類


首先更正一個錯誤的說法,很多人說bootloader就是U-boot,這種說法是錯誤的,確切來說是u-boot是bootloader的一種。也就是說bootloader具有很多種類,


由上圖可以看出,不同的bootloader具有不同的使用范圍,其中最令人矚目的就是有一個叫U-Boot的bootloader,是一個通用的引導程序,而且同時支持X86、ARM和PowerPC等多種處理器架構。U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目,是由德國DENX小組開發的用於多種嵌入式CPU的bootloader程序,對於Linux的開發,德國的u-boot做出了巨大的貢獻,而且是開源的。

u-boot具有以下特點:

① 開放源碼;
② 支持多種嵌入式操作系統內核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 較高的可靠性和穩定性;
⑤ 高度靈活的功能設置,適合U-Boot調試、操作系統不同引導要求、產品發布等;
⑥ 豐富的設備驅動源碼,如串口、乙太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
⑦ 較為豐富的開發調試文檔與強大的網路技術支持;
其實,把u-boot可以理解為是一個小型的操作系統。

04 u-boot的目錄結構


* board 目標板相關文件,主要包含SDRAM、FLASH驅動;
* common 獨立於處理器體系結構的通用代碼,如內存大小探測與故障檢測;
* cpu 與處理器相關的文件。如mpc8xx子目錄下含串口、網口、LCD驅動及中斷初始化等文件;
* driver 通用設備驅動,如CFI FLASH驅動(目前對INTEL FLASH支持較好)
* doc U-Boot的說明文檔;
* examples可在U-Boot下運行的示常式序;如hello_world.c,timer.c;
* include U-Boot頭文件;尤其configs子目錄下與目標板相關的配置頭文件是移植過程中經常要修改的文件;
* lib_xxx 處理器體系相關的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結構相關的文件;
* net 與網路功能相關的文件目錄,如bootp,nfs,tftp;
* post 上電自檢文件目錄。尚有待於進一步完善;
* rtc RTC驅動程序;
* tools 用於創建U-Boot S-RECORD和BIN鏡像文件的工具;

05 u-boot的工作模式


U-Boot的工作模式有 啟動載入模式和下載模式 。啟動載入模式是Bootloader的正常工作模式,嵌入式產品發布時,Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統從FLASH中載入到SDRAM中運行,整個過程是自動的。 下載模式 就是Bootloader通過某些通信手段將內核映像或根文件系統映像等從PC機中下載到目標板的SDRAM中運行,用戶可以利用Bootloader提供的一些令介面來完成自己想要的操作,這種模式主要用於測試和開發。

06 u-boot的啟動過程


大多數BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴於cpu體系結構的代碼(如設備初始化代碼等)通常都放在stage1且可以用匯編語言來實現,而stage2則通常用c語言來實現,這樣可以實現復雜的功能,而且有更好的可讀性和移植性。


1、 stage1(start.s代碼結構)
U-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成,其主要代碼部分如下:
(1) 定義入口。由於一個可執行的image必須有一個入口點,並且只能有一個全局入口,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設置異常向量(exception vector)。
(3)設置CPU的速度、時鍾頻率及中斷控制寄存器。
(4)初始化內存控制器 。
(5)將rom中的程序復制到ram中。
(6)初始化堆棧 。
(7)轉到ram中執行,該工作可使用指令ldrpc來完成。


2、 stage2(C語言代碼部分)

lib_arm/board.c中的start armboot是C語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot)的主函數,該函數主要完成如下操作:
(1)調用一系列的初始化函數。
(2)初始化flash設備。
(3)初始化系統內存分配函數。
(4)如果目標系統擁有nand設備,則初始化nand設備。
(5)如果目標系統有顯示設備,則初始化該類設備。
(6)初始化相關網路設備,填寫ip,c地址等。
(7)進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然後進行相應的工作。

07 基於cortex-a8的s5pc100bootloader啟動過程分析


s5pc100支持兩種啟動方式,分別為USB啟動方式和NandFlash啟動方式:


1. S5PC100 USB啟動過程

[1] A8 reset, 執行iROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到4對面),判斷從哪裡啟動(USB)
[3] iROM中的程序會初始化USB,然後等待PC機下載程序
[4] 利用DNW程序,從PC機下載SDRAM的初始化程序到iRAM中運行,初始化SDRAM
[5] SDRAM初始化完畢,iROM中的程序繼續接管A8, 然後等待PC下載程序(BootLoader)
[6] PC利用DNW下載BootLoader到SDRAM
[7] 在SDRAM中運行BootLoader

2. S5PC100 Nandflash啟動過程

[1] A8 reset, 執行IROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到靠4那邊),判斷從哪裡啟動(Nandflash)
[3] iROM中的程序驅動Nandflash
[4] iROM中的程序會拷貝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然後拷貝完整的BootLoader到SDRAM並運行
[6] BootLoader拷貝內核到SDRAM,並運行它
[7] 內核運行起來後,掛載rootfs,並且運行系統初始化腳本

08 u-boot移植(基於cortex_a8的s5pc100為例)


1.建立自己的平台

(1).下載源碼包2010.03版本,比較穩定
(2).解壓後添加我們自己的平台信息,以smdkc100為參考版,移植自己s5pc100的開發板
(3).修改相應目錄的文件名,和相應目錄的Makefile,指定交叉工具鏈。
(4).編譯
(5).針對我們的平台進行相應的移植,主要包括修改SDRAM的運行地址,從0x20000000
(6).「開關」相應的宏定義
(7).添加Nand和網卡的驅動代碼
(8).優化go命令
(9).重新編譯 make distclean(徹底刪除中間文件和配置文件) make s5pc100_config(配置我們的開發板) make(編譯出我們的u-boot.bin鏡像文件)
(10).設置環境變數,即啟動參數,把編譯好的u-boot下載到內存中運行,過程如下:
1. 配置開發板網路
ip地址配置:
$setenv ipaddr 192.168.0.6 配置ip地址到內存的環境變數
$saveenv 保存環境變數的值到nandflash的參數區

網路測試:
在開發開發板上ping虛擬機:
$ ping 192.168.0.157(虛擬機的ip地址)

如果網路測試失敗,從下面幾個方面檢查網路:
1. 網線連接好
2. 開發板和虛擬機的ip地址是否配置在同一個網段
3. 虛擬機網路一定要採用橋接(VM--Setting-->option)
4. 連接開發板時,虛擬機需要設置成 靜態ip地址

2. 在開發板上,配置tftp伺服器(虛擬機)的ip地址
$setenv serverip 192.168.0.157(虛擬機的ip地址)
$saveenv
3. 拷貝u-boot.bin到/tftpboot(虛擬機上的目錄)
4. 通過tftp下載u-boot.bin到開發板內存
$ tftp 20008000(內存地址即可) u-boot.bin(要下載的文件名)

如果上面的命令無法正常下載:
1. serverip配置是否正確
2. tftp服務啟動失敗,重啟tftp服務
#sudo service tftpd-hpa restart

5. 燒寫u-boot.bin到nandflash的0地址
$nand erase 0(起始地址) 40000(大小) 擦出nandflash 0 - 256k的區域
$nand write 20008000((緩存u-boot.bin的內存地址) 0(nandflash上u-boot的位置) 40000(燒寫大小)

6. 切換開發板的啟動方式到nandflash
1. 關閉開發板
2. 把SW1的開關4撥到4的那邊
3. 啟動開發板,它就從nandflash啟動

2. 嵌入式操作系統有哪些

常見的嵌入式操作系統有WINDOWS CE、iOS、Linux、Android、FreeRTOS。

1、WINDOWS CE,WINDOWS CE是微軟開發的一個開放的、可升級的32位嵌入式操作系統,是基於掌上型電腦類的電子設備操作系統。Windows CE具有模塊化、結構化和基幹Win32應用程序接日以及與處理器無關等特點。

2、iOS,蘋果的iOS系統可以說是蘋果公司賴以生存的核心技術,在iPhone、iPad、iTouch、iPod等設備上運行的iOS具備了嵌入式的全部特性。

3、Linux,Linux是一個類似於Unix的操作系統。Linux從1991年問世到現在,短短10年的時間內已發展成為一個功能強大、設計完善的操作系統,Linux系統不僅能夠運行於PC平台,還在嵌入式系統方面大放光芒,在各種嵌人式Linux OS迅速發展的狀況下,Linux OS逐漸形成了可與Windows CE等EOS進行抗衡的局面。

4、Android,Android是一個包括操作系統,中間件以及一些重要應用程序的專門針對移動設備的層次結構的軟體集。Android操作系統內置了一部分應用程序,包括電子郵件客戶端、SMS程序、日歷、地圖、瀏覽器、通訊錄以及其他的程序。

5、FreeRTOS,FreeRTOS是一個迷你操作系統內核的小型嵌入式系統。功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能等,可基本滿足較小系統的需要。

3. linux mkimages 文件在哪

下載:
兩種途徑得到mkImage工具uImage,
解決方法:
方法一:

安裝mkimage工具,載ubuntu11.10下執行以下命令進行安裝:
#sudo apt-get install uboot-mkimage
方法二:
編譯uboot源碼,編譯成功後載uboot/tools目錄下會生成mkimgage工具,將mkimage工具拷貝到/usr/bin/目錄下即可。

使用:

uboot源代碼的tools/目錄下有mkimage工具,這個工具可以用來製作不壓縮或者壓縮的多種可啟動映象文件。
mkimage在製作映象文件的時候,是在原來的可執行映象文件的前面加上一個0x40位元組的頭,記錄參數所指定的信息,這樣uboot才能識別這個映象是針對哪個CPU體系結構的,哪個OS的,哪種類型,載入內存中的哪個位置, 入口點在內存的那個位置以及映象名是什麼
root@Glym:/tftpboot# ./mkimage
Usage: ./mkimage -l image
-l ==> list image header information
./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
參數說明:
-A 指定CPU的體系結構:
取值 表示的體系結構
alpha Alpha
arm A RM
x86 Intel x86
ia64 IA64
mips MIPS
mips64 MIPS 64 Bit
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 Bit
m68k MC68000
-O 指定操作系統類型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象類型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
-C 指定映象壓縮方式,可以取以下值:
none 不壓縮
gzip 用gzip的壓縮方式
bzip2 用bzip2的壓縮方式
-a 指定映象在內存中的載入地址,映象下載到內存中時,要按照用mkimage製作映象時,這個參數所指定的地址值來下載
-e 指定映象運行的入口點地址,這個地址就是-a參數指定的值加上0x40(因為前面有個mkimage添加的0x40個位元組的頭)
-n 指定映象名
-d 指定製作映象的源文件

U-BOOT下使用bootm引導內核方法

一、在開始之前先說明一下bootm相關的東西。
1、 首先說明一下,S3C2410架構下的bootm只對sdram中的內核鏡像文件進行操作(好像AT91架構提供了一段從flash復制內核鏡像的代碼, 不過針對s3c2410架構就沒有這段代碼,雖然可以在u-boot下添加這段代碼,不過好像這個用處不大),所以請確保你的內核鏡像下載到sdram 中,或者在bootcmd下把flash中的內核鏡像復制到sdram中。
2、-a參數後是內核的運行地址,-e參數後是入口地址。

3、
1)如果我們沒用mkimage對內核進行處理的話,那直接把內核下載到0x30008000再運行就行,內核會自解壓運行(不過內核運行需要一個tag來傳遞參數,而這個tag建議是由bootloader提供的,在u-boot下默認是由bootm命令建立的)。

2)如果使用mkimage生成內核鏡像文件的話,會在內核的前頭加上了64byte的信息,供建立tag之用。bootm命令會首先判斷bootm xxxx 這個指定的地址xxxx是否與-a指定的載入地址相同。
(1)如果不同的話會從這個地址開始提取出這個64byte的頭部,對其進行分析,然後把去掉頭部的內核復制到-a指定的load地址中去運行之
(2)如果相同的話那就讓其原封不同的放在那,但-e指定的入口地址會推後64byte,以跳過這64byte的頭部。

二、好,接著介紹使用mkimage生成鏡像文件並下載運行的方法。

方法一、
1、首先,用u-boot/tools/mkimage這個工具為你的內核加上u-boot引導所需要的文件頭,具體做法如下:
[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
Image Name: linux-2.6.14
Created: Fri Jan 12 17:14:50 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point: 0x30008000
這里解釋一下參數的意義:
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
2 、下載內核
U-Boot 1.1.3 (Jan 12 2007 - 16:16:36)
U-Boot code: 33F80000 -> 33F9BAC0 BSS: -> 33F9FBAC
RAM Configuration:
Bank #0: 30000000 64 MB
Nor Flash: 512 kB
Nand Flash: 64 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
sbc2410=>tftp 0x31000000 zImage.img
TFTP from server 192.168.1.115; our IP address is 192.168.1.128
Filename 'zImage.img'.
Load address: 0x31000000
Loading: #################################################################
#################################################################
#################################################################
####################################################
done
Bytes transferred = 1263324 (1346dc hex)

3.運行
sbc2410=>bootm 0x31000000
## Booting image at 31000000 ...
Image Name: linun-2.6.14
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1263260 Bytes = 1.2 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing Linux.............................................................Linux version 2.6.14 (root@luofuchong) (gcc version 3.4.1) #21 Fri Oct 20 17:206CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)
Machine: SMDK2410
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410A (id 0x32410002)
S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz
S3C2410 Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
USB Control, (c) 2006 sbc2410
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Built 1 zonelists
Kernel command line: console="ttySAC0" root="/dev/nfs" nfsroot="192".168.1.115:/frien"irq: clearing subpending status 00000002
PID hash table entries: 512 (order: 9, 8192 bytes)
timer tcon="00500000", tcnt a509, tcfg 00000200,00000000, usec 00001e4c
Console: colour mmy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 64MB = 64MB total
Memory: 62208KB available (1924K code, 529K data, 108K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
softlockup thread 0 started up.
NET: Registered protocol family 16
S3C2410: Initialising architecture
SCSI subsystem initialized
usbcore: registered new driver usbfs
usbcore: registered new driver hub
S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics
DMA channel 0 at c4800000, irq 33
DMA channel 1 at c4800040, irq 34
DMA channel 2 at c4800080, irq 35
DMA channel 3 at c48000c0, irq 36
NetWinder Floating Point Emulator V0.97 (double precision)
devfs: 2004-01-31 Richard Gooch ([email protected])
devfs: devfs_debug: 0x0
devfs: boot_options: 0x1
yaffs Oct 18 2006 12:39:51 Installing.
Console: switching to colour frame buffer device 30x40
fb0: s3c2410fb frame buffer device
fb1: Virtual frame buffer device, using 1024K of video memory
led driver initialized
s3c2410 buttons successfully loaded
s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410
s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410
s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410
io scheler noop registered
io scheler anticipatory registered
io scheler deadline registered
io scheler cfq registered
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
usbcore: registered new driver ub
Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)
eth0: CS8900A rev E at 0xe0000300 irq="53", no eeprom , addr: 08: 0:3E:26:0A:5B
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2410-nand: mapped registers at c4980000
s3c2410-nand: timing: Tacls 10ns, Twrph0 30ns, Twrph1 10ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bi)Scanning device for bad blocks
Bad eraseblock 1884 at 0x01d70000
Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00020000 : "vivi"
0x00020000-0x00030000 : "param"
0x00030000-0x00200000 : "kernel"
0x00200000-0x04000000 : "root"
usbmon: debugfs is not available
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
usbcore: registered new driver usbmouse
drivers/usb/input/usbmouse.c: v1.6:USB HID Boot Protocol mouse driver
mice: PS/2 mouse device common for all mice
s3c2410 TouchScreen successfully loaded
UDA1341 audio driver initialized
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 2, 16384 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
TCP bic registered
NET: Registered protocol family 1
IP-Config: Complete:
device=eth0, addr="192".168.1.128, mask="255".255.255.0, gw="192".168.1.1,
host="luofuchong", domain=, nis-domain=(none),
bootserver="192".168.1.1, rootserver="192".168.1.115, rootpath=
Looking up port of RPC 100003/2 on 192.168.1.115
Looking up port of RPC 100005/1 on 192.168.1.115
VFS: Mounted root (nfs filesystem).
Mounted devfs on /dev
Freeing init memory: 108K
init started: BusyBox v1.1.3 (2006.09.20-14:52+0000) multi-call binary
Starting pid 696, console /dev/tts/0: '/etc/init.d/rcS'
Please press Enter to activate this console.

方法二、
1、首先,用u-boot/tools/mkimage這個工具為你的內核加上u-boot引導所需要的文件頭,具體做法如下:
[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
Image Name: linux-2.6.14
Created: Fri Jan 12 17:14:50 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point: 0x30008040

2 、下載內核
U-Boot 1.1.3 (Jan 12 2007 - 16:16:36)
U-Boot code: 33F80000 -> 33F9BAC0 BSS: -> 33F9FBAC
RAM Configuration:
Bank #0: 30000000 64 MB
Nor Flash: 512 kB
Nand Flash: 64 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
sbc2410=>tftp 0x30008000 zImage.img
TFTP from server 192.168.1.115; our IP address is 192.168.1.128
Filename 'zImage.img'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
####################################################
done
Bytes transferred = 1263324 (1346dc hex)

3.運行
sbc2410=>bootm 0x30008000
## Booting image at 30008000 ...
Image Name: linux-2.6.14
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1261056 Bytes = 1.2 MB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
XIP Kernel Image ... OK

4. 介紹幾種主流嵌入式操作系統的特點,並分析比較 哥們,我現在糾結這個問題,可以給點指點嗎

如果你是學習階段的話,那LINUX和UCOS-II是比較合適的
uc/os和uclinux操作系統是兩種性能優良源碼公開且被廣泛應用的的免費嵌入式操作系統,可以作為研究實時操作系統和非實時操作系統的典範。本文通過對 uc/os和uclinux的對比,分析和總結了嵌入式操作系統應用中的若乾重要問題,歸納了嵌入式系統開發中操作系統的選型依據。
兩種開源嵌入式操作系統介紹
uc/os和uclinux操作系統,是當前得到廣泛應用的兩種免費且公開源碼的嵌入式操作系統。uc/os適合小型控制系統,具有執行效率高、佔用空間小、實時性能優良和可擴展性強等特點,最小內核可編譯至2k。uclinux則是繼承標准linux 的優良特性,針對嵌入式處理器的特點設計的一種操作系統,具有內嵌網路協議、支持多種文件系統,開發者可利用標准linux先驗知識等優勢。其編譯後目標文件可控制在幾百k量級。
uc/os是一種免費公開源代碼、結構小巧、具有可剝奪實時內核的實時操作系統。其內核提供任務調度與管理、時間管理、任務間同步與通信、內存管理和中斷服務等功能。
uclinux是一種優秀的嵌入式linux版本。uclinux是micro-conrol-linux的縮寫。同標准linux相比,它集成了標准linux操作系統的穩定性、強大網路功能和出色的文件系統等主要優點。但是由於沒有mmu(內存管理單元),其多任務的實現需要一定技巧。
兩種嵌入式操作系統主要性能比較
嵌入式操作系統是嵌入式系統軟硬體資源的控制中心,它以盡量合理的有效方法組織多個用戶共享嵌入式系統的各種資源。其中用戶指的是系統程序之上的所有軟體。所謂合理有效的方法,指的就是操作系統如何協調並充分利用硬體資源來實現多任務。復雜的操作系統都支持文件系統,方便組織文件並易於對其規范化操作。
嵌入式操作系統還有一個特點就是針對不同的平台,系統不是直接可用的,一般需要經過針對專門平台的移植操作系統才能正常工作。進程調度、文件系統支持和系統移植是在嵌入式操作系統實際應用中最常見的問題,下文就從這幾個角度入手對uc/os和uclinux進行分析比較。
進程調度
任務調度主要是協調任務對計算機系統內資源(如內存、i/o設備、cpu)的爭奪使用。進程調度又稱為cpu調度,其根本任務是按照某種原則為處於就緒狀態的進程分配cpu。由於嵌入式系統中內存和i/o設備一般都和cpu同時歸屬於某進程,所以任務調度和進程調度概念相近,很多場合不加區分,下文中提到的任務其實就是進程的概念。
進程調度可分為"剝奪型調度"和"非剝奪型調度"兩種基本方式。所謂"非剝奪型調度"是指:一旦某個進程被調度執行,則該進程一直執行下去直至該進程結束,或由於某種原因自行放棄cpu進入等待狀態,才將cpu重新分配給其他進程。所謂"剝奪型調度"是指:一旦就緒狀態中出現優先權更高的進程,或者運行的進程已用滿了規定的時間片時,便立即剝奪當前進程的運行(將其放回就緒狀態),把cpu分配給其他進程
作為實時操作系統,uc/os是採用的可剝奪型實時多任務內核。可剝奪型的實時內核在任何時候都運行就緒了的最高優先順序的任務。uc/os中最多可以支持64 個任務,分別對應優先順序0~63,
其中0為最高優先順序。調度工作的內容可以分為兩部分:最高優先順序任務的尋找和任務切換。
其最高優先順序任務的尋找是通過建立就緒任務表來實現的。uc/os中的每一個任務都有獨立的堆棧空間,並有一個稱為任務控制塊tcb(task control block)數據結構,其中第一個成員變數就是保存的任務堆棧指針。任務調度模塊首先用變數 ostcbhighrdy記錄當前最高級就緒任務的tcb地址,然後調用os_task_sw() 函數來進行任務切換。
uclinux的進程調度沿用了linux的傳統,系統每隔一定時間掛起進程,同時系統產生快速和周期性的時鍾計時中斷,並通過調度函數(定時器處理函數)決定進程什麼時候擁有它的時間片。然後進行相關進程切換,這是通過父進程調用fork 函數生成子進程來實現的。
uclinux系統fork調用完成後,要麼子進程代替父進程執行(此時父進程已經 sleep),直到子進程調用exit退出;要麼調用exec執行一個新的進程,這個時候產生可執行文件的載入,即使這個進程只是父進程的拷貝,這個過程也不可避免。當子進程執行exit或exec後,子進程使用wakeup把父進程喚醒,使父進程繼續往下執行。
uclinux由於沒有mmu管理存儲器,其對內存的訪問是直接的,所有程序中訪問的地址都是實際的物理地址。操作系統隊內存空間沒有保護,各個進程實際上共享一個運行空間。這就需要實現多進程時進行數據保護,也導致了用戶程序使用的空間可能佔用到系統內核空間,這些問題在編程時都需要多加註意,否則容易導致系統崩潰。
由上述分析可以得知,uc/os內核是針對實時系統的要求設計實現的,相對簡單,可以滿足較高的實時性要求。而uclinux則在結構上繼承了標准linux的多任務實現方式,僅針對嵌入式處理器特點進行改良。其要實現實時性效果則需要使系統在實時內核的控制下運行,rt-linux就是可以實現這一個功能的一種實時內核。
文件系統
所謂文件系統是指負責存取和管理文件信息的機構,也可以說是負責文件的建立、撤銷、組織、讀寫、修改、復制及對文件管理所需要的資源(如目錄表、存儲介質等)實施管理的軟體部分。
uc/os是面向中小型嵌入式系統的,如果包含全部功能(信號量、消息郵箱、消息隊列及相關函數),編譯後的uc/os內核僅有6~10kb,所以系統本身並沒有對文件系統的支持。但是uc/os具有良好的擴展性能,如果需要的話也可自行加入文件系統的內容。
uclinux則是繼承了linux完善的文件系統性能。其採用的是romfs文件系統,這種文件系統相對於一般的ext2文件系統要求更少的空間。空間的節約來自於兩個方面,首先內核支持romfs文件系統比支持ext2文件系統需要更少的代碼,其次romfs文件系統相對簡單,在建立文件系統超級塊(superblock)需要更少的存儲空間。romfs文件系統不支持動態擦寫保存,對於系統需要動態保存的數據採用虛擬ram盤的方法進行處理(ram盤將採用ext2文件系統)。
uclinux還繼承了linux網路操作系統的優勢,可以很方便的支持網路文件系統且內嵌tcp/ip協議,這為uclinux開發網路接入設備提供了便利。
由兩種操作系統對文件系統的支持可知,在復雜的需要較多文件處理的嵌入式系統中uclinux是一個不錯的選擇。而uc/os則主要適合一些控制系統。
操作系統的移植
嵌入式操作系統移植的目的是指使操作系統能在某個微處理器或微控制器上運行。uc/os和uclinux都是源碼公開的操作系統,且其結構化設計便於把與處理器相關的部分分離出來,所以被移植到新的處理器上是可能的。
以下對兩種系統的移植分別予以說明。
(1)uc/os的移植
要移植uc/os,目標處理器必須滿足以下要求;
·處理器的c編譯器能產生可重入代碼,且用c語言就可以打開和關閉中斷;
·處理器支持中斷,並能產生定時中斷;
·處理器支持足夠的ram(幾k位元組),作為多任務環境下的任務堆棧;
·處理器有將堆棧指針和其他cpu寄存器讀出和存儲到堆棧或內存中的指令。
在理解了處理器和c編譯器的技術細節後,uc/os的移植只需要修改與處理器相關的代碼就可以了。
具體有如下內容:
·os_cpu.h中需要設置一個常量來標識堆棧增長方向;
·os_cpu.h中需要聲明幾個用於開關中斷和任務切換的宏;
·os_cpu.h中需要針對具體處理器的字長重新定義一系列數據類型;
·os_cpu_a.asm需要改寫4個匯編語言的函數;
·os_cpu_c.c需要用c語言編寫6個簡單函數;
·修改主頭文件include.h,將上面的三個文件和其他自己的頭文件加入。
(2)uclinux的移植
由於uclinux其實是linux針對嵌入式系統的一種改良,其結構比較復雜,相對 uc/os,uclinux的移植也復雜得多。一般而言要移植uclinux,目標處理器除了應滿足上述uc/os應滿足的條件外,還需要具有足夠容量(幾百k位元組以上)外部rom和ram。
uclinux的移植大致可以分為3個層次:
·結構層次的移植,如果待移植處理器的結構不同於任何已經支持的處理器結構,則需要修改linux/arch目錄下相關處理器結構的文件。雖然uclinux內核代碼的大部分是獨立於處理器和其體系結構的,但是其最低級的代碼也是特定於各個系統的。這主要表現在它們的中斷處理上下文、內存映射的維護、任務上下文和初始化過程都是獨特的。這些例行程序位於linux/arch/目錄下。由於linux所支持體系結構的種類繁多,所以對一個新型的體系,其低級常式可以模仿與其相似的體系常式編寫。
·平台層次的移植,如果待移植處理器是某種uclinux已支持體系的分支處理器,則需要在相關體系結構目錄下建立相應目錄並編寫相應代碼。如mc68ez328就是基於無mmu的m68k內核的。此時的移植需要創建 linux/arch/m68knommu/platform/ mc68ez328目錄並在其下編寫跟蹤程序(實現用戶程序到內核函數的介面等功能)、中斷控制調度程序和向量初始化程序等。
·板級移植,如果你所用處理器已被uclinux支持的話,就只需要板級移植了。板級移植需要在linux/arch/?platform/中建立一個相應板的目錄,再在其中建立相應的啟動代碼crt0_rom.s或crt0_ram.s和鏈接描述文檔rom.ld或ram.ld就可以了。板級移植還包括驅動程序的編寫和環境變數設置等內容。
結語
通過對uc/os和uclinux的比較,可以看出這兩種操作系統在應用方面各有優劣。 uc/os佔用空間少,執行效率高,實時性能優良,且針對新處理器的移植相對簡單。uclinux則佔用空間相對較大,實時性能一般,針對新處理器的移植相對復雜。但是,uclinux具有對多種文件系統的支持能力、內嵌了tcp/ip協議,可以借鑒linux豐富的資源,對一些復雜的應用,uclinux具有相當優勢。例如cisco 公司的 2500/3000/4000 路由器就是基於uclinux操作系統開發的。總之,操作系統的選擇是由嵌入式系統的需求決定的。簡單的說就是,小型控制系統可充分利用uc/os小巧且實時性強的優勢,如果開發pda和互聯網連接終端等較為復雜的系統則uclinux是不錯的選擇。

還有就是如果從開發的工具方便好用,易用的角度來看,那些收費的系統用起來更爽一些

5. 嵌入式操作系統是什麼

引用的資料: 嵌入式操作系統EOS(Embedded OperatingSystem)是一種用途廣泛的系統軟體,過去它主要應用於工業控制和國防系統領域。EOS負責嵌入系統的全部軟、硬體資源的分配、調度工作,控制協調並發活動;它必須體現其所在系統的特徵,能夠通過裝卸某些模塊來達到系統所要求的功能。目前,已推出一些應用比較成功的EOS產品系列。隨著Internet技術的發展、信息家電的普及應用及EOS的微型化和專業化,EOS開始從單一的弱功能向高專業化的強功能方向發展。嵌人式操作系統在系統實時高效性、硬體的相關依賴性、軟體固態化以及應用的專用性等方面具有較為突出的特點。EOS是相對於一般操作系統而言的,它除具備了一般操作系統最基本的功能,如任務調度、同步機制、中斷處理、文件功能等外,還有以下特點:
(1)可裝卸性。開放性、可伸縮性的體系結構。
(2)強實時性。EOS實時性一般較強,可用於各種設備控制當中。
(3)統一的介面。提供各種設備驅動接入.
(4)操作方便、簡單、提供友好的圖形GUI,圖形界面,追求易學易用.
(5)提供強大的網路功能,支持TCP/IP協議及其它協議,提供TCP/UDP/IP/PPP協議支持及統一的MAC訪問層介面,為各種移動計算設備預留介面.
(6)強穩定性,弱交互性。嵌入式系統一旦開始運行就不需要用戶過多的干預,這就要負責系統管理的EOS具有較強的穩定性。嵌入式操作系統的用戶介面一般不提供操作命令,它通過系統調用命令向用戶程序提供服務。
(7)固化代碼。在嵌入系統中,嵌入式操作系統和應用軟體被固化在嵌入式系統計算機的ROM中。輔助存儲器在嵌入式系統中很少使用,因此,嵌入式操作系統的文件管理功能應該能夠很容易地拆卸,而用各種內存文件系統.
(8)更好的硬體適應性,也就是良好的移植性.
國際上用於信息電器的嵌入式操作系統有40種左右。現在,市場上非常流行的EOS產品,包括3Corn公司下屬子公司的Palm OS,全球佔有份額達50%,Microsoft公司的Windows CE不過29%。在美國市場,Palm OS更以80%的佔有率遠超Windows CE。開放源代碼的Linux很適於做信息家電的開發.
比如:中科紅旗軟體技術有限公司開發的紅旗嵌入式Linux和美商網虎公司開發的基於Xlinux的嵌人式操作系統「誇克"。「誇克」是目前全世界最小的Linux,它有兩個很突出的特點,就是體積小和使用GCS編碼。
常見的嵌入式系統有:Linux、uClinux、WinCE、PalmOS、Symbian、eCos、uCOS-II、VxWorks、pSOS、Nucleus、ThreadX 、Rtems 、QNX、INTEGRITY、OSE、C Executive .
嵌入式操作系統的種類
一般情況下,嵌入式操作系統可以分為兩類,一類是面向控制、通信等領域的實時操作系統,如WindRiver公司的VxWorks、ISI的pSOS、QNX系統軟體公司的QNX、ATI的Nucleus等;另一類是面向消費電子產品的非實時操作系統,這類產品包括個人數字助理(PDA)、行動電話、機頂盒、電子書、WebPhone等。
a. 非實時操作系統
早期的嵌入式系統中沒有操作系統的概念,程序員編寫嵌入式程序通常直接面對裸機及裸設備。在這種情況下,通常把嵌入式程序分成兩部分,即前台程序和後台程序。前台程序通過中段來處理事件,其結構一般為無限循環;後台程序則掌管整個嵌入式系統軟、硬體資源的分配、管理以及任務的調度,是一個系統管理調度程序。這就是通常所說的前後台系統。一般情況下,後台程序也叫任務級程序,前台程序也叫事件處理級程序。在程序運行時,後台程序檢查每個任務是否具備運行條件,通過一定的調度演算法來完成相應的操作。對於實時性要求特別嚴格的操作通常由中斷來完成,僅在中斷服務程序中標記事件的發生,不再做任何工作就退出中斷,經過後台程序的調度,轉由前台程序完成事件的處理,這樣就不會造成在中斷服務程序中處理費時的事件而影響後續和其他中斷。
實際上,前後台系統的實時性比預計的要差。這是因為前後台系統認為所有的任務具有相同的優先順序別,即是平等的,而且任務的執行又是通過FIFO隊列排隊,因而對那些實時性要求高的任務不可能立刻得到處理。另外,由於前台程序是一個無限循環的結構,一旦在這個循環體中正在處理的任務崩潰,使得整個任務隊列中的其他任務得不到機會被處理,從而造成整個系統的崩潰。由於這類系統結構簡單,幾乎不需要RAM/ROM的額外開銷,因而在簡單的嵌入式應用被廣泛使用。
b. 實時操作系統
實時系統是指能在確定的時間內執行其功能並對外部的非同步事件做出響應的計算機系統。其操作的正確性不僅依賴於邏輯設計的正確程度,而且與這些操作進行的時間有關。「在確定的時間內」是該定義的核心。也就是說,實時系統是對響應時間有嚴格要求的。
實時系統對邏輯和時序的要求非常嚴格,如果邏輯和時序出現偏差將會引起嚴重後果。實時系統有兩種類型:軟實時系統和硬實時系統。軟實時系統僅要求事件響應是實時的,並不要求限定某一任務必須在多長時間內完成;而在硬實時系統中,不僅要求任務響應要實時,而且要求在規定的時間內完成事件的處理。通常,大多數實時系統是兩者的結合。實時應用軟體的設計一般比非實時應用軟體的設計困難。實時系統的技術關鍵是如何保證系統的實時性。
實時多任務操作系統是指具有實時性、能支持實時控制系統工作的操作系統。其首要任務是調度一切可利用的資源完成實時控制任務,其次才著眼於提高計算機系統的使用效率,重要特點是要滿足對時間的限制和要求。實時操作系統具有如下功能:任務管理(多任務和基於優先順序的任務調度)、任務間同步和通信(信號量和郵箱等)、存儲器優化管理(含ROM的管理)、實時時鍾服務、中斷管理服務。實時操作系統具有如下特點:規模小,中斷被屏蔽的時間很短,中斷處理時間短,任務切換很快。
實時操作系統可分為可搶占型和不可搶占型兩類。對於基於優先順序的系統而言,可搶占型實時操作系統是指內核可以搶占正在運行任務的CPU使用權並將使用權交給進入就緒態的優先順序更高的任務,是內核搶了CPU讓別的任務運行。不可搶占型實時操作系統使用某種演算法並決定讓某個任務運行後,就把CPU的控制權完全交給了該任務,直到它主動將CPU控制權還回來。中斷由中斷服務程序來處理,可以激活一個休眠態的任務,使之進入就緒態;而這個進入就緒態的任務還不能運行,一直要等到當前運行的任務主動交出CPU的控制權。使用這種實時操作系統的實時性比不使用實時操作系統的系統性能好,其實時性取決於最長任務的執行時間。不可搶占型實時操作系統的缺點也恰恰是這一點,如果最長任務的執行時間不能確定,系統的實時性就不能確定。
可搶占型實時操作系統的實時性好,優先順序高的任務只要具備了運行的條件,或者說進入了就緒態,就可以立即運行。也就是說,除了優先順序最高的任務,其他任務在運行過程中都可能隨時被比它優先順序高的任務中斷,讓後者運行。通過這種方式的任務調度保證了系統的實時性,但是,如果任務之間搶佔CPU控制權處理不好,會產生系統崩潰、死機等嚴重後果。
嵌入式操作系統的發展
嵌入式操作系統伴隨著嵌入式系統的發展經歷了4個比較明顯的階段。
第一階段是無操作系統的嵌入演算法階段,是以單晶元為核心的可編程式控制制器形式的系統,同時具有與監測、伺服、指示設備相配合的功能。這種系統大部分應用於一些專業性極強的工業控制系統中,一般沒有操作系統的支持,通過匯編語言編程對系統進行直接控制,運行結束後清除內存。這一階段系統的主要特點是:系統結構和功能都相對單一,處理效率較低,存儲容量較小,幾乎沒有用戶介面。由於這種嵌入式系統使用簡便、價格很低,以前在國內工業領域應用較為普遍,但是已經遠遠不能適應高效的、需要大容量存儲介質的現代化工業控制和新興的信息家電等領域的需求。
第二階段是以嵌入式CPU為基礎、以簡單操作系統為核心的嵌入式系統。這一階段系統的主要特點是:CPU種類繁多,通用性比較差;系統開銷小, 效率高;一般配備系統模擬器,操作系統具有一定的兼容性和擴展性;應用軟體較專業,用戶界面不夠友好;系統主要用來控制系統負載以及監控應用程序運行。
第三階段是通用的嵌入式實時操作系統階段,是以嵌入式操作系統為核心的嵌入式系統。這一階段系統的主要特點是:嵌入式操作系統能運行於各種不同類型的微處理器上,兼容性好;操作系統內核精小、效率高,並且具有高度的模塊化和擴展性;具備文件和目錄管理、設備支持、多任務、網路支持、圖形窗口以及用戶界面等功能;具有大量的應用程序介面(API),開發應用程序簡單;嵌入式應用軟體豐富。
第四階段是以基於Internet為標志的嵌入式系統,這是一個正在迅速發展的階段。目前大多數嵌入式系統還孤立於Internet之外,但隨著Internet的發展以及Internet技術與信息家電、工業控制技術等結合日益密切,嵌入式設備與Internet的結合將代表著嵌入式技術的真正未來。
使用實時操作系統的必要性
嵌入式實時操作系統在目前的嵌入式應用中用得越來越廣泛,尤其在功能復雜、系統龐大的應用中顯得愈來愈重要。
首先,嵌入式實時操作系統提高了系統的可靠性。在控制系統中,出於安全方面的考慮,要求系統起碼不能崩潰,而且還要有自愈能力。不僅要求在硬體設計方面提高系統的可靠性和抗干擾性,而且也應在軟體設計方面提高系統的抗干擾性,盡可能地減少安全漏洞和不可靠的隱患。長期以來的前後台系統軟體設計在遇到強干擾時,使得運行的程序產生異常、出錯、跑飛,甚至死循環,造成了系統的崩潰。而實時操作系統管理的系統,這種干擾可能只是引起若干進程中的一個被破壞,可以通過系統運行的系統監控進程對其進行修復。通常情況下,這個系統監視進程用來監視各進程運行狀況,遇到異常情況時採取一些利於系統穩定可靠的措施,如把有問題的任務清除掉。
其次,提高了開發效率,縮短了開發周期。在嵌入式實時操作系統環境下,開發一個復雜的應用程序,通常可以按照軟體工程中的解耦原則將整個程序分解為多個任務模塊。每個任務模塊的調試、修改幾乎不影響其他模塊。商業軟體一般都提供了良好的多任務調試環境。
再次,嵌入式實時操作系統充分發揮了32位CPU的多任務潛力。32位CPU比8、16位CPU快,另外它本來是為運行多用戶、多任務操作系統而設計的,特別適於運行多任務實時系統。32位CPU採用利於提高系統可靠性和穩定性的設計,使其更容易做到不崩潰。例如, CPU運行狀態分為系統態和用戶態。將系統堆棧和用戶堆棧分開,以及實時地給出CPU的運行狀態等,允許用戶在系統設計中從硬體和軟體兩方面對
實時內核的運行實施保護。如果還是採用以前的前後台方式,則無法發揮32位CPU的優勢。
從某種意義上說,沒有操作系統的計算機(裸機)是沒有用的。在嵌入式應用中,只有把CPU嵌入到系統中,同時又把操作系統嵌入進去,才是真正的計算機嵌入式應用。
實時操作系統的優缺點
在嵌入式實時操作系統環境下開發實時應用程序使程序的設計和擴展變得容易,不需要大的改動就可以增加新的功能。通過將應用程序分割成若干獨立的任務模塊,使應用程序的設計過程大為簡化;而且對實時性要求苛刻的事件都得到了快速、可靠的處理。通過有效的系統服務,嵌入式實時操作系統使得系統資源得到更好的利用。
但是,使用嵌入式實時操作系統還需要額外的ROM/RAM開銷,2~5%的CPU額外負荷,以及內核的費用。

6. 嵌入式系統、軟體開發環境、嵌入式處理器

呵呵,我做了嵌入式十年了,應該不算菜鳥吧。我來回答你的問題。

1:嵌入式系統有那些?
常用企業常用的有linux、wince、vxworks,還有一些手機的系統也算是嵌入式的系統android(google基於linux)、symbian、windows mobile,還有一些uC/OS、RTLinux、eCos、uclinux、QNX、LynxOS、EEOS。基本上常見我都列出來了。

2:嵌入式開發環境是什麼?
linux uclinux ecos uc/os android RTlinux這些都可以用GCC來編譯程序,具體是什麼GCC和你的處理器有關系,比如arm,就用arm-linux-gcc,mips的處理可能就是用mips-linux-gcc,名字不固定,但是一般都是基於gcc來開發和移植的。還有wince主要是用platform builder來開發的。
在企業的應用中,當然開發環境其實不是固定的,關鍵是看晶元廠商根據不同的嵌入式系統提供的不同的開發環境。

3:嵌入式處理器有那些?
主流的處理器,如arm,目前ARM處理器主要有6大系列:ARM7、ARM9、ARM9E、ARM10、ARM11,SecurCore。還有與Intel合作實現的StrongARM和XScale處理器。
還有其他的處理器。比如MIPS處理器、PowerPC處理器,這些是市場上主流的。
當然,國產也有一些晶元,比如龍芯,但是這些其實不算什麼分類,都是類MIPS的。

4:其實這些都是一些基本的介紹,如果你想深入了解這些東西,那需要一定的時間的。關於這些方面的知識,該怎麼學習呢?我剛才看到一篇很不錯的文章,是一個專科生介紹自己如何自學嵌入式,並找到嵌入式的工作,裡面介紹了他的學習方法和學習過程,希望對你有幫助。

專科生學嵌入式到找到工作的前前後後--學習的榜樣

先做個自我介紹,我07年考上一所很爛專科民辦的學校,學的是生物專業,具體的學校名稱我就不說出來獻丑了。09年我就輟學了,我在那樣的學校,一年學費要1萬多,但是根本沒有人學習,我實在看不到希望,我就退學了。

退學後我也迷茫,大專都沒有畢業,我真的不知道我能幹什麼,我在糾結著我能做什麼。所以輟學後我一段時間,我想去找工作,因為我比較沉默寡言,不是很會說話,我不適合去應聘做業務。我想應聘做技術的,可是處處碰壁。

一次偶然的機會,我才聽到嵌入式這個行業。那天我去新華書店,在計算機分類那邊想找本書學習。後來有個女孩子走過來,問我是不是讀計算機的,有沒有興趣學習嵌入式,然後給我介紹了一下嵌入式現在的火熱情況,告訴我學嵌入式多麼的有前景,給我了一份傳單,嵌入式培訓的廣告。聽了她的介紹,我心裡癢癢的,確實我很想去學會一門自己的技術,靠自己的雙手吃飯。

回家後,我就上網查了下嵌入式,確實是當今比較熱門的行業,也是比較好找工作的,工資也是相對比較高。我就下決心想學嵌入式了。於是我去找嵌入式培訓的相關信息,說真的,我也很迷茫,我不知道培訓是否真的能像他們宣傳的那樣好,所以我就想了解一段時間再做打算。

後來,我在網路知道看到一篇讓我很鼓舞的文章《如何學習嵌入式》,是一個嵌入式高手介紹沒有基礎的朋友怎麼自學入門學嵌入式,文章寫的很好,包含了如何學習,該怎麼學習。他提到一個方法就是看視頻,因為看書實在太枯燥和費解的,很多我們也看不懂。這點我真的很認同,我自己看書往往看不了幾頁。

我在想,為什麼別人都能自學成才,我也可以的!我要相信自己,所以我就想自學,如果實在學不會我再去培訓。

主意一定,我就去搜索嵌入式的視頻,雖然零星找到一些嵌入式的視頻,但是都不系統,我是想找一個能夠告訴我該怎麼學的視頻,一套從入門到精通的視頻,一個比較完整的資料,最好能有老師教,不懂可以請教的。

後來我又找到一份很好的視頻,是在嵌入式學習網推出的一份視頻《從零基礎開始學嵌入式》,網址:http://www.002r.com/embedvideo.htm
裡面的教程還不錯,很完整,可以讓我從基礎的開始學起。視頻不便宜啊,但是我也忍了,畢竟買幾本書都要幾百了,何況他們還有半年的技術咨詢和服務,算值了。

下面介紹下我的學習流程,希望對和我一樣完全沒有基礎的朋友有所幫助。

收到他們寄過來的光碟後,我就開始學習了,由於我沒有什麼基礎,我就從最簡單的C語言視頻教程學起,話說簡單,其實我還是很多不懂的,我只好請教他們,他們還是很熱心的,都幫我解決了。C語言我差不多學了一個禮拜,接下來我就學了linux的基本命令,我在他們提供linux虛擬機上都有做練習,敲linux的基本命令,寫簡單的C語言代碼,差不多也就三個禮拜。我每天都在不停的寫一些簡單的代碼,這樣一月後我基本掌握了C和linux的基本操作。

接下來我就去學習了人家的視頻的培訓教程,是整套的,和去參加培訓沒有多大的區別,這一看就是兩個月,學習了ARM的基本原理,學習嵌入式系統的概念,也掌握了嵌入式的環境的一些搭建,對linux也有更深層次的理解了,明白了嵌入式應用到底是怎麼做的,但是驅動我只是有一點點的了解,這個相對難一點,我想以後再慢慢啃。

這兩個月,除了吃飯睡覺,我幾乎都在學習。因為我知道幾乎沒有基礎,比別人差勁,我只能堅持努力著,我不能放棄,我必要要靠自己來養活自己,必須學好這門技術,同時我不懂的就問,這里真的很感謝他們的技術客服對我的任何問題都是耐心的解答,每天都我幾乎都有好幾個問題問他們,然後我就把不懂的問題總結記下來,這樣慢慢積累了一段時間,我發現自己真的有點入門了。

最後的一個月,我就去看關於實踐部分的內容,了解嵌入式項目具體的開發流程,需要什麼樣的知識,我就開始准備這方面的知識,也就是學習這方面的視頻,同時他們建議我去找了找一些嵌入式面試的題目,為自己以後找工作做准備。我就到網上找了很多嵌入式的題目,把他們理解的記下來,這樣差不多准備了20天左右

我覺得自己差不多入門了,會做一些簡單的東西了。我就想去找工作看看,於是我就到51job瘋狂的投簡歷,因為我學歷的問題,專科沒有畢業,說真的,大公司沒有人會要我,所以我投的都是民營的小公司,我希望自己的努力有所回報。沒有想過幾天過後,就有面試了,但是第一次面試我失敗了,雖然我自認為筆試很好,因為我之前做了准備,但是他們的要求比較嚴格,需要有一年的項目經驗,所以我沒有被選中。

後來陸續面試了幾家公司,終於功夫不負有心人。我終於面試上的,是在閔行的一家民營的企業,公司規模比較小,我的職務是嵌入式linux應用開發,做安防產品的應用的。我想我也比較幸運,經理很看重我的努力,就決定錄用我,開的工資是3500一個月,雖然我知道在上海3500隻能過溫飽的生活,但是我想我足夠了。我至少不用每天都要靠父母養,我自己也能養活自己的。我想只要我繼續努力,我工資一定會翻倍的。

把本文寫出來,希望能讓和我一樣的沒有基礎的朋友有信心,其實我們沒有必要自卑,我們不比別人笨,只要我們肯努力,我們一樣會成功。

最後祝願所有想學嵌入式的朋友更早的入門!

5:希望我的回答能幫到你,更希望你早日學好嵌入式。

7. 什麼是嵌入式操作系統

嵌入式操作系統EOS(Embedded OperatingSystem)是一種用途廣泛的系統軟體,過去它主要應用於工業控制和國防系統領域。EOS負責嵌人系統的全部軟、硬體資源的分配、調度工作,控制協調並發活動;它必須體現其所在系統的特徵,能夠通過裝卸某些模塊來達到系統所要求的功能。目前,已推出一些應用比較成功的EOS產品系列。隨著Internet技術的發展、信息家電的普及應用及EOS的微型化和專業化,EOS開始從單一的弱功能向高專業化的強功能方向發展。嵌人式操作系統在系統實時高效性、硬體的相關依賴性、軟體固態化以及應用的專用性等方面具有較為突出的特點。EOS是相對於一般操作系統而言的,它除具備了一般操作系統最基本的功能,如任務調度、同步機制、中斷處理、文件功能等外,還有以下特點:

(1)可裝卸性。開放性、可伸縮性的體系結構。

(2)強實時性。EOS實時性一般較強,可用於各種設備控制當中。

(3)統一的介面。提供各種設備驅動接日.

(4)操作方便、簡單、提供友好的圖形GUI,圖形界面,追求易學易用.

(5)提供強大的網路功能,支持TCP門P協議及其它協議,提供TCP/UDP/IP/PPP協議支持及統一的MAC訪問層介面,為各種移動計算設備預留介面.

(6)強穩定性,弱交互性。嵌入式系統一旦開始運行就不需要用戶過多的干預,這就要負責系統管理的EOS臭有較強的穩定性。嵌入式操作系統的用戶接日一般不提供操作命令,它通過系統調用命令向用戶程序提供服務。

(7)固化代碼。在嵌入系統中,嵌入式操作系統和應用軟體被固化在嵌入式系統計算機的ROM中。輔助存儲器在嵌入式系統中很少使用,因此,嵌入式操作系統的文件管理功能應該能夠很容易地拆卸,而用各種內存文件系統.

(8)更好的硬體適應性,也就是良好的移植性.

國際上用於信息電器的嵌入式操作系統有40種左右。現在,市場上非常流行的EOS產品,包括3Corn公司下屬子公司的Palm OS,全球佔有份額達50%,MicroS。fi公司的Wind。ws CE不過29%。在美國市場,Palm OS更以80%的佔有率遠超Windows CE。開放源代碼的Linux很適於做信息家電的開發.

比如:中科紅旗軟體技術有限公司開發的紅旗嵌入式Linux和美商網虎公司開發的基於Xlinux的嵌人式操作系統「誇克」。「誇克」是目前全世界最小的Linux,它有兩個很突出的特點,就是體積小和使用GCS編碼。

常見的嵌入式系統有:Linux、uClinux、WinCE、PalmOS、Symbian、eCos、uCOS-II、VxWorks、pSOS、Nucleus、ThreadX 、Rtems 、QNX、INTEGRITY、OSE、C Executive .

嵌入式操作系統的發展
1. 引言
嵌入式操作系統與嵌入式系統密不可分。嵌入式系統主要由嵌入式微處理器、外圍硬體設備、嵌入式操作系統以及用戶的應用程序等四個部分組成,它是集軟硬體於一體的可獨立工作的「器件」。
嵌入式技術的發展,大致經歷了四個階段[1]。
第一階段是以單晶元為核心的可編程式控制制器形式的系統,同時具有與監測、伺服、指示設備相配合的功能。這種系統大部分應用於一些專業性極強的工業控制系統中,一般沒有操作系統的支持,通過匯編語言編程對系統進行直接控制,運行結束後清除內存。
第二階段是以嵌入式CPU為基礎、以簡單操作系統為核心的嵌入式系統。這一階段的操作系統具有一定的兼容性和擴展性,但用戶界面不夠友好。
第三階段是以嵌入式操作系統為標志的嵌入式系統。這一階段系統的主要特點是:嵌入式操作系統能運行於各種不同類型的微處理器上,兼容性好;操作系統內核精小、效率高,並且具有高度的模塊化和擴展性;具備文件和目錄管理、設備支持、多任務、網路支持、圖形窗口以及用戶界面等功能;具有大量的應用程序介面(API),開發應用程序簡單;嵌入式應用軟體豐富。
第四階段是以基於Internet 為標志的嵌入式系統,這是一個正在迅速發展的階段。目前大多數嵌入式系統還孤立於Internet之外,但隨著Internet的發展以及 Internet技術與信息家電、工業控制技術等結合日益密切,嵌入式設備與Internet的結合將代表著嵌入式技術的真正未來[2]。
嵌入式系統的發展對嵌入式操作系統提出了更高的要求。因此,對嵌入式操作系統的結構、設計、用戶界面等諸多方面進行深入研究,將有助於嵌入式系統的應用和發展。
2. 嵌入式操作系統的特點
2.1 嵌入式系統的開發人員對操作系統的依賴性
早期的硬體設備很簡單,軟體的編程和調試工具也很原始,與硬體系統配套的軟體都必須從頭編寫。程序大都採用宏匯編語言,調試是一件很麻煩的事。隨著系統越來越復雜,操作系統就顯得很必要。
(1)操作系統能有效管理越來越復雜的系統資源。
(2)操作系統能夠把硬體虛擬化,使得開發人員從繁忙的驅動程序移植和維護中解脫出來。
(3)操作系統能夠提供庫函數、驅動程序、工具集以及應用程序。
在70年代的後期,出現了嵌入式系統的操作系統。在80年代末,市場上出現了幾個著名的商業嵌入式操作系統,包括Vxwork、Neculeus、QNX和Windows CE等,這些系統提供性能良好的開發環境,提高了應用系統的開發效率。
2.2 嵌入式操作系統的特點
與其他類型的操作系統相比,嵌入式操作系統具有以下一些特點。
(1)體積小。嵌入式系統有別於一般的計算機處理系統,它不具備像硬碟那樣大容量的存儲介質,而大多使用快閃記憶體(Flash Memory)作為存儲介質。這就要求嵌入式操作系統只能運行在有限的內存中,不能使用虛擬內存,中斷的使用也受到限制。因此,嵌入式操作系統必須結構緊湊,體積微小。
(2)實時性。大多數嵌入式系統都是實時系統,而且多是強實時多任務系統,要求相應的嵌入式操作系統也必須是實時操作系統(RTOS)[8]。實時操作系統作為操作系統的一個重要分支已成為研究的一個熱點,主要探討實時多任務調度演算法和可調度性、死鎖解除等問題。
(3)特殊的開發調試環境。提供完整的集成開發環境是每一個嵌入式系統開發人員所期待的。一個完整的嵌入式系統的集成開發環境一般需要提供的工具是編譯/連接器、內核調試/跟蹤器和集成圖形界面開發平台。其中的集成圖形界面開發平台包括編輯器、調試器、軟體模擬器和監視器等。
3. 嵌入式操作系統的發展狀況
國外嵌入式操作系統已經從簡單走向成熟,主要有Vxwork、 QNX、PalmOS、Windows CE等。國內的嵌入式操作系統研究開發有2種類型,一類是基於國外操作系統二次開發完成的,如海信的基於Windows CE的機頂盒系統;另一類是中國自主開發的嵌入式操作系統,如凱思集團公司自主研製開發的嵌入式操作系統Hopen OS(「女媧計劃」)等。
Windows CE內核較小,能作為一種嵌入式操作系統應用到工業控制等領域。其優點在於便攜性、提供對微處理器的選擇以及非強行的電源管理功能。內置的標准通信能力使 Windows CE能夠訪問Internet並收發E_mail或瀏覽Web。除此之外,Windows CE特有的與Windows類似的用戶界面使最終用戶易於使用。Windows CE的缺點是速度慢、效率低、價格偏高、開發應用程序相對較難。
3Com公司的Palm OS在掌上電腦和PDA市場上獨占其霸主地位,它有開放的操作系統應用程序介面(API),開發商可根據需要自行開發所需的應用程序。
QNX是由加拿大QSSL公司開發的分布式實時操作系統,它由微內核和一組共操作的進程組成,具有高度的伸縮性,可靈活地剪裁,最小配置只佔用幾十KB內存。因此,可以廣泛地嵌入到智能機器、智能儀器儀表、機頂盒、通訊設備、PDA等應用中去[6][7]。
Hopen OS是凱思集團自主研製開發的嵌入式操作系統,由一個體積很小的內核及一些可以根據需要進行定製的系統模塊組成。其核心Hopen Kernel一般為10KB左右大小,佔用空間小,並具有實時、多任務、多線程的系統特徵。
在眾多的實時操作系統和嵌入式操作系統產品中,WindRiver公司的VxWorks是較為有特色的一種實時操作系統[5]。VxWorks 支持各種工業標准,包括POSIX、ANSI C 和TCP/IP網路協議。VxWorks 運行系統的核心是一個高效率的微內核,該微內核支持各種實時功能,包括快速多任務處理、中斷支持、搶占式和輪轉式調度。微內核設計減輕了系統負載並可快速響應外部事件。在美國宇航局的「極地登陸者」號、「深空二號」和火星氣候軌道器等登陸火星探測器上,就採用了VxWorks,負責火星探測器全部飛行控制,包括飛行糾正、載體自旋和降落時的高度控制等,而且還負責數據收集和與地球的通信工作。目前在全世界裝有VxWorks 系統的智能設備數以百萬計,其應用范圍遍及互聯網、電信和數據通信、數字影像、網路、醫學、計算機外設、汽車、火控、導航與制導、航空、指揮、控制、通信和情報、聲納與雷達、空間與導彈系統、模擬和測試等眾多領域。
4. Linux
4.1 嵌入式Linux的應用開發前景
Linux是個與生俱來的網路操作系統,成熟而且穩定。Linux是源代碼開放軟體,不存在黑箱技術,任何人都可以修改它,或者用它開發自己的產品。Linux系統是可以定製的,系統內核目前已經可以做得很小。一個帶有中文系統及圖形化界面的核心程序也可以做到不足1MB,而且同樣穩定。Linux作為一種可裁減的軟體平台系統,是發展未來嵌入設備產品的絕佳資源,遍布全球的眾多Linux愛好者又能給予Linux開發者強大的技術支持。因此,Linux作為嵌入式系統新的選擇,是非常有發展前途的。
(1)與硬體晶元的緊密結合
後PC時代的智能設備已經逐漸地模糊了硬體與軟體的界限,SOC系統(System On Chip)的發展就是這種軟硬體無縫結合趨勢的證明。隨著處理器片內微碼的發展,在將來可能出現在處理器片內嵌進操作系統的代碼模塊。
嵌入式Linux的一大特點是:與硬體晶元(如SOC等)的緊密結合。它不是一個純軟體的Linux系統,而比一般操作系統更加接近於硬體。嵌入式Linux的進一步發展,逐步地具備了嵌入式RTOS的一切特徵:實時性及與嵌入式處理器的緊密結合。
(2)開放的源代碼
嵌入式Linux的另一大特點是:代碼的開放性。代碼的開放性是與後PC時代的智能設備的多樣性相適應的。代碼的開放性主要體現在源代碼可獲得上,Linux代碼開發就像是「集市式」開發,任意選擇並按自己的意願整合出新的產品。
對於嵌入式Linux,事實上是把BIOS層的功能實現在Linux的driver層。目前,在Linux領域,已經出現了專門為Linux操作系統定製的自由軟體的BIOS代碼,並在多款主板上實現此類的BIOS層功能。
(3)嵌入式Linux與硬體晶元的緊密結合
對於許多信息家電的應用來說,嵌入的性能指標是最難滿足的,只有靠提高晶元的集成度與裝配密度來解決。嵌入式Linux與標准Linux的一個重要區別是嵌入式Linux與硬體晶元的緊密結合。這是一個不可逾越的難點,也是嵌入式Linux技術的關鍵之處。嵌入式Linux和商用專用RTOS一樣,需要編寫BSP(Board Support Package),這相當於編寫PC的BIOS。這不僅僅是嵌入式Linux的難點,也是使用商用專用RTOS開發的難點。硬體晶元(SOC晶元或者是嵌入式處理器)的多樣性也決定了代碼開放的嵌入式Linux的成功。嵌入式系統的發展,必然導致軟硬體無縫結合的趨勢,逐漸地模糊了硬體與軟體的界限,在將來可能出現SOC片內的操作系統代碼模塊。
隨著處理器片內微碼的發展,在將來應出現在處理器片內嵌進操作系統的代碼模塊,很顯然模塊將具有安全性好、健壯性強、代碼執行效率高等特點。著眼於未來的嵌入式系統的發展,我們基於對嵌入式Linux技術的深入研究,對嵌入式處理器及SOC系統的深刻理解和研究;對EDA技術的深入研究;對模擬數字混合集成電路晶元的深入研究;對SOC片內進行嵌入式Linux操作系統代碼的植入研究。此類的研究有可能減輕系統開發者對BSP開發的難度要求,並使得嵌入式Linux能夠成為普及的嵌入式操作系統,而大大提高嵌入式Linux的易用性,提高其開發出的高智能設備的安全性、穩定性,同時也大大提高智能設備的計算能力、處理能力。
4.2 部分嵌入式Linux產品[3][4]
嵌入式Linux 一般是按照嵌入式目標系統的要求而設計,由一個體積很小的內核及一些可以根據需要進行隨意裁減的系統模塊組成。一般來說整個系統所佔用的空間不會超過幾M 大小。目前,國外不少大學、研究機構和知名公司都加入了嵌入式Linux的開發工作,較成熟的嵌入式Linux產品不斷涌現。
由美國新墨西哥理工學院開發的基於標准Linux 的嵌入式操作系統RTLinux,已成功地應用於太空梭的空間數據採集、科學儀器測控、電影特技圖像處理等領域。RTLinux開發者並沒有針對實時操作系統的特性重寫Linux的內核,這樣做工作量會非常大,而且要保證兼容性也非常困難。為此,RTLinux提供了一個精巧的實時內核,並把標準的 Linux核心作為實時核心的一個進程同用戶的實時進程一起調度,這樣做的好處是對Linux的改動量最小,充分利用了Linux平台下現有的豐富的軟體資源。
由嵌入式Linux行業主要廠商之一Lineo推出的Embedix,是根據嵌入式應用系統的特點重新設計的Linux發行版本。Embedix提供了超過25種的Linux系統服務,包括Web伺服器等。系統需要最小8M內存,3M只讀內存或快閃記憶體。Embedix基於Linux 2.2核心,並已經成功地移植到了Intel X86和PowerPC處理器系列上。
由美國網虎公司推出的XLinux,號稱是世界上最小的嵌入式Linux系統,核心只有143K位元組,而且還在不斷減小。
致力於國產嵌入式Linux 操作系統和應用軟體開發的廣州博利思軟體公司推出的嵌入式Linux中文操作系統POCKETIX,基於標準的Linux內核,並包括一些可以根據需要進行定製的系統模塊。支持標准乙太網和TCP/IP協議、支持標準的X Window,中文支持採用國際化標准,提供桌面和窗口管理功能、帶WEB瀏覽器和文件管理器,並支持智能拼音和五筆字型輸入。可適應個人PDA、WAP 手機、機頂盒等廣泛的智能信息產品。
4.3 開發嵌入式Linux的幾個問題
(1)Linux的移植。如果Linux不支持選用的平台,就需要把Linux內核中與硬體平台相關的部分改寫,使之支持所選用的平台。
(2)內核的裁剪。嵌入式產品的可用資源比較少,所以它的內核相對嵌入式系統來說就顯得有點大,需要進行剪裁到可利用的大小。
(3)桌面系統。現代的操作系統如果沒有一個友好的界面是沒有說服力的。現在的台式機Linux系統使用了傳統的X Window系統的模式—Client/Server結構。和硬體有關的部分即是Server端,實現一個標準的顯示介面;應用程序通過對Server的服務請求,實現程序的顯示。在此之上,實現窗口的管理功能。但X Window對於嵌入式系統來說顯得很龐大。現在國內有MiniGUI,國外有MicroWindow,都在致力於嵌入式Linux GUI的開發。適用於嵌入式Linux上的X Window的工作也在進行。
(4)驅動程序的開發。Linux內核更新的很快,許多最新的硬體驅動很快就被支持。但嵌入式系統應用領域是多種多樣的,所選用的硬體設備也不同,並且不可能都有Linux的驅動程序,因此,設備驅動程序的開發也是重要的工作。
(5)應用軟體的開發。
(6)中文的支持。
5. 結束語
目前,絕大部分嵌入式系統的硬體平台還掌握在外國公司的手中,國產的嵌入式操作系統在技術含量、兼容性、市場運作模式等方面也還有很多工作要做,我們應該在跟蹤國外嵌入式操作系統的最新技術的同時,堅持自主產權,力爭找到自己的突破點,探索出一條自己的發展道路。

熱點內容
紅米note擴展存儲卡 發布:2025-08-20 21:27:10 瀏覽:862
驗證你的電子郵件地址不能連接伺服器 發布:2025-08-20 21:27:09 瀏覽:63
存儲區是什麼意思 發布:2025-08-20 21:26:31 瀏覽:53
壓縮袋是什麼 發布:2025-08-20 20:48:27 瀏覽:618
伺服器減容會有什麼影響 發布:2025-08-20 20:40:23 瀏覽:150
我的世界怎麼聯伺服器 發布:2025-08-20 20:34:31 瀏覽:498
c語言編譯或解釋 發布:2025-08-20 20:27:17 瀏覽:601
vsm編程 發布:2025-08-20 20:16:31 瀏覽:913
腳本刷黑石塔 發布:2025-08-20 19:50:08 瀏覽:982
網上學編程可靠嗎 發布:2025-08-20 19:45:13 瀏覽:650