嵌入式操作系統(tǒng)課件_第1頁
嵌入式操作系統(tǒng)課件_第2頁
嵌入式操作系統(tǒng)課件_第3頁
嵌入式操作系統(tǒng)課件_第4頁
嵌入式操作系統(tǒng)課件_第5頁
已閱讀5頁,還剩701頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

嵌入式操作系統(tǒng)1什麼是嵌入式系統(tǒng)? 嵌入式系統(tǒng)(Embeddedsystem)是“以應用為中心,以電腦技術為基礎,並且軟硬體可裁減,適用於應用系統(tǒng)對功能、可靠性、成本、體積、功耗有嚴格要求的專用電腦系統(tǒng)”,是一種“完全嵌入受控器件內部,為特定應用而設計的系統(tǒng)“。按照歷史性、本質性、普遍性要求,嵌入式系統(tǒng)應定義為:“嵌入到對象體系中的專用電腦系統(tǒng)”。“嵌入性”、“專用性”與“電腦系統(tǒng)”是嵌入式系統(tǒng)的三個基本要素。對象系統(tǒng)則是指嵌入式系統(tǒng)所嵌入的宿主系統(tǒng).1、從硬體上,將基於CPU的處圍器件,整合到CPU晶片內部,比如早期基於X86體系結構下的電腦,CPU只是有運算器和累加器的功能,一切晶片要靠外部橋路來擴展實現(xiàn),象串口之類的都是靠外部的的串口控制器晶片實現(xiàn),而目前的這種串口控制器晶片早已集成到CPU內部;PC機有顯卡,而多數(shù)嵌入式處理器都帶有LCD控制器,但某種意義上就相當於顯卡。比較高端的ARM類IntelXscale架構下的IXP網(wǎng)路處理器CPU內部集成PCI控制器,網(wǎng)路處理器引擎等。如何理解“嵌入”2、從軟體上,就是在定制操作系統(tǒng)內核裏將應用一併選入,編譯後將內核下載到ROM中。而在定制操作系統(tǒng)內核時所選擇的應用程式組件就是完成了軟體的“嵌入”,比如WinCE在內核定制時,會有相應選擇,其中就是wordpad,PDF,MediaPlay等選擇,如果我們選擇了,在CE啟動後,就可以在介面中找到這些東西,而PC上的windows操作系統(tǒng),多半的東西都需要我們重新安裝。

3、把軟體內核或應用文件系統(tǒng)等東西燒到嵌入式系統(tǒng)硬體平臺中的ROM中就實現(xiàn)了一個真正的“嵌入”。如何理解“嵌入”

嵌入式系統(tǒng)主要應用領域消費電子工業(yè)控制通信設備、家庭設備汽車電子醫(yī)療電子軍事國防航空航太 嵌入式系統(tǒng)無處不在,在移動電話、數(shù)碼照相機、MP4、數(shù)字電視的機頂盒、微波爐、汽車內部的噴油控制系統(tǒng)、ABS(防抱死制動系統(tǒng))等裝置或設備都使用了嵌入式系統(tǒng)。嵌入式技術正在改變生活為什麼要學習嵌入式系統(tǒng)市場需求 中國具有世界最大嵌入式技術市場,手持儀器設備、資訊家電、城市建設、工業(yè)控制、軍事應用,……,嵌入式技術無處不在。企業(yè)人才需求 軟硬體設計人才,應用開發(fā)人才,綜合性人才,……技術發(fā)展趨勢要求

8位、16位、32位,即時操作系統(tǒng),……目前國內沒有專門的嵌入式系統(tǒng)專業(yè)或課程體系 電腦專業(yè):偏軟 電子專業(yè):偏硬為什麼選擇嵌入式行業(yè)?嵌入式開發(fā)是目前高薪IT職業(yè)。嵌入式開發(fā)不會像桌面開發(fā)那樣容易貶值。嵌入式開發(fā)可作為長期職業(yè)發(fā)展。嵌入式產(chǎn)品無處不在。就業(yè)起薪較高。

硬體是其基礎、軟體是其核心與靈魂。硬體主要由嵌入式微處理器、週邊硬體設備組成;軟體主要包括底層系統(tǒng)軟體和用戶應用軟體組成嵌入式系統(tǒng)的組成

1.嵌入式系統(tǒng)硬體組成嵌入式處理器(CPU)是嵌入式系統(tǒng)的核心部分ARM、PowerPC、MC68000、MIPS等週邊設備存儲設備(如RAM、SRAM、Flash等)通信設備(如RS-232介面、以太網(wǎng)介面等)顯示設備(如顯示幕等)嵌入式系統(tǒng)的組成

2.嵌入式系統(tǒng)軟體組成對於使用操作系統(tǒng)的嵌入式系統(tǒng)來說,嵌入式系統(tǒng)軟體結構一般包含4個層面:即時操作系統(tǒng)RTOS、應用程式介面API層、設備驅動層、實際應用程式層。

嵌入式系統(tǒng)軟體組成圖嵌入式系統(tǒng)的組成第1章嵌入式Linux操作系統(tǒng)簡介本章教學目的及要求瞭解Linux的特徵及組成;瞭解Linux的內核結構及相關源代碼;瞭解常見的嵌入式操作系統(tǒng);瞭解嵌入式系統(tǒng)的開發(fā)流程。1.1Linux的特徵及組成1.1.1Linux操作系統(tǒng)發(fā)展歷史 Linux最初是專門為基於Intel處理器的個人電腦而設計的。Linux的前身指的是由LinusTorvalds維護開發(fā)的開放源代碼的類Unix操作系統(tǒng)的內核。

目前大多數(shù)人用它來表示以Linux內核為基礎的整個操作系統(tǒng)。從這種意義講,Linux指的是源碼開放,包含內核和系統(tǒng)工具、完整的開發(fā)環(huán)境和應用的類Unix操作系統(tǒng)。

同時,Linux遵循GNU(GNU’sNotUnix)的通用公共許可證GPL(GeneralPublicLicense),是自由軟體家族中的一員。自由軟體最早由美國麻省理工學院MIT的RichardStallman提出。自1984年起,在MIT的支持下,Richard創(chuàng)建了自由軟體基金會FSF(FreeSoftwareFoundation)。FSF的主要專案是GNU計畫(革奴計畫),它的目標是建立可自由發(fā)佈和可移植的類Unix操作系統(tǒng)。同時,Richard創(chuàng)作了通用公共許可證GPL作為GNU的版權聲明。GPL也叫Copyleft,這與我們平常所說的Copyright截然相反。任何人只要遵循GPL,就可以對Linux內核加以修改併發(fā)布給他人使用。

