版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式操作系統1什麼是嵌入式系統? 嵌入式系統(Embeddedsystem)是“以應用為中心,以電腦技術為基礎,並且軟硬體可裁減,適用於應用系統對功能、可靠性、成本、體積、功耗有嚴格要求的專用電腦系統”,是一種“完全嵌入受控器件內部,為特定應用而設計的系統“。按照歷史性、本質性、普遍性要求,嵌入式系統應定義為:“嵌入到對象體系中的專用電腦系統”。“嵌入性”、“專用性”與“電腦系統”是嵌入式系統的三個基本要素。對象系統則是指嵌入式系統所嵌入的宿主系統.1、從硬體上,將基於CPU的處圍器件,整合到CPU晶片內部,比如早期基於X86體系結構下的電腦,CPU只是有運算器和累加器的功能,一切晶片要靠外部橋路來擴展實現,象串口之類的都是靠外部的的串口控制器晶片實現,而目前的這種串口控制器晶片早已集成到CPU內部;PC機有顯卡,而多數嵌入式處理器都帶有LCD控制器,但某種意義上就相當於顯卡。比較高端的ARM類IntelXscale架構下的IXP網路處理器CPU內部集成PCI控制器,網路處理器引擎等。如何理解“嵌入”2、從軟體上,就是在定制操作系統內核裏將應用一併選入,編譯後將內核下載到ROM中。而在定制操作系統內核時所選擇的應用程式組件就是完成了軟體的“嵌入”,比如WinCE在內核定制時,會有相應選擇,其中就是wordpad,PDF,MediaPlay等選擇,如果我們選擇了,在CE啟動後,就可以在介面中找到這些東西,而PC上的windows操作系統,多半的東西都需要我們重新安裝。
3、把軟體內核或應用文件系統等東西燒到嵌入式系統硬體平臺中的ROM中就實現了一個真正的“嵌入”。如何理解“嵌入”
嵌入式系統主要應用領域消費電子工業控制通信設備、家庭設備汽車電子醫療電子軍事國防航空航太 嵌入式系統無處不在,在移動電話、數碼照相機、MP4、數字電視的機頂盒、微波爐、汽車內部的噴油控制系統、ABS(防抱死制動系統)等裝置或設備都使用了嵌入式系統。嵌入式技術正在改變生活為什麼要學習嵌入式系統市場需求 中國具有世界最大嵌入式技術市場,手持儀器設備、資訊家電、城市建設、工業控制、軍事應用,……,嵌入式技術無處不在。企業人才需求 軟硬體設計人才,應用開發人才,綜合性人才,……技術發展趨勢要求
8位、16位、32位,即時操作系統,……目前國內沒有專門的嵌入式系統專業或課程體系 電腦專業:偏軟 電子專業:偏硬為什麼選擇嵌入式行業?嵌入式開發是目前高薪IT職業。嵌入式開發不會像桌面開發那樣容易貶值。嵌入式開發可作為長期職業發展。嵌入式產品無處不在。就業起薪較高。
硬體是其基礎、軟體是其核心與靈魂。硬體主要由嵌入式微處理器、週邊硬體設備組成;軟體主要包括底層系統軟體和用戶應用軟體組成嵌入式系統的組成
1.嵌入式系統硬體組成嵌入式處理器(CPU)是嵌入式系統的核心部分ARM、PowerPC、MC68000、MIPS等週邊設備存儲設備(如RAM、SRAM、Flash等)通信設備(如RS-232介面、以太網介面等)顯示設備(如顯示幕等)嵌入式系統的組成
2.嵌入式系統軟體組成對於使用操作系統的嵌入式系統來說,嵌入式系統軟體結構一般包含4個層面:即時操作系統RTOS、應用程式介面API層、設備驅動層、實際應用程式層。
嵌入式系統軟體組成圖嵌入式系統的組成第1章嵌入式Linux操作系統簡介本章教學目的及要求瞭解Linux的特徵及組成;瞭解Linux的內核結構及相關源代碼;瞭解常見的嵌入式操作系統;瞭解嵌入式系統的開發流程。1.1Linux的特徵及組成1.1.1Linux操作系統發展歷史 Linux最初是專門為基於Intel處理器的個人電腦而設計的。Linux的前身指的是由LinusTorvalds維護開發的開放源代碼的類Unix操作系統的內核。
目前大多數人用它來表示以Linux內核為基礎的整個操作系統。從這種意義講,Linux指的是源碼開放,包含內核和系統工具、完整的開發環境和應用的類Unix操作系統。
同時,Linux遵循GNU(GNU’sNotUnix)的通用公共許可證GPL(GeneralPublicLicense),是自由軟體家族中的一員。自由軟體最早由美國麻省理工學院MIT的RichardStallman提出。自1984年起,在MIT的支持下,Richard創建了自由軟體基金會FSF(FreeSoftwareFoundation)。FSF的主要專案是GNU計畫(革奴計畫),它的目標是建立可自由發佈和可移植的類Unix操作系統。同時,Richard創作了通用公共許可證GPL作為GNU的版權聲明。GPL也叫Copyleft,這與我們平常所說的Copyright截然相反。任何人只要遵循GPL,就可以對Linux內核加以修改併發布給他人使用。
Copyleft標誌什麼是自由軟體?1.1.1Linux操作系統發展歷史2011年11月,Linux內核發佈最新版3.1.2Linux之所以受到廣大電腦愛好者的喜愛主要原因: 一是它屬於自由軟體,用戶不用支付任何費用就可以獲得它和它的源代碼,並且可以根據自己的需要對它進行必要的修改和無約束地繼續傳播。 另一個原因是,它具有Unix的全部功能,任何使用Unix操作系統或想要學習Unix操作系統的人都可以從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做一個免費的操作系統(只是為了愛好),不會像GNU那樣很大很專業)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系統管理員linux系統的維護、配置等linux程式員需c/c++、java,php、jsp…linux軟體工程師(PC)linux嵌入式開發(單片機、晶片)1.Linux系統的特點開放性:指系統遵循世界標準規範,特別是遵循開放系統互連(OSI)國際標準。多用戶:是指系統資源可以被不同用戶使用,每個用戶對自己的資源(例如:檔、設備)有特定的許可權,互不影響。多任務:它是指電腦同時執行多個程式,而且各個程式的運行互相獨立。良好的用戶介面:Linux向用戶提供了3種介面:用戶介面、系統調用、圖形用戶介面。它利用滑鼠、菜單、窗口、滾動條等設施,給用戶呈現一個直觀、易操作、交互性強的友好的圖形化介面1.1.2Linux系統的特點及組成設備獨立性:是指操作系統把所有外部設備統一當作成文件來看待,只要安裝它們的驅動程式,任何用戶都可以象使用檔一樣,操縱、使用這些設備,而不必知道它們的具體存在形式。Linux是具有設備獨立性的操作系統,它的內核具有高度適應能力提供了豐富的網路功能:完善的內置網路是Linux一大特點。可靠的安全系統:Linux採取了許多安全技術措施,包括對讀、寫控制、帶保護的子系統、審計跟蹤、核心授權等,這為網路多用戶環境中的用戶提供了必要的安全保障。良好的可移植性:是指將操作系統從一個平臺轉移到另一個平臺使它仍然能按其自身的方式運行的能力。Linux是一種可移植的操作系統,能夠在從微型電腦到大型電腦的任何環境中和任何平臺上運行。1.1.2Linux系統的特點及組成2.Linux系統的組成Linux一般由以下4部分組成:Linux的內核:內核是系統的核心,是運行程式和管理像磁片和印表機等硬體設備的核心程式。LinuxShell:
Shell是系統的用戶介面,它是一個命令解釋器,它解釋用戶輸入的命令,並且把它們送到內核。提供了用戶與內核進行交互操作的一種介面。Linux應用系統:標準的Linux系統都有一整套稱為應用程式的程式集,包括文本編輯器、編程語言、XWindow、辦公套件、Internet工具、資料庫等。Linux檔系統:
Linux檔系統是檔存放在磁片等存儲設備上的組織方法。Linux能支持多種目前許多的檔系統,如EXT2、EXT3、FAT、VFAT、ISO9660、NFS、SMB等。1.Linux的內核版本 Linux內核採用雙樹結構。一棵樹是穩定樹,主要用於發行;另一棵樹是非穩定樹或開發樹,用於產品開發、改進。 源代碼版本序號的形式為r.x.y,其中r為主版本號,代表較大改動;x為次版本號,表示功能性的改動;y為末版本號,表示BUG的改動(錯誤修補的次數)。其中r介於0到9之間,x和y則介於0到99之間。 對於穩定樹來說,x是偶數;對於開發樹來說,x是比相應穩定樹大1的奇數。例2.4.20為穩定內核版本。 可以從/獲得最新的內核資訊1.1.3Linux的內核版本與發行版本2.Linux的發行版本 Linux的發佈版本就是將Linux核心與應用軟體打包。雖然Linux只有一個標準化的版本,但有好多個不同的發佈版本。如今的Linux已經有超過250種發行版本,且可以支持所有體系結構的處理器,如X86、PowerPC、ARM、XSCALE等,也可以支持帶MMU或不帶MMU的處理器。到目前為止,它的內核版本也已從原先的0.0.1發展到現在的3.x。 紅旗Linux 衝浪Linux 中軟Linux RedHatLinux UbuntuLinux TurboLinuxDebianLinux MandrivaLinux 其中RedHatLinux和UbuntuLinux(適合初學者)比較普遍1.1.3Linux的內核版本與發行版本RedHatLinux的優勢RedHatLinux是最成熟也是目前最流行的一種Linux發佈版本,無論在銷售還是裝機容量上都居榜首。RedHatLinux可運行在多種硬體平臺上。市場上有大量的文章是針對RedHatLinux來介紹的,同時其站點包含有大量文檔,如Users’Guide、FAQ等。在RedHat的300名工程師中,有6名來自於全世界最頂尖的Linux核心開發者,7名來自全球最出色Linux開發工具工程師。全世界,也許只有RedHat能夠把Linux和開源技術以及企業級的培訓、技術支持和諮詢融合得如此美妙。RedHat的培訓及認證被認為是Linux認證的標準。Certification雜誌的最新調查顯示,RHCE(RedHat認證工程師)認證被公認為總體品質最高的國際IT認證。RedHat的發展戰略是每三年發佈一個新版本的企業級Linux操作系統,並且每六個月發佈一次更新。第一階段:linux平臺上的開發,包括vi,gcc,gdb,make,jdk,tomcat,mysql..和linux基本操作第二階段:加厚c語言功底《c專家編程》或是java語言第三階段:學習unix環境高級編程《unix環境高級編程》第四階段:linux應用系統開發/linux嵌入式開發推薦書籍《鳥哥的Linux的私房菜基礎學習篇》鳥哥、許偉、林彩娥等編著《Linux編程從入門到精通》宮虎波編著《Linux內核完全剖析》趙炯編著實踐合理利用網路資源:論壇、視頻等如何學習Linux1.2.1Linux內核結構1.2Linux的內核分析內核負責管理磁片上的檔、記憶體,負責啟動並運行程式,負責從網路上接收和發送數據包等等。內核實際是抽象的資源操作到具體硬體操作細節之間的介面。
從程式員來看,Linux內核抽象了許多硬體細節,使程式員可以以統一的方式進行數據處理。
從用戶來看,Linux是一個資源管理者,幫助用戶方便的管理自己的數據,完成自己的工作。
Linux是多用戶、多任務的操作系統。Linux內核保證每個用戶都象自己獨佔記憶體和其他硬體資源一樣運行其進程,並使各進程公平合理地使用各種資源。1.2.2Linux內核的作用1.2.3Linux內核的抽象結構
5個子系統提供對各種網路協議和網路硬體的支持。分為網路協議和網路設備驅動兩部分。保證多個進程安全地共用記憶體區域。負責控制進程對CPU的訪問。支持進程間各種通信機制為所有設備提供統一的介面,支持數十種不同的檔系統。包括邏輯檔系統和設備驅動程式。各個子系統之間的依賴關係互相依賴。在多道程序環境下,程式要運行必須為之創建進程,而創建進程的第一件事情,就是將程式和數據裝入記憶體。依賴
支持共用記憶體通信機制,這種機制允許兩個進程除了擁有自己的私有空間,還可以存取共同的記憶體區域。虛擬檔系統利用網路介面支持網路檔系統(NFS)記憶體管理利用虛擬檔系統支持交換,交換進程定期由調度程式調度,這也是記憶體管理依賴於進程調度的唯一原因。各個子系統之間的依賴關係
進程調度與記憶體管理之間的關係:這兩個子系統互相依賴。在多道程序環境下,程式要運行必須為之創建進程,而創建進程的第一件事情,就是將程式和數據裝入記憶體。進程間通信與記憶體管理的關係:進程間通信子系統要依賴記憶體管理支持共用記憶體通信機制,這種機制允許兩個進程除了擁有自己的私有空間,還可以存取共同的記憶體區域。
虛擬檔系統與網路介面之間的關係:虛擬檔系統利用網路介面支持網路檔系統(NFS)。記憶體管理與虛擬檔系統之間的關係:記憶體管理利用虛擬檔系統支持交換,交換進程定期由調度程式調度,這也是記憶體管理依賴於進程調度的唯一原因。當一個進程存取的記憶體映射被換出時,記憶體管理向檔系統發出請求,同時,掛起當前正在運行的進程。1.2.3Linux內核的抽象結構
一般在Linux系統中的/usr/src/Linux-*.*.*(*.*.*代表內核版本)目錄下就是內核源代碼。Linux內核非常龐大,包括驅動程式在內有數百兆之多。1.2.4Linux內核的源代碼1.2.4Linux內核的源代碼arch目錄:包含了體系結構相關部分的內核代碼,其中的每一個目錄都代表一種硬體平臺,比如ARM平臺和PC機使用的i386。對於任何一種平臺,都包括以下5個目錄:boot、kernel、lib、mm和math-xxx。顯然,移植工作的重點就是arch目錄下的檔。/mm目錄:包含了所有的記憶體管理代碼。/init目錄:包含了內核的初始化代碼(不是系統的引導代碼),有main.c和version.c兩個檔。內核從此工作。/fs目錄:包含了Linux所支持的所有檔系統。一般來說,檔系統與硬體無關。/ipc目錄:包含了核心進程間的通信代碼。/kernel目錄:包含了內核管理的核心代碼。/include目錄:包含了建立內核代碼時所需的大部分頭檔,比如,與平臺無關的頭檔在include/linux子目錄下。此外,也包括了不同平臺需要的庫檔,比如,asm-arm是ARM平臺需要的庫檔。/net目錄:包含了和網路相關的代碼,其每一個子目錄對應於網路的一個方面。/lib目錄:包含了所有的庫代碼。其他目錄:Documentation目錄包含了許多非常詳細的文檔。Scripts目錄主要在配置內核時用到,存放了配置內核的一些腳本檔,如“makemenuconfig”命令。1.2.4Linux內核的源代碼1.3常見的嵌入式操作系統1.3.1嵌入式操作系統概念和分類
操作系統(OS,OperatingSystem):
是隱藏底層不同硬體的差異,向在其上運行的應用程式提供一個統一的調用介面。
操作系統主要完成三項任務:
記憶體管理多任務管理週邊設備管理。應用程式操作系統系統介面驅動程式硬體硬體硬體硬體1.3.1嵌入式操作系統概念和分類概念嵌入式操作系統(EmbeddedOperatingSystem)
負責嵌入式系統的全部軟、硬體資源的分配、調度、控制、協調;能夠通過加載/卸載某些模組來達到系統所要求的功能。EOS是相對於一般操作系統而言的,它除具備了一般操作系統最基本的功能,如任務調度、同步機制、中斷處理、檔處理等外,還有以下特點:強穩定性,弱交互性:具有很強的穩定性;較強的即時性;可伸縮性:開放、可伸縮性的體系結構;外設介面的統一性:提供各種設備驅動介面。即時操作系統(Real-TimeOperatingSystem,RTOS),是指操作系統本身要能在一個固定時限內對程式調用(或外部事件)做出正確的反應,亦即對時序與穩定性的要求十分嚴格。目前國際較為知名的有:VxWorks、NeutrinoRTOS、NucleusPlus、OS/9、VRTX、LinuxOS,RTLinux、BlueCatRT等。通用型操作系統:執行性能與反應速度比起即時操作系統,相對沒有那麼嚴格。目前較知名的有:WindowsCE、PalmOS、TimeSysLinux/GPL、BlueCatLinux等。
嵌入式操作系統的性能通常取決於核心程式,而核心的工作主要在任務管理(TaskManagement)、任務調度(TaskScheduling)、進程間的通信(IPC)、記憶體管理(MemoryManagement)。1.3.1嵌入式操作系統概念和分類分類比較著名的嵌入式操作系統(瞭解)嵌入式LinuxμC/OS-IIWindowsCEVxWorksQNX 利用Linux搭建嵌入式操作系統是近年來最令人振奮的方案之一,Linux將來可能會成為嵌入式系統主流操作系統。
1.3.2嵌入式Linux(1)嵌入式Linux是按照嵌入式操作系統的要求而設計的一種小型操作系統。由一個內核及一些根據需要進行定制的系統模組組成。其kernel很小,一般只有幾百kB左右。即使加上其他必須的模組和應用程式,所需的存儲空間也很小。它有多任務、多進程的系統特徵,有些還具有即時性。
1.3.2嵌入式Linux(2)嵌入式Linux操作系統的優勢(1)、支持多種體系結構; 目前Linux能夠支持x86,ARM,IPS,APARC等多種CPU的體系機構,已被移植到數十種硬體平臺上。(2)、多任務,內核穩定,可定制,源代碼開放;(3)、強大的網路支持功能; 支持TCP/IP協議,及其上的高層協議,如ftp,Telnet,http等。同時支持Socket網路編程。(4)、支持多檔系統;
linux支持FAT32,EXT2,EXT3等多種檔系統,支持虛擬檔系統,同時還可以連接其他的檔系統,如ROMFS,JFFS等檔系統。嵌入式Linux操作系統的優勢(5)、驅動豐富,支持大量的外設;
linux支持基本所有的PC外設,具有豐富的外設驅動程式。(6)、Linux具備一整套工具鏈。容易自行建立嵌入式系統的開發環境、交叉運行環境,並且可以跨越嵌入式系統開發中仿真工具的障礙。一般開發嵌入式操作系統的程式調試和跟蹤都是使用仿真器來實現的,而使用Linux系統做原型的時候,可以繞過這個障礙,直接使用內核調試器來做操作系統的內核調試和查錯。μC/OS是一個典型的即時操作系統。該系統從1992年開始發展,目前流行的是第二個版本,即μC/OSII。名稱μC/OS-II來源於術語Micro-ControllerOperatingSystem(微控制器操作系統)。它通常也稱為MUCOS或者UCOS。1.3.3μC/OS-IIμC/OS-Ⅱ只是一個即時操作系統內核,其特點:提供任務調度、任務管理、時間管理、記憶體管理和任務間通信和同步等基本功能;沒有提供輸入輸出管理、檔管理、網路等額外的服務。源碼開放及可擴展。基於優先順序調度的搶佔式即時內核,在內核之上提供最基本的系統服務。例如:信號量、郵箱、消息佇列、記憶體管理、中斷管理等。應用領域包括可攜式電話、照相機、醫療器械、音響設備、發動機控制、高速公路電話系統、自動支付終端、交換機等。2000年,得到美國航空管理局(FAA)的認證,可以用於飛行器中。1.3.3μC/OS-IIμC/OS-Ⅱ具有良好的可移植性。μC/OS-Ⅱ的大部分代碼都是用C語言寫成的,只有與處理器的硬體相關的一部分代碼用組合語言編寫。目前μC/OS-Ⅱ支持ARM、PowerPC、MIPS、68k/ColdFire和x86等多種體系結構。是一個源碼公開、可移植、可裁減、佔用資源少、搶先式的即時多任務操作系統。其絕大部分源碼採用ANSIC寫的,移植性好。高校教學可免費使用。目前的版本是μC/OS-IIV2.72。
1.3.3μC/OS-IIWindowsCE,微軟公司,它是從整體上為資源有限的平臺設計的多線程、完整優先權、多任務的操作系統。模組化設計,並允許針對從掌上電腦到專用的工控電子設備進行定制。操作系統的基本內核需要至少200KB的ROM。主要應用於PDA,智能電話(smartphone)等多媒體網路產品。
嵌入式操作系統領域競爭激烈,微軟公司不得不應付來自Linux等免費系統的衝擊。微軟公司在WindowsCE.Net4.2版中,增加一項授權價僅3美元的精簡版本WindowsCE.NetCore。基本的功能包括:即時OS核心(RealTimeOSKernel),新檔系統,IPv4、IPv6、WLAN、藍牙等聯網功能,WindowsMediaCodec,.Net開發框架以及SQLServer.ce。低價版本的WindowsCE.Net,主要是看好語音電話、WLAN的無線橋接器和個性化視聽設備的成長潛力。1.3.4WindowsCE嵌入式LinuxOS與WindowsCE相比的優點第一:Linux是開放源代碼,遍佈全球的眾多Linux愛好者都是Linux開發者的強大技術支持者;WindowsCE6.0內核全部開放,GUI不開放。第二:Linux的內核小、效率高;WindowsCE相比,佔用過多的RAM。第三:Linux是開放源代碼的OS,在價格上極具競爭力,適合中國國情。WindowsCE需要版權費用。第四:Linux不僅支持x86晶片,還是一個跨平臺的系統。更換CPU時就不會遇到更換平臺的困擾。第五:Linux內核的結構在網路方面是非常完整的,它提供了對包括十兆位、百兆位及千兆位的以太網路,還有無線網路、Tokenring(令牌環)和光纖甚至衛星的支持,WindowsCE的網路功能也比較強大。嵌入式LinuxOS與WindowsCE相比的弱點第一:LINUX開發難度較高,需要很高的技術實力,WINCE開發相對較容易,開發週期短,內核完善,主要是應用層開發。第二:LINUX核心調試工具不全,調試不太方便,尚沒有很好的用戶圖形介面,WINCE的GUI豐富,開發工具強大;第三,系統維護難度大。Linux在使用較完整的GUI時一般會佔用較大的記憶體,如果去掉部分無用的功能來減小使用的記憶體,但是如果不仔細,將引起新的問題。1.4嵌入式系統開發過程1.4.1嵌入式系統總體結構
1.硬體層:由嵌入式微處理器、週邊電路和外設組成。週邊電路有:電源電路、複位電路、調試介面和記憶體電路,就構成一個嵌入式核心控制模組。
操作系統和應用程式都可以固化在ROM或者Flash中。有些嵌入式系統還包括:LCD、鍵盤、USB介面,以及其他一些功能的擴展電路。1.4.1嵌入式系統總體結構2.中間層:硬體層與軟體層之間為中間層,也稱為BSP(BoardSupportPackage,板級支持包)。作用:將系統軟體與底層硬體部分隔離,使得系統的底層設備驅動程式與硬體無關;功能:具有相關硬體的初始化、數據的輸入/輸出操作和硬體設備的配置等功能。BSP是主板硬體環境和操作系統的中間介面,是軟體平臺中具有硬體依賴性的那一部分,主要目的是為了支持操作系統,使之能夠更好地運行於硬體主板上。1.4.1嵌入式系統總體結構3.軟體層 主要是操作系統,有的還包括檔系統、圖形用戶介面和網路系統等。操作系統是一個標準的內核,將中斷、I/O、定時器等資源都封裝起來,以方便用戶使用。4.功能層 由基於操作系統開發的應用程式組成,用來完成對被控對象的控制功能。功能層是面向被控對象和用戶的,為了方便用戶操作,往往需要具有友好的人機介面。1.4.1嵌入式系統總體結構1.4.2嵌入式系統的開發特點1.採用宿主機/目標機方式,所需要的開發環境稱為交叉開發環境2.為了保證穩定性和即時性,選用RTOS開發平臺3.生成代碼需要固態化存儲4.軟體代碼具有高質量、高可靠性1.4.2嵌入式系統的開發特點嵌入式系統的應用開發一般由5個階段構成:需求分析設計規格說明書(功能性和非功能性需求、任務和目標)體系結構設計如何實現需求,對硬體、軟體的功能劃分,硬體、軟體、操作系統的選型硬體/軟體設計軟體(應用程式)和硬體的詳細設計系統集成軟體和硬體集成調試代碼固化。將程式寫入到Flash等非易失性記憶體中。各階段間往往要求不斷地反復和修改,直到最終完成設計目標。1.4.3嵌入式系統開發流程系統的調試有如下幾種:1.根源程式模擬器(Simulator)
2.即時線上仿真系統ICE(In-CircuitEmulator)方式--是一種完全仿造調試目標CPU設計的儀器3.監控器方式4.線上調試器方式ICD5.高級語言編譯器(CompilerTools)1.4.4嵌入式系統調試有關嵌入式系統學習的四個層面:
嵌入式系統分為4層,硬體層、驅動層、操作系統層和應用層。1、硬體層,是整個嵌入式系統的根本,如果現在單片機及介面這塊很熟悉,並且能用C和組合語言來編程的話,從嵌入式系統的硬體層走起來相對容易,硬體層也是驅動層的基礎,一個優秀的驅動工程師是要能夠看懂硬體的電路圖和自行完成CPLD的邏輯設計的,同時還要對操作系統內核及其調度性相當的熟悉的。但硬體平臺是基礎,增值還要靠軟體。硬體層比較適合於,電子、通信、自動化、機電一體、資訊工程類專業的人來搞,需要掌握的專業基礎知識有,單片機原理及介面技術、微機原理及介面技術、C語言。
2、驅動層,這部分比較難,驅動工程師不僅要能看懂電路圖還要能對操作系統內核十分的精通,以便其所寫的驅動程式在系統調用時,不會獨佔操作系統時間片,而導至其他任務不能動行,不懂操作系統內核架構和即時調度性,沒有良好的驅動編寫風格,按大多數書上所說添加的驅動的方式,很多人都能做到,但可能連個初級的驅動工程師的水準都達不到,這樣所寫的驅動在應用調用時就如同windows下我們打開一個程式運行後,再打開一個程式時,要不就是中斷以前的程式,要不就是等上一會才能運行後來打開的程式。想做個好的驅動人員沒有三、四年功底,操作系統內核不研究上幾遍,是太不容易成功的,但其工資在嵌入式系統四層中可是最高的。驅動層比較適合於電子、通信、自動化、機電一體、資訊工程類專業尤其是電腦偏體系結構類專業的人來搞,除硬體層所具備的基礎學科外,還要對數據結構與演算法、操作系統原理、編譯原理都要十分精通瞭解。3、操作系統層,對於操作系統層目前可能只能說是簡單的移植,而很少有人來自已寫操作系統,或者寫出缺胳膊少腿的操作系統來,這部分工作大都由驅動工程師來完成。操作系統是負責系統任務的調試、磁片和文件的管理,而嵌入式系統的即時性十分重要。據說,XP操作系統是微軟投入300人用兩年時間才搞定的,總時工時是600人年,中科院軟體所自己的女媧Hopen操作系統估計也得花費幾百人年才能搞定。4、應用層,相對來講較為容易,如果會在windows下進行編程介面函數調用,到嵌入式操作系統下只是編譯和開發環境有相應的變化而已。如果涉及Jave方面的編程也是如此的。嵌入式系統中涉及的演算法由專業演算法的人來處理的,不必歸結到嵌入式系統範疇內。但如果涉及嵌入式系統下麵嵌入式資料庫、基於嵌入式系統的網路編程和基於某此應用層面的協議應用開發(比如基於SIP、H.323、Astrisk)方面又較為複雜,並且有難度了。學習目標與定位
先有目標,再去定位。學ARM,從硬體上講,一方面就是學習介面電路設計,另一方面就是學習彙編和C語言的板級編程。如果從軟體上講,就是要學習基於ARM處理器的操作系統層面的驅動、移植。這些對於初學都來說必須明確,要麼從硬體著手開始學,要麼從操作系統的熟悉到應用開始學,但不管學什麼,只要不是純的操作系統級以上基於API的應用層的編程,硬體的寄存器類的東西還是要能看懂的,基於板級的彙編和C編程還是要會的。因此針對於嵌入式系統的硬體層和驅動層的人,ARM的介面電路設計、ARM的C語言和組合語言編程及調試開發環境還是需要掌握的。
學習目標與定位因此對於初學者必然要把握住方向,自己的目標是什麼,自己要在那一層面上走。然後再著手學習較好,與ARM相關的嵌入式系統的較為實際的兩個層面硬體層和驅動層,不管學好了那一層都會很有前途的。
如果想從嵌入式系統的應用層面的走的話,可能與ARM及其體系相去較遠,要著重研究基於嵌入式操作系統的環境應用與相應開發工具,比如WinCE操作系統下的EVC應用開發(與windows下的VC相類似),如果想再有突破就往某些音視頻類的協議上靠,比如VOIP領域的基於SIP或H.323協議的應用層開發,或是基於嵌入式網路資料庫的開發等等。對於初學者來講,要量力而行,不要認為驅動層工資高就把它當成方向了,要結合自身特點,選擇適合自己的目標。嵌入式系統的學習1、分析一種嵌入式操作系統的源代碼。根據具體需要,在瞭解操作系統基本原理的情況下,選擇需要瞭解的部分,重點分析。建議不通讀。2、分析一種通信協議棧的實現方式並熟悉相應軟體的使用。3、深入瞭解一種嵌入式開發。推薦使用GNUTools開發工具。2.1系統管理命令1.登錄和退出 Login: Logout:2.關機或重新啟動命令shutdown$shutdown–hnow←要求系統立即關機$shutdownnow←要求系統立即關機$shutdown+5←要求5分鐘後關機$shutdown–rnow←要求立即關機系統並重新啟動3.重新開機命令reboot$reboot2.1系統管理命令4.聯機幫助命令 (1)man顯示幫助手冊
$manCmd$man–fCmd(只顯示命令功能) $man-kfiles (2)系統幫助文檔
#helpCommand適用於內部命令例如:helpcd #Command–help/-h適用於外部命令例如:ls--help(3)whereis用於查詢某個命令存在於哪個目錄
$whereis-brm內部命令:是指寫在bash源碼裏面的,其執行速度比外部命令快,因為解析內部命令shell不需要創建子進程。比如:exit,history,cd,jobs,bg,fg,echo外部命令:bash之外額外安裝的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等比如:ls,vi區分:用type命令可以分辨內部命令與外部命令2.1系統管理命令5.增加用戶帳號
useradd[選項]用戶名
6.修改用戶帳號
usermod[-LU][-c<備註>][-d<登入目錄>][-e<有效期限>][-f<緩衝天數>][-g<群組>][-G<群組>][-l<帳號名稱>][-s][-u][用戶帳號]7.刪除用戶帳號
userdel[-r][用戶帳號]2.1系統管理命令8.組增加命令 groupadd[-r]group9.組帳號修改命令
groupmod[-g<群組識別碼><-o>][-n<新群組名稱>][群組名稱]10.刪除組帳號 groupdel[群組名稱]2.1系統管理命令11.口令維護命令 passwd[用戶名]12.組中用戶成員的維護
(1)添加用戶到使用的組的命令格式為: gpasswd–a用戶帳號名組帳號名 (2)從組中刪除用戶的命令格式為: gpasswd–d用戶帳號名組帳號名 (3)設置用戶為組管理員的命令格式為: gpasswd-A組管理員用戶列表用戶組
13.顯示用戶和組的狀態命令id
id
[-gGnru][--help][--version][用戶名稱] 2.1系統管理命令14.用戶切換命令su su[-flmp][-][-c<指令>][-s][用戶帳號]15.顯示指定用戶所屬的組命令 groups用戶名16.監控後臺進程命令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是一個多用戶的操作系統,有著完善的許可權管理機制。不同的用戶有著不同的許可權,這些許可權決定了用戶能在Linux下執行哪些操作。第一項是由10個字元組成的字串,例如“drwxr-xr-x”,說明了該檔/目錄的檔類型和文件訪問許可權。第一個字元表示檔類型。從左起第2個字元到第10個字元表示檔訪問許可權。並且以3個字元為一組,分為3組。組中的每個位置對應一個指定的許可權,其順序為:讀、寫、執行。3組字元又分別代表檔所有者許可權、檔從屬組許可權以及其他用戶許可權。chmod命令支持兩種檔許可權設定的方法使用字串設置許可權使用八進制數設置許可權檔和目錄的許可權可用八進制數字模式來表示,3個八進制數字分別表示用戶、用戶所在組成員、其他成員的許可權。許可權的順序是rwx,分別是讀、寫、執行例如:許可權是rw-對應的八進制數為6.2.4檔傳輸與編輯命令1.查找檔命令find
find查找位置[選項參數]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網路操作命令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地址]建立交叉編譯環境啟動代碼Bootloader的實現/移植kernel的配置/移植/編譯根檔系統Cramfs的實現嵌入式開發流程3.1嵌入式Linux的開發環境
3.1.1嵌入式Linux開發環境建立有幾個嵌入式Linux開發環境方案:(1)基於PC機WINDOWS操作系統下的CYGWIN;(2)在WINDOWS下安裝虛擬機VMware軟體,使用redhat9虛擬機,即在虛擬機中安裝LINUX操作系統;(3)直接安裝LINUX操作系統,也可安裝ubuntu。交叉編譯 交叉編譯就是在一個平臺上生成另一個平臺上的可執行代碼。 這裏說的平臺分別指的是主機平臺Host和目標平臺Target。 就我們在ARM平臺上移植Linux來說,Host是一臺一般的PC機,它通過串口或網路介面與Target通信;Target是arm-linux平臺(這裏說的arm指的是平臺所使用的CPU是ARM9處理器,linux指的是運行的操作系統是Linux)。 我們在Host上開發程式,並在這個平臺上運行交叉編譯器CrossComplier,編譯我們的程式,而由CrossComplier生成的程式將在Target上運行。“既然我們已經有了主機編譯器,那為什麼還要交叉編譯呢?”?需要交叉編譯的原因: 首先,在專案的起始階段,目標平臺尚未建立,因此需要做交叉編譯,以生成我們所需要的Bootloader以及kernel(因為Bootloader和kernel的源碼需要經過交叉編譯後才可以在目標平臺上運行); 其次,當目標平臺能啟動之後,由於目標平臺上資源的限制,當我們編譯大型程式時,依然可能需要用到交叉編譯。交叉編譯我們在主機平臺上開發程式,並在這個平臺上運行交叉編譯器,編譯我們的程式;而由交叉編譯器生成的程式在目的平臺上運行。要進行交叉編譯,我們需要在主機平臺上安裝對應的交叉編譯工具鏈(crosscompilationtoolchain),然後用這個交叉編譯工具鏈編譯我們的源代碼,最終生成可在目標平臺上運行的代碼。
armv4l-unknown-linux-gcc:交叉編譯linux內核 arm-linux-gcc:交叉編譯linux內核 arm-elf-gcc:主要交叉編譯uclinux內核 arm-uclinux-gcc:交叉編譯uclinux內核
主要下載網址: 為了在命令行中能夠尋找到交叉編譯器,我們需要把它所在的路徑加入到PATH環境變數中(例:/usr/local/arm/bin:$PATH)。常用在ARM平臺的GNUToolchain3.1.2嵌入式Linux開發的一般過程1.瞭解硬體;2.準備需要使用的Linux工具以及其他工具;3.安排記憶體地址;4.編寫啟動代碼和機器相關代碼;5.編寫驅動程式;6.C庫、GUI和系統程式的移植;7.調試。
3.1嵌入式Linux的開發環境3.2Linux開發工具的使用3.3GNUmake命令和makefile檔3.4使用Automake和Autoconf生成makefile檔3.5嵌入式Linux編輯器vi的使用3.6Emacs綜合編輯器第3章嵌入式Linux的開發環境及工具軟體3.2Linux開發工具的使用
3.2.1Linux開發工具GNUgcc的使用1、GCC簡介GCC是GNUCompilerCollection的簡稱,GCC是Linux平臺下最常用的編譯程序,除了支持C語言外,還支持多種其他語言,例如C++、Ada、Java、Objective-C、Fortran、Pascal等。GCC支持的體系結構有40餘種,常見的有x86系列、Arm、PowerPC等。同時,GCC還能運行在不同的操作系統上,如Linux、Solaris、Windows等。GCC無所不在宏定義#3.2Linux開發工具的使用
使用gcc編譯程序時,編譯過程可以細分為4個階段:(1)預處理(Preprocessing)、(2)編譯(Compilation)、(3)彙編(Assembly)(4)鏈接(Linking)。3.2.1Linux開發工具GNUgcc的使用2、GCC常用模式及選項gcc最基本的用法是:gcc[options]file...
其中options是以“-”開始的各種選項,file是相關的檔案名。在使用gcc的時,必須給出必要的選項和文件名。gcc的整個編譯過程分別是:預處理、編譯,彙編和鏈接。3.2Linux開發工具的使用
示例程式//helloworld.c#include<stdio.h>intmain(void){printf("HelloWorld!\n");return0;}3.2.1Linux開發工具GNUgcc的使用2、GCC常用模式及選項GCC最常用的有兩種模式:編譯模式:gcchelloworld.c-ohelloworld編譯連接模式:gcc-chelloworld.c-ohelloworld.o說明:編譯模式生成的二進位機器代碼為可執行的;編譯連接模式生成的二進位機器代碼不可執行,只生成目標檔helloworld.o。
可以自定義檔案名,如gcc-chelloworld.c-omyHelloWorld.o3.2Linux開發工具的使用
3.2Linux開發工具的使用
(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編譯器指令;生成彙編代碼編譯為目標檔將程式的目標檔與所需的所有附加的目標檔連接起來,最終生成可執行檔3.2.1Linux開發工具GNUgcc的使用多個檔的編譯通常整個程式是由多個原始檔案組成的,相應地也就形成了多個編譯單元,使用GCC能夠很好地管理這些編譯單元。假設有一個由test1.c和test2.c兩個原始檔案組成的程式,為了對它們進行編譯,並最終生成可執行程式test,可以使用以下命令:
gcctest1.ctest2.c-otest3.2Linux開發工具的使用
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在編譯過程中檢查出錯誤,則中止編譯;但檢測到警告時卻能繼續編譯生成可執行程式。在眾多的警告選項之中,最常用的是-Wall選項。該選項能發現程式中一系列的常見錯誤警告,舉例如下:
$gcc-Walltest.c-otest該選項相當於同時使用了下列所有的選項:unused-function:遇到僅聲明過但尚未定義的靜態函數時發出警告。unused-label:遇到聲明過但不使用的標號的警告。unused-parameter:從未用過的函數參數的警告。
●unused-variable:在本地聲明但從未用過的變數的警告●unused-value:僅計算但從未用過的值的警告。●format:檢查對printf和scanf等函數的調用,確認各參數類型和格式串中的一致。●implicit-int:警告沒有規定類型的聲明。●implicit-function-:在函數在未經聲明就使用時給予警告。●char-subscripts:警告把char類型作為數組下標。●missing-braces:聚合初始化兩邊缺少大括弧。●Parentheses:在某些情況下如果忽略了括弧,編譯器就發出警告。當gcc在編譯不符合ANSI/ISOC語言標準的源代碼時,如果加上了-pedantic選項,那麼使用了擴展語法的地方將產生相應的警告資訊
生成可執行檔是否可以直接執行呢?編譯器會自動鏈接一些程式庫,但是有些程式庫需要手動鏈接。大多數系統庫都在/lib目錄下。程式庫以lib開頭命名,鏈接時只需寫lib後擴展名前的部分。4.庫依賴函數庫實際上就是一些頭檔(.h)和庫檔(.so或者.a)的集合。Linux下大多數函數都默認將頭檔放到/usr/include/目錄下,而庫檔則放到/usr/lib/目錄下,但並不是所有的情況都是這樣。正因如此,gcc在編譯時必須讓編譯器知道如何來查找所需要的頭檔和庫檔。可通過-L選項向gcc的庫檔搜索路徑中添加新的目錄。如:
[david@DAVIDdavid]$gccdavid.c-L/home/david/lib–ldavid-odavid注意:-l選項,指示gcc去連接庫檔david.so。Linux下的庫檔在命名時有一個約定,那就是應該以lib三個字母開頭。由於所有的庫檔都遵循了同樣的規範,因此在用-l選項指定鏈接的庫檔案名時可以省去lib三個字母。也就是說gcc在對-ldavid進行處理時,會自動去鏈接名為libdavid.so的檔。Linux下的庫檔分為兩大類:動態鏈接庫(通常以.so結尾)和靜態鏈接庫(通常以.a結尾),默認情況下,gcc在鏈接時優先使用動態鏈接庫,只有當動態鏈接庫不存在時才考慮使用靜態鏈接庫。在編譯時加上-static選項,強制使用靜態鏈接庫。例如,如果在/home/david/lib/目錄下有鏈接時所需要的庫檔libfoo.so和libfoo.a,為了讓gcc在鏈接時只用到靜態鏈接庫,可以使用下麵的命令:[david@DAVIDdavid]$gccfoo.c-L/home/david/lib-static–ldavid-odavid3.2.2GDB調試器簡介Linux系統中包含了GNU調試程式gdb,用來調試C和C++程式的調試器。gdb提供如下功能:●運行程式,設置所有的能影響程式運行的參數和環境。●控制程式在指定的條件下停止運行。●當程式停止時,可以檢查程式的狀態。●修改程式的錯誤,並重新運行程式。●動態監視程式中變數的值。●可以單步執行代碼,觀察程式的運行狀態。
gdb使用實例1.gdb的啟動在終端窗口中,有兩種方法運行gdb,即在終端窗口的命令行中直接輸入gdb命令或gdbfilename命令運行gdb。方法1:先啟動gdb後執行filefilename命令。即gdbfilefilename執行上述兩條命令就可啟動gdb,並裝入可執行的程式filename。方法2:啟動gdb的同時裝入可執行的程式。即gdbfilename其中,filename是要調試的可執行檔。這和啟動gdb後執行filefilename命令效果完全一樣。啟動gdb後,就可以使用gdb的命令調試程式。2.gdb的基本命令gdb中的命令分為以下幾類:工作環境相關命令、設置中斷點與恢復命令、源代碼查看命令、查看運行數據相關命令及修改運行參數命令。gdb的命令可以通過help命令進行查找命令所屬的種類(class),可以從相關class找到相應命令。如下所示:(gdb)help此命令可列出命令的種類。(gdb)helpdata此命令查找data類種的命令,並列出data類種的所有命令。
(gdb)helpcall此命令查找call命令。
直接鍵入“help[command]”來查看命令。(1)工作環境相關命令(2)設置中斷點與恢復命令infob(3)gdb中源碼查看相關命令(4)gdb中查看運行數據相關命令(5)其他gdb命令●run命令:執行當前被調試的程式。●kill命令:停止正在調試的應用程式。●watch命令:設置監視點,監視運算式的變化。●awatch命令:設置讀寫監視點。當要監視的運算式被讀或寫時將應用程式掛起。它的語法與watch命令相同。●rwatch命令:設置讀監視點,當監視運算式被讀時將程式掛起,等侍調試。此命令的語法與watch相同。●infobreak命令:顯示當前中斷點列表,包括每個中斷點到達的次數。●infofiles命令:顯示調試檔的資訊。●infofunc命令:顯示所有的函數名。●infolocal命令:顯示當前函數的所有局部變數的資訊。●infoprog命令:顯示調試程式的執行狀態。●Shell命令:執行LinuxShell命令。●make命令:不退出gdb而重新編譯生成可執行檔。●Quit命令:退出gdb。(6)gdb中修改運行參數相關命令gdb可修改運行時的參數,並使該變數按照用戶當前輸入的值繼續運行。方法為:在單步執行的過程中,鍵入命令:set變數=設定值在此之後,程式就會按照該設定的值運行了。特別注意,在gcc編譯選項中一定要加入”-g”。只有在代碼處於“運行”或“暫停”狀態時才能查看變數值,設置中斷點後程式在指定行之前停止。3.3make與makefilegccdriver.cstack.cmisc.c–opolish一旦其中一個檔修改了,需要重新執行上面的命令。問題:1)所有的檔都需要重新編譯,若這些原始檔案都很大,編譯時間將大大增加2)若原始檔案數目眾多,沒有誰會願意一次有一次地輸入輸入如此冗長的命令3.3make與makefile如何解決一?如何解決二?如果更新了其中某個檔,只需gcc-c編譯該檔,然後把所有目標檔鏈接起來(使用上述兩個解決方案中最後一條命令,得到新的可執行檔。#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)。這樣結構相對單一的檔,優點是:1)原始檔案短小,易於編輯、編譯和測試,即更具模組化。2)採用該結構使得只有改動的檔才需要編譯,而不是整個系統。3)支持資訊隱藏。即只需知道檔功能,無須知道檔如何寫成。缺點:1)必須知道組成整個系統有哪些檔,檔之間的內在聯繫,以及自上次編譯以來哪些檔被修改過;2)編譯多檔的C程式時,需要一次又有一次的輸入兩行又長又臭的命令:一個用於編譯目標檔,一個用於把目標檔鏈接成可執行檔。3.3.1make解決上述問題的方法使用Linux的make工具。它提供了一種可以用於構建大規模工程的、強勁而靈活的機制。make工具依賴於一個特殊的名為makefile的檔,這個檔描述了系統中各個模組之間的依賴關係。系統中部分文件改變時,make根據這些關係決定一個需要重新編譯的檔的最小集合。當軟體系統較大時,用腦子記住所有頭檔、原始檔案、目標檔和執行檔之間的依賴關係簡直不可能,make可以幫助我們。3.3.1makemake工具的使用語法:make[-fmakefile][options][target]用途:make工具為名為makefile或Makefile的檔,或者由-f指定的檔makefile中指定的依賴關係對系統進行更新。
常用選項:-d顯示調試資訊-f告訴make使用指定檔作為依賴關係檔,而不是默認的makefile或者Makefile。如果指定的檔案名是-,那麼make將從標準輸入讀入依賴檔。
makefile描述模組之間的依賴關係make規則make規則的語法格式
目標檔列表:依賴檔列表
<Tab>命令列表make規則的另一種寫法
目標檔列表:依賴檔列表;命令列表
(命令用分號隔開)3.3.2makefile目標檔列表依賴檔列表命令列表<Tab>3.3.2makefile3.3make與makefile包含makefile和原始檔案的目錄一般被稱為構建目錄(buildingdirectory),此例中/root/exam01為構建目錄3.3.2makefile為了演示make的功能,現把power.c分割成兩個檔:power.c和compute.c。其中power.c中包含main函數,compute.c中包含compute函數,它被main所調用。如何得到可執行檔power?gcc–ccompute.cpower.cgcccompute.opower.o–opower-lm如何編寫make規則?powerpower.ocompute.opowerpower.ocompute.opower.ccompute.cmake規則:power:power.ocompute.o
gccpower.ocompute.o–o
power-lmmake規則: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練習現把程式結構做進一步修改,把它分割成6個檔:main.c、compute.c、input.c、compute.h、input.h和main.h。compute.h和input.h僅包含了compute和input函數的聲明但沒有定義。定義部分在compute.c和input.c中。main.h中包含的是兩條顯示給用戶的提示資訊。powermain.oinput.oinput.hinput.hcompute.ocompute.cmain.cmain.hcompute.hinput.ccompute.h3.3.3makefile的規則1.make可以自動執行像下麵例子中的命令:
xxx.o:xxx.czzz.hgcc–cxxx.cmake知道目標檔和相應的原始檔案的名字一般相同(稱之為標準依賴關係),因此,可以把xxx.o:xxx.c這樣的依賴關係從makefile中去掉。power
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年巴音郭楞年货运从业资格证
- 2025年池州货车上岗证理论模拟考试题库
- 2024年度医院陪护人员雇佣合同3篇
- 2025废料买卖交易合同
- 2024年信用卡借款条款3篇
- 2024年度金融投资生意合作合同协议3篇
- 2025建设工程施工承包合同农村饮水安全工程施工承包合同
- 2024年二次抵押借款房产合同3篇
- 2024年标准型吊车买卖合同
- 烟草企业烟草浸泡液水质维护条例
- 中国近现代史纲要(海南大学)知到智慧树章节答案
- 工业项目投资估算及财务评价附表(有计算公式)
- 中国少数民族文化智慧树知到期末考试答案章节答案2024年云南大学
- 外科学(1)智慧树知到答案章节测试2023年温州医科大学
- 五年级上学期开学家长会(课堂PPT)
- 病理报告模版
- 职业规划职业生涯人物访谈PPT教学模板
- 宁波市地面沉降基础资料
- 臀疗话术63089
- 关于21三体综合症的综述
- (完整版)剑桥少儿英语预备级单词表
评论
0/150
提交评论