Copyleft標誌什麼是自由軟體?1.1.1Linux操作系統(tǒng)發(fā)展歷史2011年11月,Linux內核發(fā)佈最新版3.1.2Linux之所以受到廣大電腦愛好者的喜愛主要原因: 一是它屬於自由軟體,用戶不用支付任何費用就可以獲得它和它的源代碼,並且可以根據(jù)自己的需要對它進行必要的修改和無約束地繼續(xù)傳播。 另一個原因是,它具有Unix的全部功能,任何使用Unix操作系統(tǒng)或想要學習Unix操作系統(tǒng)的人都可以從Linux中獲益。Linux之父:李納斯·托沃茲LinusTorvaldsFrom:torvalds@klaava.Helsinki.FI(LinusBenedictTorvalds)Newsgroups:comp.os.minixSubject:Whatwouldyouliketoseemostinminix?Summary:smallpollformynewoperatingsystemMessage-ID:Date:25Aug9120:57:08GMTOrganization:UniversityofHelsinkiHelloeverybodyoutthereusingminix-Idoinga(free)operatingsystem(justahobby,won‘tbebigandprofessionallikegnu)for386(486)ATclones.(你好,所有使用minix的人-我正在為386(486)AT做一個免費的操作系統(tǒng)(只是為了愛好),不會像GNU那樣很大很專業(yè))ThishasbeenbrewingsinceApril,andisstartingtogetready.Ilikeanyfeedbackonthingspeoplelike/dislikeinminix,asmyOSresemblespracticalreasonsamongotherthings.Ihavecurrentlyportedbash(1.08)andgcc(1.40),andthingsseemtowork.ThisimpliesthatI'llgetsomethingpracticalwithinafewmonths,andIliketoknowwhatfeathersmostpeoplewouldwant.Anysuggestionsarewelcome,butIwon'tpromiseI'Ilimplementthem:-)Linus(torvalds@kruuna.helsinki.fi)Ps.Yes-it‘sfreeofanyminixcode,andithasamulti-threadedfs.ItisNOTportable(uses386taskswitchingetc),anditprobablyneverwillsupportanythingotherthanAT-hard-disks,asthat'sallIhave:-(Linux的起源linuxfor工作linux系統(tǒng)管理員linux系統(tǒng)的維護、配置等linux程式員需c/c++、java,php、jsp…linux軟體工程師(PC)linux嵌入式開發(fā)(單片機、晶片)1.Linux系統(tǒng)的特點開放性:指系統(tǒng)遵循世界標準規(guī)範,特別是遵循開放系統(tǒng)互連(OSI)國際標準。多用戶:是指系統(tǒng)資源可以被不同用戶使用,每個用戶對自己的資源(例如:檔、設備)有特定的許可權,互不影響。多任務:它是指電腦同時執(zhí)行多個程式,而且各個程式的運行互相獨立。良好的用戶介面:Linux向用戶提供了3種介面:用戶介面、系統(tǒng)調用、圖形用戶介面。它利用滑鼠、菜單、窗口、滾動條等設施,給用戶呈現(xiàn)一個直觀、易操作、交互性強的友好的圖形化介面1.1.2Linux系統(tǒng)的特點及組成設備獨立性:是指操作系統(tǒng)把所有外部設備統(tǒng)一當作成文件來看待,只要安裝它們的驅動程式,任何用戶都可以象使用檔一樣,操縱、使用這些設備,而不必知道它們的具體存在形式。Linux是具有設備獨立性的操作系統(tǒng),它的內核具有高度適應能力提供了豐富的網(wǎng)路功能:完善的內置網(wǎng)路是Linux一大特點??煽康陌踩到y(tǒng):Linux採取了許多安全技術措施,包括對讀、寫控制、帶保護的子系統(tǒng)、審計跟蹤、核心授權等,這為網(wǎng)路多用戶環(huán)境中的用戶提供了必要的安全保障。良好的可移植性:是指將操作系統(tǒng)從一個平臺轉移到另一個平臺使它仍然能按其自身的方式運行的能力。Linux是一種可移植的操作系統(tǒng),能夠在從微型電腦到大型電腦的任何環(huán)境中和任何平臺上運行。1.1.2Linux系統(tǒng)的特點及組成2.Linux系統(tǒng)的組成Linux一般由以下4部分組成:Linux的內核:內核是系統(tǒng)的核心,是運行程式和管理像磁片和印表機等硬體設備的核心程式。LinuxShell:

Shell是系統(tǒng)的用戶介面,它是一個命令解釋器,它解釋用戶輸入的命令,並且把它們送到內核。提供了用戶與內核進行交互操作的一種介面。Linux應用系統(tǒng):標準的Linux系統(tǒng)都有一整套稱為應用程式的程式集,包括文本編輯器、編程語言、XWindow、辦公套件、Internet工具、資料庫等。Linux檔系統(tǒng):

Linux檔系統(tǒng)是檔存放在磁片等存儲設備上的組織方法。Linux能支持多種目前許多的檔系統(tǒng),如EXT2、EXT3、FAT、VFAT、ISO9660、NFS、SMB等。1.Linux的內核版本 Linux內核採用雙樹結構。一棵樹是穩(wěn)定樹,主要用於發(fā)行;另一棵樹是非穩(wěn)定樹或開發(fā)樹,用於產(chǎn)品開發(fā)、改進。 源代碼版本序號的形式為r.x.y,其中r為主版本號,代表較大改動;x為次版本號,表示功能性的改動;y為末版本號,表示BUG的改動(錯誤修補的次數(shù))。其中r介於0到9之間,x和y則介於0到99之間。 對於穩(wěn)定樹來說,x是偶數(shù);對於開發(fā)樹來說,x是比相應穩(wěn)定樹大1的奇數(shù)。例2.4.20為穩(wěn)定內核版本。 可以從/獲得最新的內核資訊1.1.3Linux的內核版本與發(fā)行版本2.Linux的發(fā)行版本 Linux的發(fā)佈版本就是將Linux核心與應用軟體打包。雖然Linux只有一個標準化的版本,但有好多個不同的發(fā)佈版本。如今的Linux已經(jīng)有超過250種發(fā)行版本,且可以支持所有體系結構的處理器,如X86、PowerPC、ARM、XSCALE等,也可以支持帶MMU或不帶MMU的處理器。到目前為止,它的內核版本也已從原先的0.0.1發(fā)展到現(xiàn)在的3.x。 紅旗Linux 衝浪Linux 中軟Linux RedHatLinux UbuntuLinux TurboLinuxDebianLinux MandrivaLinux 其中RedHatLinux和UbuntuLinux(適合初學者)比較普遍1.1.3Linux的內核版本與發(fā)行版本RedHatLinux的優(yōu)勢RedHatLinux是最成熟也是目前最流行的一種Linux發(fā)佈版本,無論在銷售還是裝機容量上都居榜首。RedHatLinux可運行在多種硬體平臺上。市場上有大量的文章是針對RedHatLinux來介紹的,同時其站點包含有大量文檔,如Users’Guide、FAQ等。在RedHat的300名工程師中,有6名來自於全世界最頂尖的Linux核心開發(fā)者,7名來自全球最出色Linux開發(fā)工具工程師。全世界,也許只有RedHat能夠把Linux和開源技術以及企業(yè)級的培訓、技術支持和諮詢融合得如此美妙。RedHat的培訓及認證被認為是Linux認證的標準。Certification雜誌的最新調查顯示,RHCE(RedHat認證工程師)認證被公認為總體品質最高的國際IT認證。RedHat的發(fā)展戰(zhàn)略是每三年發(fā)佈一個新版本的企業(yè)級Linux操作系統(tǒng),並且每六個月發(fā)佈一次更新。第一階段:linux平臺上的開發(fā),包括vi,gcc,gdb,make,jdk,tomcat,mysql..和linux基本操作第二階段:加厚c語言功底《c專家編程》或是java語言第三階段:學習unix環(huán)境高級編程《unix環(huán)境高級編程》第四階段:linux應用系統(tǒng)開發(fā)/linux嵌入式開發(fā)推薦書籍《鳥哥的Linux的私房菜基礎學習篇》鳥哥、許偉、林彩娥等編著《Linux編程從入門到精通》宮虎波編著《Linux內核完全剖析》趙炯編著實踐合理利用網(wǎng)路資源:論壇、視頻等如何學習Linux1.2.1Linux內核結構1.2Linux的內核分析內核負責管理磁片上的檔、記憶體,負責啟動並運行程式,負責從網(wǎng)路上接收和發(fā)送數(shù)據(jù)包等等。內核實際是抽象的資源操作到具體硬體操作細節(jié)之間的介面。

從程式員來看,Linux內核抽象了許多硬體細節(jié),使程式員可以以統(tǒng)一的方式進行數(shù)據(jù)處理。

從用戶來看,Linux是一個資源管理者,幫助用戶方便的管理自己的數(shù)據(jù),完成自己的工作。

Linux是多用戶、多任務的操作系統(tǒng)。Linux內核保證每個用戶都象自己獨佔記憶體和其他硬體資源一樣運行其進程,並使各進程公平合理地使用各種資源。1.2.2Linux內核的作用1.2.3Linux內核的抽象結構

5個子系統(tǒng)提供對各種網(wǎng)路協(xié)議和網(wǎng)路硬體的支持。分為網(wǎng)路協(xié)議和網(wǎng)路設備驅動兩部分。保證多個進程安全地共用記憶體區(qū)域。負責控制進程對CPU的訪問。支持進程間各種通信機制為所有設備提供統(tǒng)一的介面,支持數(shù)十種不同的檔系統(tǒng)。包括邏輯檔系統(tǒng)和設備驅動程式。各個子系統(tǒng)之間的依賴關係互相依賴。在多道程序環(huán)境下,程式要運行必須為之創(chuàng)建進程,而創(chuàng)建進程的第一件事情,就是將程式和數(shù)據(jù)裝入記憶體。依賴

支持共用記憶體通信機制,這種機制允許兩個進程除了擁有自己的私有空間,還可以存取共同的記憶體區(qū)域。虛擬檔系統(tǒng)利用網(wǎng)路介面支持網(wǎng)路檔系統(tǒng)(NFS)記憶體管理利用虛擬檔系統(tǒng)支持交換,交換進程定期由調度程式調度,這也是記憶體管理依賴於進程調度的唯一原因。各個子系統(tǒng)之間的依賴關係

進程調度與記憶體管理之間的關係:這兩個子系統(tǒng)互相依賴。在多道程序環(huán)境下,程式要運行必須為之創(chuàng)建進程,而創(chuàng)建進程的第一件事情,就是將程式和數(shù)據(jù)裝入記憶體。進程間通信與記憶體管理的關係:進程間通信子系統(tǒng)要依賴記憶體管理支持共用記憶體通信機制,這種機制允許兩個進程除了擁有自己的私有空間,還可以存取共同的記憶體區(qū)域。

虛擬檔系統(tǒng)與網(wǎng)路介面之間的關係:虛擬檔系統(tǒng)利用網(wǎng)路介面支持網(wǎng)路檔系統(tǒng)(NFS)。記憶體管理與虛擬檔系統(tǒng)之間的關係:記憶體管理利用虛擬檔系統(tǒng)支持交換,交換進程定期由調度程式調度,這也是記憶體管理依賴於進程調度的唯一原因。當一個進程存取的記憶體映射被換出時,記憶體管理向檔系統(tǒng)發(fā)出請求,同時,掛起當前正在運行的進程。1.2.3Linux內核的抽象結構

一般在Linux系統(tǒng)中的/usr/src/Linux-*.*.*(*.*.*代表內核版本)目錄下就是內核源代碼。Linux內核非常龐大,包括驅動程式在內有數(shù)百兆之多。1.2.4Linux內核的源代碼1.2.4Linux內核的源代碼arch目錄:包含了體系結構相關部分的內核代碼,其中的每一個目錄都代表一種硬體平臺,比如ARM平臺和PC機使用的i386。對於任何一種平臺,都包括以下5個目錄:boot、kernel、lib、mm和math-xxx。顯然,移植工作的重點就是arch目錄下的檔。/mm目錄:包含了所有的記憶體管理代碼。/init目錄:包含了內核的初始化代碼(不是系統(tǒng)的引導代碼),有main.c和version.c兩個檔。內核從此工作。/fs目錄:包含了Linux所支持的所有檔系統(tǒng)。一般來說,檔系統(tǒng)與硬體無關。/ipc目錄:包含了核心進程間的通信代碼。/kernel目錄:包含了內核管理的核心代碼。/include目錄:包含了建立內核代碼時所需的大部分頭檔,比如,與平臺無關的頭檔在include/linux子目錄下。此外,也包括了不同平臺需要的庫檔,比如,asm-arm是ARM平臺需要的庫檔。/net目錄:包含了和網(wǎng)路相關的代碼,其每一個子目錄對應於網(wǎng)路的一個方面。/lib目錄:包含了所有的庫代碼。其他目錄:Documentation目錄包含了許多非常詳細的文檔。Scripts目錄主要在配置內核時用到,存放了配置內核的一些腳本檔,如“makemenuconfig”命令。1.2.4Linux內核的源代碼1.3常見的嵌入式操作系統(tǒng)1.3.1嵌入式操作系統(tǒng)概念和分類

操作系統(tǒng)(OS,OperatingSystem):

是隱藏底層不同硬體的差異,向在其上運行的應用程式提供一個統(tǒng)一的調用介面。

操作系統(tǒng)主要完成三項任務:

記憶體管理多任務管理週邊設備管理。應用程式操作系統(tǒng)系統(tǒng)介面驅動程式硬體硬體硬體硬體1.3.1嵌入式操作系統(tǒng)概念和分類概念嵌入式操作系統(tǒng)(EmbeddedOperatingSystem)

負責嵌入式系統(tǒng)的全部軟、硬體資源的分配、調度、控制、協(xié)調;能夠通過加載/卸載某些模組來達到系統(tǒng)所要求的功能。EOS是相對於一般操作系統(tǒng)而言的,它除具備了一般操作系統(tǒng)最基本的功能,如任務調度、同步機制、中斷處理、檔處理等外,還有以下特點:強穩(wěn)定性,弱交互性:具有很強的穩(wěn)定性;較強的即時性;可伸縮性:開放、可伸縮性的體系結構;外設介面的統(tǒng)一性:提供各種設備驅動介面。即時操作系統(tǒng)(Real-TimeOperatingSystem,RTOS),是指操作系統(tǒng)本身要能在一個固定時限內對程式調用(或外部事件)做出正確的反應,亦即對時序與穩(wěn)定性的要求十分嚴格。目前國際較為知名的有:VxWorks、NeutrinoRTOS、NucleusPlus、OS/9、VRTX、LinuxOS,RTLinux、BlueCatRT等。通用型操作系統(tǒng):執(zhí)行性能與反應速度比起即時操作系統(tǒng),相對沒有那麼嚴格。目前較知名的有:WindowsCE、PalmOS、TimeSysLinux/GPL、BlueCatLinux等。

嵌入式操作系統(tǒng)的性能通常取決於核心程式,而核心的工作主要在任務管理(TaskManagement)、任務調度(TaskScheduling)、進程間的通信(IPC)、記憶體管理(MemoryManagement)。1.3.1嵌入式操作系統(tǒng)概念和分類分類比較著名的嵌入式操作系統(tǒng)(瞭解)嵌入式LinuxμC/OS-IIWindowsCEVxWorksQNX 利用Linux搭建嵌入式操作系統(tǒng)是近年來最令人振奮的方案之一,Linux將來可能會成為嵌入式系統(tǒng)主流操作系統(tǒng)。

1.3.2嵌入式Linux(1)嵌入式Linux是按照嵌入式操作系統(tǒng)的要求而設計的一種小型操作系統(tǒng)。由一個內核及一些根據(jù)需要進行定制的系統(tǒng)模組組成。其kernel很小,一般只有幾百kB左右。即使加上其他必須的模組和應用程式,所需的存儲空間也很小。它有多任務、多進程的系統(tǒng)特徵,有些還具有即時性。

1.3.2嵌入式Linux(2)嵌入式Linux操作系統(tǒng)的優(yōu)勢(1)、支持多種體系結構; 目前Linux能夠支持x86,ARM,IPS,APARC等多種CPU的體系機構,已被移植到數(shù)十種硬體平臺上。(2)、多任務,內核穩(wěn)定,可定制,源代碼開放;(3)、強大的網(wǎng)路支持功能; 支持TCP/IP協(xié)議,及其上的高層協(xié)議,如ftp,Telnet,http等。同時支持Socket網(wǎng)路編程。(4)、支持多檔系統(tǒng);

linux支持FAT32,EXT2,EXT3等多種檔系統(tǒng),支持虛擬檔系統(tǒng),同時還可以連接其他的檔系統(tǒng),如ROMFS,JFFS等檔系統(tǒng)。嵌入式Linux操作系統(tǒng)的優(yōu)勢(5)、驅動豐富,支持大量的外設;

linux支持基本所有的PC外設,具有豐富的外設驅動程式。(6)、Linux具備一整套工具鏈。容易自行建立嵌入式系統(tǒng)的開發(fā)環(huán)境、交叉運行環(huán)境,並且可以跨越嵌入式系統(tǒng)開發(fā)中仿真工具的障礙。一般開發(fā)嵌入式操作系統(tǒng)的程式調試和跟蹤都是使用仿真器來實現(xiàn)的,而使用Linux系統(tǒng)做原型的時候,可以繞過這個障礙,直接使用內核調試器來做操作系統(tǒng)的內核調試和查錯。μC/OS是一個典型的即時操作系統(tǒng)。該系統(tǒng)從1992年開始發(fā)展,目前流行的是第二個版本,即μC/OSII。名稱μC/OS-II來源於術語Micro-ControllerOperatingSystem(微控制器操作系統(tǒng))。它通常也稱為MUCOS或者UCOS。1.3.3μC/OS-IIμC/OS-Ⅱ只是一個即時操作系統(tǒng)內核,其特點:提供任務調度、任務管理、時間管理、記憶體管理和任務間通信和同步等基本功能;沒有提供輸入輸出管理、檔管理、網(wǎng)路等額外的服務。源碼開放及可擴展?;秲?yōu)先順序調度的搶佔式即時內核,在內核之上提供最基本的系統(tǒng)服務。例如:信號量、郵箱、消息佇列、記憶體管理、中斷管理等。應用領域包括可攜式電話、照相機、醫(yī)療器械、音響設備、發(fā)動機控制、高速公路電話系統(tǒng)、自動支付終端、交換機等。2000年,得到美國航空管理局(FAA)的認證,可以用於飛行器中。1.3.3μC/OS-IIμC/OS-Ⅱ具有良好的可移植性。μC/OS-Ⅱ的大部分代碼都是用C語言寫成的,只有與處理器的硬體相關的一部分代碼用組合語言編寫。目前μC/OS-Ⅱ支持ARM、PowerPC、MIPS、68k/ColdFire和x86等多種體系結構。是一個源碼公開、可移植、可裁減、佔用資源少、搶先式的即時多任務操作系統(tǒng)。其絕大部分源碼採用ANSIC寫的,移植性好。高校教學可免費使用。目前的版本是μC/OS-IIV2.72。

1.3.3μC/OS-IIWindowsCE,微軟公司,它是從整體上為資源有限的平臺設計的多線程、完整優(yōu)先權、多任務的操作系統(tǒng)。模組化設計,並允許針對從掌上電腦到專用的工控電子設備進行定制。操作系統(tǒng)的基本內核需要至少200KB的ROM。主要應用於PDA,智能電話(smartphone)等多媒體網(wǎng)路產(chǎn)品。

嵌入式操作系統(tǒng)領域競爭激烈,微軟公司不得不應付來自Linux等免費系統(tǒng)的衝擊。微軟公司在WindowsCE.Net4.2版中,增加一項授權價僅3美元的精簡版本W(wǎng)indowsCE.NetCore?;镜墓δ馨ǎ杭磿rOS核心(RealTimeOSKernel),新檔系統(tǒng),IPv4、IPv6、WLAN、藍牙等聯(lián)網(wǎng)功能,WindowsMediaCodec,.Net開發(fā)框架以及SQLServer.ce。低價版本的WindowsCE.Net,主要是看好語音電話、WLAN的無線橋接器和個性化視聽設備的成長潛力。1.3.4WindowsCE嵌入式LinuxOS與WindowsCE相比的優(yōu)點第一:Linux是開放源代碼,遍佈全球的眾多Linux愛好者都是Linux開發(fā)者的強大技術支持者;WindowsCE6.0內核全部開放,GUI不開放。第二:Linux的內核小、效率高;WindowsCE相比,佔用過多的RAM。第三:Linux是開放源代碼的OS,在價格上極具競爭力,適合中國國情。WindowsCE需要版權費用。第四:Linux不僅支持x86晶片,還是一個跨平臺的系統(tǒng)。更換CPU時就不會遇到更換平臺的困擾。第五:Linux內核的結構在網(wǎng)路方面是非常完整的,它提供了對包括十兆位、百兆位及千兆位的以太網(wǎng)路,還有無線網(wǎng)路、Tokenring(令牌環(huán))和光纖甚至衛(wèi)星的支持,WindowsCE的網(wǎng)路功能也比較強大。嵌入式LinuxOS與WindowsCE相比的弱點第一:LINUX開發(fā)難度較高,需要很高的技術實力,WINCE開發(fā)相對較容易,開發(fā)週期短,內核完善,主要是應用層開發(fā)。第二:LINUX核心調試工具不全,調試不太方便,尚沒有很好的用戶圖形介面,WINCE的GUI豐富,開發(fā)工具強大;第三,系統(tǒng)維護難度大。Linux在使用較完整的GUI時一般會佔用較大的記憶體,如果去掉部分無用的功能來減小使用的記憶體,但是如果不仔細,將引起新的問題。1.4嵌入式系統(tǒng)開發(fā)過程1.4.1嵌入式系統(tǒng)總體結構

1.硬體層:由嵌入式微處理器、週邊電路和外設組成。週邊電路有:電源電路、複位電路、調試介面和記憶體電路,就構成一個嵌入式核心控制模組。

操作系統(tǒng)和應用程式都可以固化在ROM或者Flash中。有些嵌入式系統(tǒng)還包括:LCD、鍵盤、USB介面,以及其他一些功能的擴展電路。1.4.1嵌入式系統(tǒng)總體結構2.中間層:硬體層與軟體層之間為中間層,也稱為BSP(BoardSupportPackage,板級支持包)。作用:將系統(tǒng)軟體與底層硬體部分隔離,使得系統(tǒng)的底層設備驅動程式與硬體無關;功能:具有相關硬體的初始化、數(shù)據(jù)的輸入/輸出操作和硬體設備的配置等功能。BSP是主板硬體環(huán)境和操作系統(tǒng)的中間介面,是軟體平臺中具有硬體依賴性的那一部分,主要目的是為了支持操作系統(tǒng),使之能夠更好地運行於硬體主板上。1.4.1嵌入式系統(tǒng)總體結構3.軟體層 主要是操作系統(tǒng),有的還包括檔系統(tǒng)、圖形用戶介面和網(wǎng)路系統(tǒng)等。操作系統(tǒng)是一個標準的內核,將中斷、I/O、定時器等資源都封裝起來,以方便用戶使用。4.功能層 由基於操作系統(tǒng)開發(fā)的應用程式組成,用來完成對被控對象的控制功能。功能層是面向被控對象和用戶的,為了方便用戶操作,往往需要具有友好的人機介面。1.4.1嵌入式系統(tǒng)總體結構1.4.2嵌入式系統(tǒng)的開發(fā)特點1.採用宿主機/目標機方式,所需要的開發(fā)環(huán)境稱為交叉開發(fā)環(huán)境2.為了保證穩(wěn)定性和即時性,選用RTOS開發(fā)平臺3.生成代碼需要固態(tài)化存儲4.軟體代碼具有高質量、高可靠性1.4.2嵌入式系統(tǒng)的開發(fā)特點嵌入式系統(tǒng)的應用開發(fā)一般由5個階段構成:需求分析設計規(guī)格說明書(功能性和非功能性需求、任務和目標)體系結構設計如何實現(xiàn)需求,對硬體、軟體的功能劃分,硬體、軟體、操作系統(tǒng)的選型硬體/軟體設計軟體(應用程式)和硬體的詳細設計系統(tǒng)集成軟體和硬體集成調試代碼固化。將程式寫入到Flash等非易失性記憶體中。各階段間往往要求不斷地反復和修改,直到最終完成設計目標。1.4.3嵌入式系統(tǒng)開發(fā)流程系統(tǒng)的調試有如下幾種:1.根源程式模擬器(Simulator)

2.即時線上仿真系統(tǒng)ICE(In-CircuitEmulator)方式--是一種完全仿造調試目標CPU設計的儀器3.監(jiān)控器方式4.線上調試器方式ICD5.高級語言編譯器(CompilerTools)1.4.4嵌入式系統(tǒng)調試有關嵌入式系統(tǒng)學習的四個層面:

嵌入式系統(tǒng)分為4層,硬體層、驅動層、操作系統(tǒng)層和應用層。1、硬體層,是整個嵌入式系統(tǒng)的根本,如果現(xiàn)在單片機及介面這塊很熟悉,並且能用C和組合語言來編程的話,從嵌入式系統(tǒng)的硬體層走起來相對容易,硬體層也是驅動層的基礎,一個優(yōu)秀的驅動工程師是要能夠看懂硬體的電路圖和自行完成CPLD的邏輯設計的,同時還要對操作系統(tǒng)內核及其調度性相當?shù)氖煜さ?。但硬體平臺是基礎,增值還要靠軟體。硬體層比較適合於,電子、通信、自動化、機電一體、資訊工程類專業(yè)的人來搞,需要掌握的專業(yè)基礎知識有,單片機原理及介面技術、微機原理及介面技術、C語言。

2、驅動層,這部分比較難,驅動工程師不僅要能看懂電路圖還要能對操作系統(tǒng)內核十分的精通,以便其所寫的驅動程式在系統(tǒng)調用時,不會獨佔操作系統(tǒng)時間片,而導至其他任務不能動行,不懂操作系統(tǒng)內核架構和即時調度性,沒有良好的驅動編寫風格,按大多數(shù)書上所說添加的驅動的方式,很多人都能做到,但可能連個初級的驅動工程師的水準都達不到,這樣所寫的驅動在應用調用時就如同windows下我們打開一個程式運行後,再打開一個程式時,要不就是中斷以前的程式,要不就是等上一會才能運行後來打開的程式。想做個好的驅動人員沒有三、四年功底,操作系統(tǒng)內核不研究上幾遍,是太不容易成功的,但其工資在嵌入式系統(tǒng)四層中可是最高的。驅動層比較適合於電子、通信、自動化、機電一體、資訊工程類專業(yè)尤其是電腦偏體系結構類專業(yè)的人來搞,除硬體層所具備的基礎學科外,還要對數(shù)據(jù)結構與演算法、操作系統(tǒng)原理、編譯原理都要十分精通瞭解。3、操作系統(tǒng)層,對於操作系統(tǒng)層目前可能只能說是簡單的移植,而很少有人來自已寫操作系統(tǒng),或者寫出缺胳膊少腿的操作系統(tǒng)來,這部分工作大都由驅動工程師來完成。操作系統(tǒng)是負責系統(tǒng)任務的調試、磁片和文件的管理,而嵌入式系統(tǒng)的即時性十分重要。據(jù)說,XP操作系統(tǒng)是微軟投入300人用兩年時間才搞定的,總時工時是600人年,中科院軟體所自己的女媧Hopen操作系統(tǒng)估計也得花費幾百人年才能搞定。4、應用層,相對來講較為容易,如果會在windows下進行編程介面函數(shù)調用,到嵌入式操作系統(tǒng)下只是編譯和開發(fā)環(huán)境有相應的變化而已。如果涉及Jave方面的編程也是如此的。嵌入式系統(tǒng)中涉及的演算法由專業(yè)演算法的人來處理的,不必歸結到嵌入式系統(tǒng)範疇內。但如果涉及嵌入式系統(tǒng)下麵嵌入式資料庫、基於嵌入式系統(tǒng)的網(wǎng)路編程和基於某此應用層面的協(xié)議應用開發(fā)(比如基於SIP、H.323、Astrisk)方面又較為複雜,並且有難度了。學習目標與定位

先有目標,再去定位。學ARM,從硬體上講,一方面就是學習介面電路設計,另一方面就是學習彙編和C語言的板級編程。如果從軟體上講,就是要學習基於ARM處理器的操作系統(tǒng)層面的驅動、移植。這些對於初學都來說必須明確,要麼從硬體著手開始學,要麼從操作系統(tǒng)的熟悉到應用開始學,但不管學什麼,只要不是純的操作系統(tǒng)級以上基於API的應用層的編程,硬體的寄存器類的東西還是要能看懂的,基於板級的彙編和C編程還是要會的。因此針對於嵌入式系統(tǒng)的硬體層和驅動層的人,ARM的介面電路設計、ARM的C語言和組合語言編程及調試開發(fā)環(huán)境還是需要掌握的。

學習目標與定位因此對於初學者必然要把握住方向,自己的目標是什麼,自己要在那一層面上走。然後再著手學習較好,與ARM相關的嵌入式系統(tǒng)的較為實際的兩個層面硬體層和驅動層,不管學好了那一層都會很有前途的。

如果想從嵌入式系統(tǒng)的應用層面的走的話,可能與ARM及其體系相去較遠,要著重研究基於嵌入式操作系統(tǒng)的環(huán)境應用與相應開發(fā)工具,比如WinCE操作系統(tǒng)下的EVC應用開發(fā)(與windows下的VC相類似),如果想再有突破就往某些音視頻類的協(xié)議上靠,比如VOIP領域的基於SIP或H.323協(xié)議的應用層開發(fā),或是基於嵌入式網(wǎng)路資料庫的開發(fā)等等。對於初學者來講,要量力而行,不要認為驅動層工資高就把它當成方向了,要結合自身特點,選擇適合自己的目標。嵌入式系統(tǒng)的學習1、分析一種嵌入式操作系統(tǒng)的源代碼。根據(jù)具體需要,在瞭解操作系統(tǒng)基本原理的情況下,選擇需要瞭解的部分,重點分析。建議不通讀。2、分析一種通信協(xié)議棧的實現(xiàn)方式並熟悉相應軟體的使用。3、深入瞭解一種嵌入式開發(fā)。推薦使用GNUTools開發(fā)工具。2.1系統(tǒng)管理命令1.登錄和退出 Login: Logout:2.關機或重新啟動命令shutdown$shutdown–hnow←要求系統(tǒng)立即關機$shutdownnow←要求系統(tǒng)立即關機$shutdown+5←要求5分鐘後關機$shutdown–rnow←要求立即關機系統(tǒng)並重新啟動3.重新開機命令reboot$reboot2.1系統(tǒng)管理命令4.聯(lián)機幫助命令 (1)man顯示幫助手冊

$manCmd$man–fCmd(只顯示命令功能) $man-kfiles (2)系統(tǒng)幫助文檔

#helpCommand適用於內部命令例如:helpcd #Command–help/-h適用於外部命令例如:ls--help(3)whereis用於查詢某個命令存在於哪個目錄

$whereis-brm內部命令:是指寫在bash源碼裏面的,其執(zhí)行速度比外部命令快,因為解析內部命令shell不需要創(chuàng)建子進程。比如:exit,history,cd,jobs,bg,fg,echo外部命令:bash之外額外安裝的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等比如:ls,vi區(qū)分:用type命令可以分辨內部命令與外部命令2.1系統(tǒng)管理命令5.增加用戶帳號

useradd[選項]用戶名

6.修改用戶帳號

usermod[-LU][-c<備註>][-d<登入目錄>][-e<有效期限>][-f<緩衝天數(shù)>][-g<群組>][-G<群組>][-l<帳號名稱>][-s][-u][用戶帳號]7.刪除用戶帳號

userdel[-r][用戶帳號]2.1系統(tǒng)管理命令8.組增加命令 groupadd[-r]group9.組帳號修改命令

groupmod[-g<群組識別碼><-o>][-n<新群組名稱>][群組名稱]10.刪除組帳號 groupdel[群組名稱]2.1系統(tǒng)管理命令11.口令維護命令 passwd[用戶名]12.組中用戶成員的維護

(1)添加用戶到使用的組的命令格式為: gpasswd–a用戶帳號名組帳號名 (2)從組中刪除用戶的命令格式為: gpasswd–d用戶帳號名組帳號名 (3)設置用戶為組管理員的命令格式為: gpasswd-A組管理員用戶列表用戶組

13.顯示用戶和組的狀態(tài)命令id

id

[-gGnru][--help][--version][用戶名稱] 2.1系統(tǒng)管理命令14.用戶切換命令su su[-flmp][-][-c<指令>][-s][用戶帳號]15.顯示指定用戶所屬的組命令 groups用戶名16.監(jiān)控後臺進程命令ps

ps[選項]17.結束進程

kill[-s信號|-p][-a]進程號

18.進程睡眠 sleep[--help][--version]number[smhd]2.2檔管理命令1.顯示檔內容命令cat

cat[選項]檔列表2.複製檔命令cp

cp[選項]原始檔案目標檔

cp[選項]原始檔案組目標目錄3.刪除檔或目錄命令rm

rm[選項]檔列表-rf選項和通配符4.移動或更改檔、目錄名稱命令mv mv[-f][-i]檔1檔2

mv[-f][-i]目錄1目錄2

mv[-f][-i]檔列表目錄5.

鏈接檔的命令

ln[選項]目標[鏈接名]

ln[選項]目標目錄2.3

目錄及其操作命令1.列出檔或目錄

ls[選項][檔目錄列表]-l–a選項2.改變工作目錄 cd[name]3.建立新目錄

mkdir[-m模式][-p目錄名]目錄4.刪除目錄

rmdir-p目錄列表5.變更檔或目錄的許可權命令chmod chmod[選項]檔和目錄列表6.顯示當前工作目錄命令pwd

pwd[--help][--version]7.分頁查看檔內容more

more檔案名

cat檔案名|more2.3目錄及其操作命令Linux是一個多用戶的操作系統(tǒng),有著完善的許可權管理機制。不同的用戶有著不同的許可權,這些許可權決定了用戶能在Linux下執(zhí)行哪些操作。第一項是由10個字元組成的字串,例如“drwxr-xr-x”,說明了該檔/目錄的檔類型和文件訪問許可權。第一個字元表示檔類型。從左起第2個字元到第10個字元表示檔訪問許可權。並且以3個字元為一組,分為3組。組中的每個位置對應一個指定的許可權,其順序為:讀、寫、執(zhí)行。3組字元又分別代表檔所有者許可權、檔從屬組許可權以及其他用戶許可權。chmod命令支持兩種檔許可權設定的方法使用字串設置許可權使用八進制數(shù)設置許可權檔和目錄的許可權可用八進制數(shù)字模式來表示,3個八進制數(shù)字分別表示用戶、用戶所在組成員、其他成員的許可權。許可權的順序是rwx,分別是讀、寫、執(zhí)行例如:許可權是rw-對應的八進制數(shù)為6.2.4檔傳輸與編輯命令1.查找檔命令find

find查找位置[選項參數(shù)]2.查找檔中的字串命令grep grep[選項]匹配字串檔列表3.排序命令sort

sort[選項]檔2.5檔壓縮與磁片掛載命令1.檔壓縮命令gzip

gzip[選項]壓縮(解壓縮)的檔案名

2.檔打包命令tar tar[主選項+輔選項]檔或者目錄3.檔解壓縮命令unzip

unzip[選項]壓縮檔案名.zip4.掛載的mount命令 mount–oiocharset=cp936/dev/cdrom/mnt/cdrom15.卸載的umount命令 umount/mnt/cdrom2.6網(wǎng)路操作命令1.ifconfig命令

ifconfig-interface[options]address2.ip命令

ip[OPTIONS]OBJECT[COMMAND[ARGUMENTS]]3.ping命令

ping[選項]IP地址

4.netstat命令

netstat[選項][-A][--ip]5.telnet命令

telnet[選項][主機名稱IP地址<通信端口>]6.ftp命令

ftp[-dignv][主機名稱或IP地址]建立交叉編譯環(huán)境啟動代碼Bootloader的實現(xiàn)/移植kernel的配置/移植/編譯根檔系統(tǒng)Cramfs的實現(xiàn)嵌入式開發(fā)流程3.1嵌入式Linux的開發(fā)環(huán)境

3.1.1嵌入式Linux開發(fā)環(huán)境建立有幾個嵌入式Linux開發(fā)環(huán)境方案:(1)基於PC機WINDOWS操作系統(tǒng)下的CYGWIN;(2)在WINDOWS下安裝虛擬機VMware軟體,使用redhat9虛擬機,即在虛擬機中安裝LINUX操作系統(tǒng);(3)直接安裝LINUX操作系統(tǒng),也可安裝ubuntu。交叉編譯 交叉編譯就是在一個平臺上生成另一個平臺上的可執(zhí)行代碼。 這裏說的平臺分別指的是主機平臺Host和目標平臺Target。 就我們在ARM平臺上移植Linux來說,Host是一臺一般的PC機,它通過串口或網(wǎng)路介面與Target通信;Target是arm-linux平臺(這裏說的arm指的是平臺所使用的CPU是ARM9處理器,linux指的是運行的操作系統(tǒng)是Linux)。 我們在Host上開發(fā)程式,並在這個平臺上運行交叉編譯器CrossComplier,編譯我們的程式,而由CrossComplier生成的程式將在Target上運行。“既然我們已經(jīng)有了主機編譯器,那為什麼還要交叉編譯呢?”?需要交叉編譯的原因: 首先,在專案的起始階段,目標平臺尚未建立,因此需要做交叉編譯,以生成我們所需要的Bootloader以及kernel(因為Bootloader和kernel的源碼需要經(jīng)過交叉編譯後才可以在目標平臺上運行); 其次,當目標平臺能啟動之後,由於目標平臺上資源的限制,當我們編譯大型程式時,依然可能需要用到交叉編譯。交叉編譯我們在主機平臺上開發(fā)程式,並在這個平臺上運行交叉編譯器,編譯我們的程式;而由交叉編譯器生成的程式在目的平臺上運行。要進行交叉編譯,我們需要在主機平臺上安裝對應的交叉編譯工具鏈(crosscompilationtoolchain),然後用這個交叉編譯工具鏈編譯我們的源代碼,最終生成可在目標平臺上運行的代碼。

armv4l-unknown-linux-gcc:交叉編譯linux內核 arm-linux-gcc:交叉編譯linux內核 arm-elf-gcc:主要交叉編譯uclinux內核 arm-uclinux-gcc:交叉編譯uclinux內核

主要下載網(wǎng)址: 為了在命令行中能夠尋找到交叉編譯器,我們需要把它所在的路徑加入到PATH環(huán)境變數(shù)中(例:/usr/local/arm/bin:$PATH)。常用在ARM平臺的GNUToolchain3.1.2嵌入式Linux開發(fā)的一般過程1.瞭解硬體;2.準備需要使用的Linux工具以及其他工具;3.安排記憶體地址;4.編寫啟動代碼和機器相關代碼;5.編寫驅動程式;6.C庫、GUI和系統(tǒng)程式的移植;7.調試。

3.1嵌入式Linux的開發(fā)環(huán)境3.2Linux開發(fā)工具的使用3.3GNUmake命令和makefile檔3.4使用Automake和Autoconf生成makefile檔3.5嵌入式Linux編輯器vi的使用3.6Emacs綜合編輯器第3章嵌入式Linux的開發(fā)環(huán)境及工具軟體3.2Linux開發(fā)工具的使用

3.2.1Linux開發(fā)工具GNUgcc的使用1、GCC簡介GCC是GNUCompilerCollection的簡稱,GCC是Linux平臺下最常用的編譯程序,除了支持C語言外,還支持多種其他語言,例如C++、Ada、Java、Objective-C、Fortran、Pascal等。GCC支持的體系結構有40餘種,常見的有x86系列、Arm、PowerPC等。同時,GCC還能運行在不同的操作系統(tǒng)上,如Linux、Solaris、Windows等。GCC無所不在宏定義#3.2Linux開發(fā)工具的使用

使用gcc編譯程序時,編譯過程可以細分為4個階段:(1)預處理(Preprocessing)、(2)編譯(Compilation)、(3)彙編(Assembly)(4)鏈接(Linking)。3.2.1Linux開發(fā)工具GNUgcc的使用2、GCC常用模式及選項gcc最基本的用法是:gcc[options]file...

其中options是以“-”開始的各種選項,file是相關的檔案名。在使用gcc的時,必須給出必要的選項和文件名。gcc的整個編譯過程分別是:預處理、編譯,彙編和鏈接。3.2Linux開發(fā)工具的使用

示例程式//helloworld.c#include<stdio.h>intmain(void){printf("HelloWorld!\n");return0;}3.2.1Linux開發(fā)工具GNUgcc的使用2、GCC常用模式及選項GCC最常用的有兩種模式:編譯模式:gcchelloworld.c-ohelloworld編譯連接模式:gcc-chelloworld.c-ohelloworld.o說明:編譯模式生成的二進位機器代碼為可執(zhí)行的;編譯連接模式生成的二進位機器代碼不可執(zhí)行,只生成目標檔helloworld.o。

可以自定義檔案名,如gcc-chelloworld.c-omyHelloWorld.o3.2Linux開發(fā)工具的使用

3.2Linux開發(fā)工具的使用

(1)預處理(Preprocessing):(2)編譯(Compilation):(3)彙編(Assembly):(4)鏈接(Linking):一步到位的編譯指令:gcchelloworld.c-ohelloworldgcc-Ehelloworld.c-ohelloworld.igcc-Shelloworld.i-ohelloworld.sgcc-chelloworld.s-ohelloworld.ogcchelloworld.o-ohelloworld主要作以下幾種事情:所有的#define刪除,並且展開所有的宏定義;處理所有條件編譯指令;處理#include預編譯指令,將被包含的檔插入到該預編譯指令的位置。刪除所有的注釋//和;添加行號和文件標識;保留所有的#pragma編譯器指令;生成彙編代碼編譯為目標檔將程式的目標檔與所需的所有附加的目標檔連接起來,最終生成可執(zhí)行檔3.2.1Linux開發(fā)工具GNUgcc的使用多個檔的編譯通常整個程式是由多個原始檔案組成的,相應地也就形成了多個編譯單元,使用GCC能夠很好地管理這些編譯單元。假設有一個由test1.c和test2.c兩個原始檔案組成的程式,為了對它們進行編譯,並最終生成可執(zhí)行程式test,可以使用以下命令:

gcctest1.ctest2.c-otest3.2Linux開發(fā)工具的使用

gcc-ctest1.c-otest1.ogcc-ctest2.c-otest2.ogcctest1.otest2.o-otest原始檔案頭檔不在同一目錄下怎麼辦?(假設test.c在./src目錄下,而包含檔在./inc目錄下)

$gcctest.c–I

../inc-otest此命令告訴GCC包含檔存放在../inc目錄下,即在當前目錄的上一級。若在編譯時需要的包含檔存放在多個目錄下,可使用多個-I來指定各個目錄:$gcctest.c

–I

../inc–I

../../inc2-otest

這裏指出了另一個包含子目錄inc2,較之前目錄它還要在再上兩級才能找到。

gcc的版本可以使用如下gcc–v命令查看:3.警告功能

當GCC在編譯過程中檢查出錯誤,則中止編譯;但檢測到警告時卻能繼續(xù)編譯生成可執(zhí)行程式。在眾多的警告選項之中,最常用的是-Wall選項。該選項能發(fā)現(xiàn)程式中一系列的常見錯誤警告,舉例如下:

$gcc-Walltest.c-otest該選項相當於同時使用了下列所有的選項:unused-function:遇到僅聲明過但尚未定義的靜態(tài)函數(shù)時發(fā)出警告。unused-label:遇到聲明過但不使用的標號的警告。unused-parameter:從未用過的函數(shù)參數(shù)的警告。

●unused-variable:在本地聲明但從未用過的變數(shù)的警告●unused-value:僅計算但從未用過的值的警告?!駀ormat:檢查對printf和scanf等函數(shù)的調用,確認各參數(shù)類型和格式串中的一致?!駃mplicit-int:警告沒有規(guī)定類型的聲明?!駃mplicit-function-:在函數(shù)在未經(jīng)聲明就使用時給予警告?!馽har-subscripts:警告把char類型作為數(shù)組下標?!駇issing-braces:聚合初始化兩邊缺少大括弧。●Parentheses:在某些情況下如果忽略了括弧,編譯器就發(fā)出警告。當gcc在編譯不符合ANSI/ISOC語言標準的源代碼時,如果加上了-pedantic選項,那麼使用了擴展語法的地方將產(chǎn)生相應的警告資訊

生成可執(zhí)行檔是否可以直接執(zhí)行呢?編譯器會自動鏈接一些程式庫,但是有些程式庫需要手動鏈接。大多數(shù)系統(tǒng)庫都在/lib目錄下。程式庫以lib開頭命名,鏈接時只需寫lib後擴展名前的部分。4.庫依賴函數(shù)庫實際上就是一些頭檔(.h)和庫檔(.so或者.a)的集合。Linux下大多數(shù)函數(shù)都默認將頭檔放到/usr/include/目錄下,而庫檔則放到/usr/lib/目錄下,但並不是所有的情況都是這樣。正因如此,gcc在編譯時必須讓編譯器知道如何來查找所需要的頭檔和庫檔??赏ㄟ^-L選項向gcc的庫檔搜索路徑中添加新的目錄。如:

[david@DAVIDdavid]$gccdavid.c-L/home/david/lib–ldavid-odavid注意:-l選項,指示gcc去連接庫檔david.so。Linux下的庫檔在命名時有一個約定,那就是應該以lib三個字母開頭。由於所有的庫檔都遵循了同樣的規(guī)範,因此在用-l選項指定鏈接的庫檔案名時可以省去lib三個字母。也就是說gcc在對-ldavid進行處理時,會自動去鏈接名為libdavid.so的檔。Linux下的庫檔分為兩大類:動態(tài)鏈接庫(通常以.so結尾)和靜態(tài)鏈接庫(通常以.a結尾),默認情況下,gcc在鏈接時優(yōu)先使用動態(tài)鏈接庫,只有當動態(tài)鏈接庫不存在時才考慮使用靜態(tài)鏈接庫。在編譯時加上-static選項,強制使用靜態(tài)鏈接庫。例如,如果在/home/david/lib/目錄下有鏈接時所需要的庫檔libfoo.so和libfoo.a,為了讓gcc在鏈接時只用到靜態(tài)鏈接庫,可以使用下麵的命令:[david@DAVIDdavid]$gccfoo.c-L/home/david/lib-static–ldavid-odavid3.2.2GDB調試器簡介Linux系統(tǒng)中包含了GNU調試程式gdb,用來調試C和C++程式的調試器。gdb提供如下功能:●運行程式,設置所有的能影響程式運行的參數(shù)和環(huán)境?!窨刂瞥淌皆谥付ǖ臈l件下停止運行?!癞敵淌酵V箷r,可以檢查程式的狀態(tài)。●修改程式的錯誤,並重新運行程式?!駝討B(tài)監(jiān)視程式中變數(shù)的值?!窨梢詥尾綀?zhí)行代碼,觀察程式的運行狀態(tài)。

gdb使用實例1.gdb的啟動在終端窗口中,有兩種方法運行gdb,即在終端窗口的命令行中直接輸入gdb命令或gdbfilename命令運行gdb。方法1:先啟動gdb後執(zhí)行filefilename命令。即gdbfilefilename執(zhí)行上述兩條命令就可啟動gdb,並裝入可執(zhí)行的程式filename。方法2:啟動gdb的同時裝入可執(zhí)行的程式。即gdbfilename其中,filename是要調試的可執(zhí)行檔。這和啟動gdb後執(zhí)行filefilename命令效果完全一樣。啟動gdb後,就可以使用gdb的命令調試程式。2.gdb的基本命令gdb中的命令分為以下幾類:工作環(huán)境相關命令、設置中斷點與恢復命令、源代碼查看命令、查看運行數(shù)據(jù)相關命令及修改運行參數(shù)命令。gdb的命令可以通過help命令進行查找命令所屬的種類(class),可以從相關class找到相應命令。如下所示:(gdb)help此命令可列出命令的種類。(gdb)helpdata此命令查找data類種的命令,並列出data類種的所有命令。

(gdb)helpcall此命令查找call命令。

直接鍵入“help[command]”來查看命令。(1)工作環(huán)境相關命令(2)設置中斷點與恢復命令infob(3)gdb中源碼查看相關命令(4)gdb中查看運行數(shù)據(jù)相關命令(5)其他gdb命令●run命令:執(zhí)行當前被調試的程式?!駅ill命令:停止正在調試的應用程式?!駑atch命令:設置監(jiān)視點,監(jiān)視運算式的變化?!馻watch命令:設置讀寫監(jiān)視點。當要監(jiān)視的運算式被讀或寫時將應用程式掛起。它的語法與watch命令相同?!駌watch命令:設置讀監(jiān)視點,當監(jiān)視運算式被讀時將程式掛起,等侍調試。此命令的語法與watch相同?!駃nfobreak命令:顯示當前中斷點列表,包括每個中斷點到達的次數(shù)?!駃nfofiles命令:顯示調試檔的資訊?!駃nfofunc命令:顯示所有的函數(shù)名?!駃nfolocal命令:顯示當前函數(shù)的所有局部變數(shù)的資訊。●infoprog命令:顯示調試程式的執(zhí)行狀態(tài)?!馭hell命令:執(zhí)行LinuxShell命令?!駇ake命令:不退出gdb而重新編譯生成可執(zhí)行檔。●Quit命令:退出gdb。(6)gdb中修改運行參數(shù)相關命令gdb可修改運行時的參數(shù),並使該變數(shù)按照用戶當前輸入的值繼續(xù)運行。方法為:在單步執(zhí)行的過程中,鍵入命令:set變數(shù)=設定值在此之後,程式就會按照該設定的值運行了。特別注意,在gcc編譯選項中一定要加入”-g”。只有在代碼處於“運行”或“暫停”狀態(tài)時才能查看變數(shù)值,設置中斷點後程式在指定行之前停止。3.3make與makefilegccdriver.cstack.cmisc.c–opolish一旦其中一個檔修改了,需要重新執(zhí)行上面的命令。問題:1)所有的檔都需要重新編譯,若這些原始檔案都很大,編譯時間將大大增加2)若原始檔案數(shù)目眾多,沒有誰會願意一次有一次地輸入輸入如此冗長的命令3.3make與makefile如何解決一?如何解決二?如果更新了其中某個檔,只需gcc-c編譯該檔,然後把所有目標檔鏈接起來(使用上述兩個解決方案中最後一條命令,得到新的可執(zhí)行檔。#gcc-cdriver.c#gcc-cstack.c#gcc-cmisc.c#gccdriver.ostack.omisc.o–opolish#gcc-cdriver.cstack.cmisc.c#gccdriver.ostack.omisc.o–opolish3.3make與makefileC語言寫的軟體都分割成多個原始檔案(.c和.h)。這樣結構相對單一的檔,優(yōu)點是:1)原始檔案短小,易於編輯、編譯和測試,即更具模組化。2)採用該結構使得只有改動的檔才需要編譯,而不是整個系統(tǒng)。3)支持資訊隱藏。即只需知道檔功能,無須知道檔如何寫成。缺點:1)必須知道組成整個系統(tǒng)有哪些檔,檔之間的內在聯(lián)繫,以及自上次編譯以來哪些檔被修改過;2)編譯多檔的C程式時,需要一次又有一次的輸入兩行又長又臭的命令:一個用於編譯目標檔,一個用於把目標檔鏈接成可執(zhí)行檔。3.3.1make解決上述問題的方法使用Linux的make工具。它提供了一種可以用於構建大規(guī)模工程的、強勁而靈活的機制。make工具依賴於一個特殊的名為makefile的檔,這個檔描述了系統(tǒng)中各個模組之間的依賴關係。系統(tǒng)中部分文件改變時,make根據(jù)這些關係決定一個需要重新編譯的檔的最小集合。當軟體系統(tǒng)較大時,用腦子記住所有頭檔、原始檔案、目標檔和執(zhí)行檔之間的依賴關係簡直不可能,make可以幫助我們。3.3.1makemake工具的使用語法:make[-fmakefile][options][target]用途:make工具為名為makefile或Makefile的檔,或者由-f指定的檔makefile中指定的依賴關係對系統(tǒng)進行更新。

常用選項:-d顯示調試資訊-f告訴make使用指定檔作為依賴關係檔,而不是默認的makefile或者Makefile。如果指定的檔案名是-,那麼make將從標準輸入讀入依賴檔。

makefile描述模組之間的依賴關係make規(guī)則make規(guī)則的語法格式

目標檔列表:依賴檔列表

<Tab>命令列表make規(guī)則的另一種寫法

目標檔列表:依賴檔列表;命令列表

(命令用分號隔開)3.3.2makefile目標檔列表依賴檔列表命令列表<Tab>3.3.2makefile3.3make與makefile包含makefile和原始檔案的目錄一般被稱為構建目錄(buildingdirectory),此例中/root/exam01為構建目錄3.3.2makefile為了演示make的功能,現(xiàn)把power.c分割成兩個檔:power.c和compute.c。其中power.c中包含main函數(shù),compute.c中包含compute函數(shù),它被main所調用。如何得到可執(zhí)行檔power?gcc–ccompute.cpower.cgcccompute.opower.o–opower-lm如何編寫make規(guī)則?powerpower.ocompute.opowerpower.ocompute.opower.ccompute.cmake規(guī)則:power:power.ocompute.o

gccpower.ocompute.o–o

power-lmmake規(guī)則:power.o:power.cgcc–cpower.ccompute.o:compute.cgcc–ccompute.c最終的makefile內容:power:power.ocompute.ogccpower.ocompute.o–opower–lmpower.o:power.cgcc–cpower.ccompute.o:compute.cgcc–ccompute.c目標檔列表:依賴檔列表

<Tab>命令列表3.3.2makefilecompute.hmain.hmain.cinput.hinput.ccompute.c練習現(xiàn)把程式結構做進一步修改,把它分割成6個檔:main.c、compute.c、input.c、compute.h、input.h和main.h。compute.h和input.h僅包含了compute和input函數(shù)的聲明但沒有定義。定義部分在compute.c和input.c中。main.h中包含的是兩條顯示給用戶的提示資訊。powermain.oinput.oinput.hinput.hcompute.ocompute.cmain.cmain.hcompute.hinput.ccompute.h3.3.3makefile的規(guī)則1.make可以自動執(zhí)行像下麵例子中的命令:

xxx.o:xxx.czzz.hgcc–cxxx.cmake知道目標檔和相應的原始檔案的名字一般相同(稱之為標準依賴關係),因此,可以把xxx.o:xxx.c這樣的依賴關係從makefile中去掉。power

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論