ARM嵌入式Linux系統(tǒng)開發(fā)詳解_第1頁
ARM嵌入式Linux系統(tǒng)開發(fā)詳解_第2頁
ARM嵌入式Linux系統(tǒng)開發(fā)詳解_第3頁
ARM嵌入式Linux系統(tǒng)開發(fā)詳解_第4頁
ARM嵌入式Linux系統(tǒng)開發(fā)詳解_第5頁
已閱讀5頁,還剩537頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第1章嵌入式系統(tǒng)入門時下計(jì)算機(jī)領(lǐng)域最熱門的一個詞可能就是嵌入式系統(tǒng)了。翻開計(jì)算機(jī)的雜志和書籍,許多地方都能見到嵌入式系統(tǒng)的字眼。其實(shí),不僅在書籍雜志上,嵌入式系統(tǒng)和每個普通人的生活聯(lián)系都是很緊密的。本章從應(yīng)用角度出發(fā)介紹什么是嵌入式系統(tǒng),帶讀者進(jìn)入嵌入式系統(tǒng)開發(fā)的領(lǐng)域,主要內(nèi)容包括:嵌入式系統(tǒng)定義嵌入式系統(tǒng)的應(yīng)用領(lǐng)域嵌入式系統(tǒng)的發(fā)展趨勢ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第1頁!1.1什么是嵌入式系統(tǒng)對于沒有接觸過的人來說,嵌入式系統(tǒng)這個詞可能顯得比較深奧,甚至充滿一些神秘色彩。其實(shí)嵌入式系統(tǒng)和普通人的生活非常緊密,如日常生活中使用的手機(jī)、微波爐、有線電視機(jī)頂盒等,都屬于嵌入式系統(tǒng)。與通常使用的PC機(jī)相比,嵌入式系統(tǒng)的形式變化多樣、體積小,可以靈活地適應(yīng)各種設(shè)備的需求。因此,可以把嵌入式系統(tǒng)理解為一種為特定設(shè)備服務(wù)的,軟件硬件可裁剪的計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)的英文名稱是EmbeddedSystem。從嵌入式系統(tǒng)的定義可以看出,一個嵌入式系統(tǒng)具備了體積小、功能專一、軟硬件可裁剪的特點(diǎn)。這些特點(diǎn)也能反映出嵌入式系統(tǒng)與傳統(tǒng)的PC機(jī)有著不同之處。本書使用常見的ARM嵌入式系統(tǒng)為例講解嵌入式Linux系統(tǒng)移植和開發(fā)技術(shù)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第2頁!1.2嵌入式系統(tǒng)應(yīng)用領(lǐng)域從嵌入式系統(tǒng)的特點(diǎn)可以看出它的應(yīng)用領(lǐng)域是很廣泛的。不僅在家電上,在其他的領(lǐng)域也有很大的需求。本節(jié)介紹一些嵌入式應(yīng)用的領(lǐng)域。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第3頁!1.2.2交通工具大家最常使用的交通工具就是汽車了,不管是公交車、私家車還是其他的各種專用車輛,都有嵌入式系統(tǒng)的身影。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第4頁!1.3嵌入式系統(tǒng)發(fā)展從1946年臺現(xiàn)代電子計(jì)算機(jī)誕生以來,計(jì)算機(jī)始終朝著兩個方向發(fā)展:一個方向是體積大型化、處理能力超強(qiáng)的大型計(jì)算機(jī);另一個方向是超體積小型話、功能多樣化發(fā)展。這兩個發(fā)展方向沒有高低之分,都是由于實(shí)際需求帶動發(fā)展。計(jì)算機(jī)大型化發(fā)展出現(xiàn)了很多的超級計(jì)算機(jī),各國都在研制自己的大型計(jì)算機(jī)。在計(jì)算機(jī)小型化的發(fā)展道路上,可謂是種類繁多。不僅有個人電腦(PC),還有各種個人數(shù)字助理(PDA)。嵌入式系統(tǒng)是計(jì)算機(jī)系統(tǒng)小型化發(fā)展的一個熱門的分支。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第5頁!1.3.2嵌入式微處理器單片機(jī)的發(fā)展時間較早,處理能力很低,只能用在一些相對簡單的控制領(lǐng)域。嵌入式微處理器是近幾年隨著大規(guī)模集成電路發(fā)展同步發(fā)展起來的。與單片機(jī)相比,嵌入式微處理器的處理能力更強(qiáng)。目前主流的嵌入式微處理器都是32位的,而單片機(jī)多是8位和16位的。嵌入式處理器在一個芯片上集成了復(fù)雜的功能,同時一些微處理器還把常見的外部設(shè)備控制器也集成到芯片內(nèi)部。以ARM芯片為例,ARM體系在內(nèi)部規(guī)定了一個32位的總線,廠商可以在總線擴(kuò)展外部設(shè)備控制器。三星的ARM9芯片S3C2440A把常見的串行控制器、RTC控制器、看門狗、I2C總線控制器甚至LCD控制器等都集成在了一個芯片內(nèi),可以提供強(qiáng)大的處理能力。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第6頁!1.3.3未來嵌入式系統(tǒng)發(fā)展的方向隨著微電子技術(shù)的不斷發(fā)展以及電子制造工藝的進(jìn)步(目前已經(jīng)可以制造出65納米的芯片),嵌入式系統(tǒng)硬件的體積會不斷縮小,系統(tǒng)穩(wěn)定性也在不斷增強(qiáng),可以把更多的功能集成在一個芯片上。另外在功耗方面也不斷降低,這樣使嵌入式設(shè)備在自帶電源的情況(如使用電池)會使用更長的時間,而且設(shè)備的功能也更強(qiáng)大。此外隨著網(wǎng)絡(luò)的普及和IPv6技術(shù)的應(yīng)用,越來越多的嵌入式設(shè)備也會加入到網(wǎng)絡(luò)中。將來家中的微波爐或者洗衣機(jī)都可以通過無線接入網(wǎng)絡(luò),被其他設(shè)備控制。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第7頁!1.4典型的嵌入式系統(tǒng)組成ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第8頁!第2章嵌入式軟硬件系統(tǒng)在學(xué)習(xí)嵌入式開發(fā)之前,需要了解一下嵌入式系統(tǒng)基本知識。嵌入式系統(tǒng)是由軟件和硬件組成的,與傳統(tǒng)的PC不同,在設(shè)計(jì)嵌入式系統(tǒng)的時候通常是軟件和硬件都需要設(shè)計(jì)。對于一個嵌入式系統(tǒng)開發(fā)來說,無論是硬件開發(fā)人員還是軟件開發(fā)人員,都需要掌握基本的軟件和硬件知識。本章的主要目的是通過講解基本的軟硬件知識,幫助讀者建立嵌入式系統(tǒng)概念,主要內(nèi)容包括:模擬電路和數(shù)字電路基本的數(shù)制轉(zhuǎn)換計(jì)算機(jī)的工作原理軟件的基礎(chǔ)知識操作系統(tǒng)概要ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第9頁!2.1.1什么是模擬電路處理模擬信號的電路稱作模擬電路。模擬信號的特點(diǎn)是信號是線性變化的,意思是信號變化是連續(xù)的。如經(jīng)常使用的收音機(jī)、電視機(jī)和電話都是使用的模擬信號。常見的模擬電路有變壓電路、放大電路。評估一個模擬電路常見的參數(shù)有放大率、信噪比和工作頻率等。模擬電路是數(shù)字電路的基礎(chǔ),數(shù)字電路可以看做是模擬電路的一種特殊形式。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第10頁!2.1.3數(shù)制轉(zhuǎn)換計(jì)算機(jī)是由數(shù)字電路構(gòu)成的,其內(nèi)部數(shù)據(jù)的傳輸和處理都使用二進(jìn)制方式。日常生活中普遍使用十進(jìn)制方式表示數(shù)字,所以在使用計(jì)算機(jī)的時候需要用到數(shù)制轉(zhuǎn)換。常見的有二進(jìn)制到十進(jìn)制的轉(zhuǎn)換,從事嵌入式開發(fā)經(jīng)常會用到十六進(jìn)制,有的時候還會用到八進(jìn)制。二進(jìn)制的特點(diǎn)是“逢2進(jìn)1”。如十進(jìn)制的0對應(yīng)二進(jìn)制的0,十進(jìn)制的1對應(yīng)二進(jìn)制的1,十進(jìn)制的2對應(yīng)二進(jìn)制的10,以此類推。從這個推演規(guī)律中可以看出,二進(jìn)制數(shù)從右往左每個位數(shù)都是2的位數(shù)次冪。舉個例子,二進(jìn)制數(shù)1010轉(zhuǎn)換為十進(jìn)制數(shù):(1010)2=(23x1)+(22x0)+(21x1)+(20x0)=8+0+2+0=(10)10ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第11頁!2.2計(jì)算機(jī)組成原理現(xiàn)代計(jì)算機(jī)的構(gòu)造越來越復(fù)雜,功能也日新月異。但是計(jì)算機(jī)的組成結(jié)構(gòu)從本質(zhì)來說仍然是相同的。一個計(jì)算機(jī)系統(tǒng)硬件是由中央處理器、存儲系統(tǒng)、總線系統(tǒng)和輸入輸出系統(tǒng)幾個基本部分組成的。本節(jié)從計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)發(fā)展的角度介紹計(jì)算機(jī)組成和工作原理。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第12頁!2.2.2中央處理器中央處理器英文全稱是(CentralProcessUnit),簡稱CPU,是一個計(jì)算機(jī)系統(tǒng)的核心。CPU是由運(yùn)算器、控制器、寄存器和內(nèi)部總線組成的。在CPU之外再加入總線,存儲設(shè)備輸入輸出設(shè)備就可以構(gòu)成一個完整的計(jì)算機(jī)系統(tǒng)。CPU有幾個重要的參數(shù),包括工作頻率、字長、指令集和緩存。工作頻率通常是用戶最多聽到的參數(shù),一個CPU的工作頻率包括了主頻和外頻以及外部總線頻率。主頻是CPU的實(shí)際工作頻率,外頻是CPU工作的基準(zhǔn)頻率,還有一個是總線的工作頻率。一般來說,工作頻率越高的CPU執(zhí)行指令的速度就越快,但是也不完全如此。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第13頁!2.2.4總線系統(tǒng)總線是CPU連接外部設(shè)備的通道。通常包括數(shù)據(jù)總線(DataBus)、地址總線(AddressBus)和控制總線(ControlBus)。地址總線負(fù)責(zé)向外部設(shè)備發(fā)送地址信息;數(shù)據(jù)總線負(fù)責(zé)從外部設(shè)備讀取或者寫入信息;控制總線負(fù)責(zé)發(fā)送信號控制外部設(shè)備。計(jì)算機(jī)的總線系統(tǒng)是由總線和相應(yīng)的控制器構(gòu)成的。如嵌入式系統(tǒng)中常見的I2C總線和SPI總線,特點(diǎn)是控制簡單,成本低廉,本書后面會做具體介紹。其他的還有PCI總線,支持復(fù)雜的功能和很高的系統(tǒng)吞吐量??偩€的出現(xiàn)規(guī)范了CPU和外設(shè)之間的通信標(biāo)準(zhǔn),簡化了外部器件的設(shè)計(jì)。使用一些通用的總線可以有效降低開發(fā)成本。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第14頁!2.3軟件基礎(chǔ)知識嵌入式系統(tǒng)的基礎(chǔ)是硬件,軟件是嵌入式系統(tǒng)的靈魂。離開了軟件,一個系統(tǒng)的功能就無法發(fā)揮。因此軟件設(shè)計(jì)開發(fā)是嵌入式系統(tǒng)開發(fā)的一個重要環(huán)節(jié)。本節(jié)介紹軟件的基礎(chǔ)知識,開發(fā)流程以及基本的技術(shù)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第15頁!2.3.2軟件開發(fā)流程軟件開發(fā)流程是軟件在開發(fā)過程中需要走的步驟,經(jīng)過幾十年的發(fā)展形成一套公認(rèn)的開發(fā)流程。大致可以分成4個部分:需求分析、設(shè)計(jì)、編碼調(diào)試、測試和維護(hù)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第16頁!2.3.4計(jì)算機(jī)編程語言計(jì)算機(jī)內(nèi)部是通過執(zhí)行指令完成各種操作的,無論是指令還是數(shù)據(jù)在計(jì)算機(jī)內(nèi)部都使用二進(jìn)制表示,對于用戶的識別和輸入都很困難。計(jì)算機(jī)編程語言就是為解決這個問題設(shè)計(jì)的。計(jì)算機(jī)編程語言是一種有規(guī)范格式和語法供人類描述計(jì)算機(jī)指令的字符串集合。舉個例子來說,計(jì)算機(jī)內(nèi)部使用二進(jìn)制10100101表示一個求加法操作,計(jì)算機(jī)語言可以通過add字符串表示這個加法操作,便于人類識別。計(jì)算機(jī)語言可以分成機(jī)器語言、匯編語言和高級語言。其中機(jī)器語言是供計(jì)算機(jī)本身識別的,為二進(jìn)制串。匯編語言是對機(jī)器語言的抽象,其實(shí)質(zhì)與機(jī)器語言是相同的。匯編語言的指令與機(jī)器語言是一一對應(yīng)的。此外,匯編語言還設(shè)計(jì)了偽指令和宏指令,幫助編程人員提高開發(fā)效率。匯編語言是依賴體系結(jié)構(gòu)的,在一種CPU上能執(zhí)行的匯編語言在其他的CPU很可能就無法執(zhí)行了。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第17頁!2.4操作系統(tǒng)知識現(xiàn)代計(jì)算機(jī)的應(yīng)用軟件都是在操作系統(tǒng)下面工作的。嵌入式系統(tǒng)早期應(yīng)用程序是直接運(yùn)行在CPU上,比如單片機(jī)。隨著嵌入式系統(tǒng)硬件處理能力的提升,應(yīng)用也越來越復(fù)雜,目前主流的嵌入式系統(tǒng)都配備了操作系統(tǒng),應(yīng)用軟件使用操作系統(tǒng)提供的功能。本節(jié)介紹操作系統(tǒng)的知識。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第18頁!2.4.2操作系統(tǒng)發(fā)展歷史最早的計(jì)算機(jī)沒有操作系統(tǒng)。在同一時間,用戶只能通過打孔機(jī)等外部設(shè)備把程序輸入,計(jì)算機(jī)按照程序執(zhí)行。如果程序出現(xiàn)問題,整個機(jī)器就會停止工作。后來把常用的程序設(shè)計(jì)成庫裝入計(jì)算機(jī),方便用戶使用,這可以算是操作系統(tǒng)的雛形。早期的操作系統(tǒng)多種多樣,在大型機(jī)領(lǐng)域,幾乎每個系列的計(jì)算機(jī)都有自己的操作系統(tǒng)。這種方式造成資源很大的浪費(fèi),同樣功能的程序在不同的機(jī)器上由于操作系統(tǒng)的不同無法運(yùn)行。后來,AT&T公司在小型機(jī)上開發(fā)成功了UNIX操作系統(tǒng)(幾乎同時C語言也誕生了),并且免費(fèi)發(fā)放,用戶可以修改其代碼。UNIX的這種授權(quán)方式得到廣泛應(yīng)用,被移植到了各種計(jì)算機(jī)上,是現(xiàn)代操作系統(tǒng)的開端。UNIX操作系統(tǒng)的設(shè)計(jì)思想也是現(xiàn)在許多操作系統(tǒng)參考的基礎(chǔ)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第19頁!2.4.4幾種操作系統(tǒng)的設(shè)計(jì)思路層次結(jié)構(gòu)的設(shè)計(jì)思想是把內(nèi)核需要提供的功能劃分出層次,最底層僅提供抽象出來的最基本的功能,每一層利用下面的一層的功能,依此類推最上面的一層可以提供豐富的功能。這種設(shè)計(jì)思路結(jié)構(gòu)清晰是操作系統(tǒng)內(nèi)核的一大進(jìn)步。微內(nèi)核結(jié)構(gòu)是19世紀(jì)80年代產(chǎn)生的內(nèi)核結(jié)構(gòu)。其設(shè)計(jì)思想是內(nèi)核提供最基本最核心的功能,注重把系統(tǒng)的服務(wù)功能和基本操作分開。例如,內(nèi)核只提供中斷處理、內(nèi)存管理等基本功能,網(wǎng)絡(luò)傳輸數(shù)據(jù)之類的功能可以設(shè)計(jì)成一個系統(tǒng)服務(wù)完成。這種設(shè)計(jì)思路使得內(nèi)核的設(shè)計(jì)更加簡單,內(nèi)核可以根據(jù)需要啟動或者關(guān)閉系統(tǒng)服務(wù),極大的提高了整個系統(tǒng)的工作效率。此外,微內(nèi)核還會設(shè)計(jì)一個硬件抽象層,對內(nèi)核屏蔽硬件底層特性,讓內(nèi)核可以專注提供各種功能。使用微內(nèi)核結(jié)構(gòu)的系統(tǒng)越來越多,常見的Linux和WindowsNT都采用了微內(nèi)核的設(shè)計(jì)思想。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第20頁!2.5小結(jié)本章概括了嵌入式開發(fā)領(lǐng)域軟硬件的基礎(chǔ)知識,包括電路、計(jì)算機(jī)組成原理、軟件的基本知識以及操作系統(tǒng)。本章的知識點(diǎn)比較廣泛,讀者只需要了解即可,全書在涉及到的地方會詳細(xì)講解各知識點(diǎn)。第3章講解ARM處理器。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第21頁!3.1微處理器和微控制器微處理器可以根據(jù)應(yīng)用領(lǐng)域大致分成通用微處理器、嵌入式微處理器和微控制器。通用微處理器主要用于高性能計(jì)算,如常用的PC機(jī)的CPU就是一個通用微處理器;嵌入式微處理器是針對某種特定應(yīng)用的高能力計(jì)算,如MP3的解碼、移動電話的控制等;微控制器主要用于控制某種設(shè)備,通常集成了多種外部設(shè)備控制器,處理指令的能力一般不是很強(qiáng),但是價格低廉,多用在汽車、空調(diào)等設(shè)備上。微控制器除了針對專門設(shè)備設(shè)計(jì)以外,還具備微處理器不具備的特點(diǎn)。如很好的環(huán)境適應(yīng)性,可以在特殊的高溫或者低溫環(huán)境工作。這些特點(diǎn)一般的微處理器是不具備的。目前的嵌入式微處理器大多集成了外部設(shè)備控制器,功能不斷增強(qiáng),價格也在下降。使用嵌入式微處理器替代微控制器俏蠢捶⒄溝那魘啤ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第22頁!3.2.1ARM微處理器的應(yīng)用領(lǐng)域在前面提到ARM已經(jīng)滲透到許多的應(yīng)用領(lǐng)域。1.工業(yè)控制2.無線通信3.網(wǎng)絡(luò)應(yīng)用4.消費(fèi)電子產(chǎn)品ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第23頁!3.3ARM指令集指令集指一個微處理器所有指令的集合,每種微處理器都有自己的指令集。在第2章講過處理器的指令集可以分成CISC(復(fù)雜指令集)和RISC(精簡指令集)兩種,ARM處理器使用RISC(精簡指令集)。精簡指令集的最大特點(diǎn)是所有的指令占用相同的存儲空間。ARM處理器支持ARM和Thumb兩種指令集:ARM指令集工作在32位模式下,指令長度都是32比特;Thumb指令集工作在16位模式下,指令長度都是16比特。ARM指令集按照功能可以分為算術(shù)運(yùn)算指令、邏輯運(yùn)算指令、分支指令、軟件中斷指令和程序數(shù)據(jù)裝載指令等。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第24頁!3.3.2邏輯運(yùn)算指令邏輯運(yùn)算不同與算術(shù)運(yùn)算。邏輯運(yùn)算按照邏輯代數(shù)的運(yùn)算法則操作數(shù)據(jù),得到邏輯結(jié)果。1.AND指令2.EOR指令3.MOV指令A(yù)RM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第25頁!3.2.4數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令用于CPU和存儲器之間的數(shù)據(jù)傳送,是ARM處理器唯一能與外部存儲器交換數(shù)據(jù)的一類指令。1.單一數(shù)據(jù)傳送指令2.多數(shù)據(jù)傳送指令A(yù)RM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第26頁!3.4.1ARM體系結(jié)構(gòu)的命名方法ARM體系結(jié)構(gòu)的命名可以分成兩部分,一部分是ARM體系版本的命名,另一部分是ARM體系版本的處理器命名。ARM體系到目前一共發(fā)布了9個系列的版本,每種版本都可以支持不同的指令集和特殊功能。指令集縮寫含義TThumb指令集M長乘法指令集E增強(qiáng)DSP指令集J支持Java加速器SIMD多媒體功能擴(kuò)展指令集ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第27頁!3.4.3處理器工作模式ARM微處理器可以在工作中隨時切換狀態(tài)。切換工作狀態(tài)不會影響工作模式和寄存器的內(nèi)容。但是ARM體系要求在處理器啟動的時候應(yīng)該處于ARM狀態(tài)。ARM處理器使用操作寄存器的0位表示工作狀態(tài),取值是1時代表Thumb狀態(tài),取值是0時是ARM狀態(tài)??梢允褂肂X指令可以切換狀態(tài)。當(dāng)處理器啟動的時候操作寄存器取值為0,保證了默認(rèn)進(jìn)入ARM狀態(tài)。ARM處理器支持7種工作模式,這對一些通用處理器來說確實(shí)有點(diǎn)多。不過,通過分析可以發(fā)現(xiàn),ARM的工作模式大多都是處理外部中斷和異常的,只不過是對異常和中斷的分類比較詳細(xì)。7種工作模式定義請參考。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第28頁!3.4.4存儲系統(tǒng)嵌入式微處理器大多采用一種線性的存儲管理模式,ARM也是如此。這種管理模式的特點(diǎn)是,系統(tǒng)內(nèi)所有的存儲器和外部設(shè)備都被安排到一個統(tǒng)一的地址空間,通過地址映射到不同的設(shè)備,訪問某個設(shè)備只需要訪問該設(shè)備映射的內(nèi)存地址即可。線性地址空間便于處理器的管理和用戶操作。在操作超過8位的數(shù)據(jù)時,存在兩種不同的訪問方法:大字端模式和小字端模式。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第29頁!3.4.5尋址方式尋址就是根據(jù)指令中的地址碼找出操作數(shù)地址的過程,是計(jì)算機(jī)中很重要的一個部分。對編寫程序來說,不同的尋址方式是存取速度和存取空間權(quán)衡的一個考慮因素。本書介紹7種常見的ARM處理器尋址模式。1.立即尋址2.寄存器尋址方式3.寄存器偏移尋址4.寄存器間接尋址5.基址尋址6.多寄存器尋址7.棧尋址ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第30頁!3.5ARM的功能選型隨著嵌入式應(yīng)用的發(fā)展,ARM芯片的使用也不斷增多。但是,由于ARM公司的技術(shù)授權(quán),許多廠商都在生產(chǎn)基于ARM核的芯片,給用戶的選擇帶來一定困難。本節(jié)從ARM芯片的結(jié)構(gòu)和功能出發(fā),介紹在ARM芯片的選型過程中需要注意的問題,并且在最后給出幾種ARM芯片介紹。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第31頁!3.5.1ARM的選型原則芯片型號供應(yīng)商FLASH容量(Bytes)SRAM容量(Bytes)AT91FR4081ATMEL1M128KSAA7750Philips384K64KHMS30C7202Hynix192K無LC67F500Snayo640K32KARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第32頁!3.6小結(jié)本章介紹了ARM處理器相關(guān)的知識。包括微處理器和微控制器的概念和差異,介紹了ARM的體系結(jié)構(gòu)特點(diǎn)和功能選型,最后給出了幾個不同領(lǐng)域ARM核的芯片介紹。本章的內(nèi)容偏重理論的較多,讀者需要建立相關(guān)名詞和術(shù)語的概念,在后面章節(jié)涉及到具體應(yīng)用的時候會用到。隨著實(shí)踐的增多,讀者會不斷加深對這些概念的理解。第4章介紹嵌入式Linux基本知識。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第33頁!4.1常見的嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)通俗的說就是為嵌入式系統(tǒng)設(shè)計(jì)的操作系統(tǒng),是運(yùn)行在嵌入式硬件上的一類系統(tǒng)軟件。嵌入式系統(tǒng)負(fù)責(zé)管理系統(tǒng)資源為用戶提供調(diào)用接口,方便用戶應(yīng)用程序開發(fā)。一般來說,嵌入式操作系統(tǒng)是由啟動程序(Bootloader)、核心(Kernel)、根文件系統(tǒng)(RootFileSystem)組成的。通過特殊的燒錄工具把編譯好的嵌入式系統(tǒng)文件映像燒寫到目標(biāo)板的只讀存儲器(ROM)或者Flash存儲器。一個嵌入式系統(tǒng)的性能好壞很大程度上決定了整個嵌入式系統(tǒng)的性能。按照實(shí)時性能,嵌入式系統(tǒng)操作系統(tǒng)可以分成實(shí)時系統(tǒng)和分時系統(tǒng)。實(shí)時系統(tǒng)主要用在控制和通信領(lǐng)域,分時系統(tǒng)主要用在消費(fèi)類電子產(chǎn)品。本節(jié)介紹幾種常見的嵌入式操作系統(tǒng)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第34頁!4.1.2WindowsCEWindowsCE是微軟公司為嵌入式產(chǎn)品設(shè)計(jì)的一種嵌入式操作系統(tǒng),主要針對需要多線程、多任務(wù)而且資源有限的設(shè)備。該系統(tǒng)采用模塊化設(shè)計(jì),開發(fā)人員可以定制不同的功能。WindowCE系統(tǒng)支持豐富的外部硬件設(shè)備,包括鍵盤、鼠標(biāo)、觸摸板、串口、網(wǎng)口、USB、音頻設(shè)備等。并且該系統(tǒng)有與Windows一致的圖形界面,可以很好的提高用戶體驗(yàn)。WindowsCE的一個最大特點(diǎn)就是支持上千個微軟Win32編程接口(MicrosoftWin32API)。在Windows下開發(fā)過應(yīng)用程序的程序員可以很快的上手WindowsCE。此外,WindowsCE還支持PC機(jī)上的模擬器,用戶可以從模擬器上開發(fā)應(yīng)用,調(diào)試完畢后再下載到目標(biāo)板執(zhí)行,提高了開發(fā)效率。WindwosCE系統(tǒng)設(shè)計(jì)簡單靈活,主要應(yīng)用在各種小型設(shè)備,例如掌上電腦、餐廳點(diǎn)餐器等設(shè)備上。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第35頁!4.1.4SymbianSymbianOS中文名稱叫做塞班系統(tǒng),是由諾基亞、索尼愛立信、摩托羅拉等幾家移動通信設(shè)備制造商聯(lián)合設(shè)計(jì)的嵌入式操作系統(tǒng)。塞班系統(tǒng)主要針對手機(jī),設(shè)計(jì)目標(biāo)是簡單易用。目前在移動智能終端方面塞班的市場占有率非常大。塞班系統(tǒng)有一個強(qiáng)大的核心,支持對象導(dǎo)向系統(tǒng)和SunJava語言。該系統(tǒng)的應(yīng)用程序主要使用C++和Java開發(fā),從應(yīng)用開發(fā)角度可以縮短開發(fā)周期。塞班系統(tǒng)本身支持多種外部設(shè)備,而且為廠商和用戶留有豐富的接口并且提供了開發(fā)工具。用戶可以很快的在塞班系統(tǒng)開發(fā)應(yīng)用程序。目前塞班系統(tǒng)已經(jīng)廣泛的應(yīng)用在諾基亞手機(jī)上。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第36頁!4.2.1什么是Linux許多讀者可能都聽說過Linux操作系統(tǒng)。Linux系統(tǒng)是一個免費(fèi)使用的類似UNIX操作系統(tǒng),最初運(yùn)行在x86體系結(jié)構(gòu),目前已經(jīng)被移植到數(shù)十種處理器上。Linux最初由芬蘭的一位計(jì)算機(jī)愛好者LinusTorvalds設(shè)計(jì)開發(fā),經(jīng)過十余年的發(fā)展,現(xiàn)在該系統(tǒng)已經(jīng)是一個非常龐大、功能完善的操作系統(tǒng)。Linux系統(tǒng)的開發(fā)和維護(hù)是由分布在全球各地的數(shù)百名程序員完成的,這得益于它的源代碼開放特性。與商業(yè)系統(tǒng)相比,Linux系統(tǒng)在功能上一點(diǎn)都不差,甚至在許多方面要超過一些著名的商業(yè)操作系統(tǒng)。Linux不僅支持豐富的硬件設(shè)備、文件系統(tǒng),更主要的是它提供了完整的源代碼和開發(fā)工具。對于嵌入式開發(fā)來說,使用Linux系統(tǒng)可以幫助用戶從底層了解嵌入式開發(fā)的全過程,以及一個操作系統(tǒng)內(nèi)部是如何運(yùn)作的。學(xué)習(xí)Linux系統(tǒng)開發(fā)對初學(xué)者有很大的幫助。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第37頁!4.2.3Linux發(fā)行版Linux系統(tǒng)是開放的,任何人都可以制作自己的系統(tǒng),因此出現(xiàn)了許多廠商和個人都在發(fā)行自己的Linux系統(tǒng)。據(jù)統(tǒng)計(jì),目前Linux的發(fā)行版已經(jīng)超過300種,而且還在不斷增加。如此多的發(fā)行版,對于任何一個人都是不可能完全學(xué)習(xí)的,本節(jié)介紹幾種國內(nèi)常見的Linux發(fā)行版供讀者參考。1.RedHat2.Debian3.UbuntuARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第38頁!4.3小結(jié)本章講解了嵌入式Linux系統(tǒng)的入門知識,以及一些常見的嵌入式操作系統(tǒng)。嵌入式Linux系統(tǒng)是新興的一門技術(shù),還在不斷的發(fā)展中。目前的嵌入式Linux系統(tǒng)種類繁多,但是萬變不離其宗。讀者在了解這些系統(tǒng)的同時,還是需要從掌握基本的Linux系統(tǒng)開始入手。第5章介紹如何搭建嵌入式Linux開發(fā)環(huán)境。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第39頁!5.1獨(dú)立的Linux系統(tǒng)本節(jié)介紹的Linux系統(tǒng)需要單獨(dú)安裝在PC機(jī)的磁盤分區(qū),讀者在操作之前需要做好準(zhǔn)備,備份好數(shù)據(jù)。目前的Linux系統(tǒng)發(fā)行版有許多,UbuntuLinux界面貼近用戶,軟件安裝配置簡單,適合初學(xué)者學(xué)習(xí)使用。本書使用UbuntuLinux8.04發(fā)行版本作為嵌入式Linux開發(fā)的主機(jī)環(huán)境。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第40頁!5.1.2關(guān)鍵一步-系統(tǒng)的網(wǎng)絡(luò)設(shè)置UbuntuLinux使用了apt管理軟件包。apt是一種給予Debian系統(tǒng)deb包的管理器,最大的特點(diǎn)就是從網(wǎng)絡(luò)安裝軟件包,并且能自動獲取每個軟件包的依賴關(guān)系,安裝正確的軟件包。由此可見,網(wǎng)絡(luò)對于UbuntuLinux系統(tǒng)的重要性。在安裝其他的軟件包之前,首先是設(shè)置Ubuntu的網(wǎng)絡(luò)。Ubuntu的網(wǎng)絡(luò)配置文件主要有/etc/network/interfaces和/etc/resov.conf兩個文件。其中,/etc/network/interfaces文件是配置網(wǎng)絡(luò)接口卡(網(wǎng)卡)和網(wǎng)關(guān)地址,內(nèi)容如下:ifaceloinetloopback #環(huán)回設(shè)備loopback配置ifaceeth0inetstatic #個以太網(wǎng)卡設(shè)備eth0,使用靜態(tài)配置address20 #配置IP地址netmask #配置掩碼gateway #設(shè)置網(wǎng)關(guān)ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第41頁!5.1.4怎樣安裝卸載軟件Ubuntu安裝卸載軟件都非常方便,使用apt-get命令可以完成軟件的管理。具體格式如下:apt-getinstall<軟件包名稱>apt-getuninstall<軟件包名稱>ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第42頁!5.1.6安裝主要的開發(fā)工具UbuntuLinux把主要的開發(fā)工具打包放在一起,安裝的時候直接安裝一個軟件包就可以把基本的開發(fā)工具和程序都裝到系統(tǒng)。(1)安裝基本的開發(fā)工具。(2)檢查開發(fā)工具是否安裝成功。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第43頁!5.2運(yùn)行在Windows上的Linux系統(tǒng)對于多數(shù)沒有使用過Linux系統(tǒng)的讀者來說,初次使用Linux開發(fā)會遇到許多問題。初學(xué)者可以通過首先在Windows系統(tǒng)下使用類似Linux的模擬環(huán)境熟悉一下。此外,在Linux模擬環(huán)境下可以完成大多數(shù)的Linux系統(tǒng)操作。Windows下的Linux模擬環(huán)境有許多,其中應(yīng)用最廣泛的是Cygwin系統(tǒng)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第44頁!5.2.2如何安裝CygwinCygwin的安裝比較簡單。Cygwin支持網(wǎng)絡(luò)在線安裝和從本地安裝兩種模式,由于Cygwin的服務(wù)器在國外,建議國內(nèi)用戶下載Cygwin的本地安裝包從本地安裝。首先從.下載軟件安裝包,本書使用的是2版本,其他版本的安裝過程相同。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第45頁!5.3Linux常用工具目前大多數(shù)的Linux發(fā)行版都提供了圖形界面作為默認(rèn)界面,但是,命令行工具在Linux仍然很重要。Linux工具的特點(diǎn)是一個程序包含的功能盡量專一,不同的程序通過文件、管道等進(jìn)程間數(shù)據(jù)共享的方法可以組合使用,達(dá)到處理復(fù)雜功能的目的。學(xué)習(xí)使用Linux系統(tǒng),命令行工具是基礎(chǔ)。GNU的命令行工具都有相同的特點(diǎn),初學(xué)者從一些基本的工具入手,比較容易學(xué)習(xí)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第46頁!5.3.1LinuxShell和常用命令命令作用常用參數(shù)參數(shù)作用ls列出指定目錄的列表,包括文件和子目錄。默認(rèn)是當(dāng)前目錄。-l以列表方式查看-a顯示隱含文件和目錄-h以便于人閱讀的方式查看文件的大小ln建立連接-s軟連接-f連接是一個目錄df查看磁盤空間-h以便于人閱讀的方式查看文件的大小du查看指定目錄占用的空間。默認(rèn)是當(dāng)前目錄-h以便于人閱讀的方式查看文件的大小pwd修改用戶密碼。非root用戶只能修改自己的密碼。

chmod修改文件或目錄的讀寫權(quán)限。-R遞歸調(diào)用chgrp修改文件或目錄的用戶組。-R遞歸調(diào)用chown修改文件或目錄的所有者。-R遞歸調(diào)用date查看日期

cat輸出文件內(nèi)容到屏幕。

echo回顯一個字符串或者環(huán)境變量到屏幕。

uname查看機(jī)器名稱。

ps查看進(jìn)程狀態(tài)-e查看系統(tǒng)所有進(jìn)程kill殺死指定進(jìn)程-9強(qiáng)制殺死進(jìn)程ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第47頁!5.3.2文本編輯工具viLinux系統(tǒng)的文本編輯工具有許多,其中使用最廣泛的就是vi編輯器了。vi編輯器的功能十分強(qiáng)大,并且非常小,適合安裝在嵌入式系統(tǒng)使用。vi雖然功能強(qiáng)大,但是對于初學(xué)者來說,上手比較困難,初學(xué)者往往被vi奇怪的操作弄的失去學(xué)習(xí)的信息。本書有關(guān)vi的使用僅涉及基本操作,目的是幫助初學(xué)者學(xué)習(xí)vi的基本操作。更高級的vi操作讀者可以參考vi的幫助文檔。vi編輯器支持編輯模式、瀏覽模式、插入模式和可視模式四種模式。其中,插入模式包括了插入文本和替換文本兩種模式。當(dāng)啟動vi的時候,默認(rèn)進(jìn)入瀏覽模式。瀏覽模式只能查看和刪除文檔內(nèi)容,但是不能修改;編輯模式用戶可以修改文檔內(nèi)容,與普通的文本編輯器相同;覆蓋模式下用戶輸入的內(nèi)容會覆蓋光標(biāo)所在位置的文本;可視模式提供了一種選擇文本的方法,可以使用鍵盤完成鼠標(biāo)選擇文本的功能。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第48頁!5.3.3搜索工具find和grepfind和grep是Linux系統(tǒng)最常用的兩個搜索工具。這兩個工具不同的是find用于查找文件,grep用于查找文件內(nèi)容。grep支持正則表達(dá)式(一種描述字符串特征的語法),通過在一個或多個文件中搜索字符串,符合的內(nèi)容被送到屏幕顯示。grep工具不會修改文件內(nèi)容。grep通過返回值表示搜索狀態(tài),如果搜索成功返回0,如果失敗返回1,如果搜索的文件不存在返回2。因此,grep可以用于shell腳本。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第49頁!5.3.4FTP工具命令名稱含義dir列出服務(wù)器的目錄cd改變服務(wù)器上的目錄lcd改變本地目錄ascii使用文本方式傳輸文件binary使用二進(jìn)制方式傳輸文件bye退出ftp工具h(yuǎn)ash顯示文件傳輸進(jìn)度get從服務(wù)器下載文件put上傳文件到服務(wù)器!切換到shell界面,在shell中使用exit命令可以退回ftp界面ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第50頁!5.5Windows常用工具嵌入式開發(fā)的開發(fā)環(huán)境和運(yùn)行環(huán)境往往不是同一臺機(jī)器。作為開發(fā)環(huán)境,Windows下通常運(yùn)行一些客戶端和代碼管理工具、文檔管理工具等。本節(jié)介紹Windows下常用的兩個工具。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第51頁!5.5.2串口工具XShell在5.3.5節(jié)介紹了Linux下的串口工具mini,本節(jié)介紹一個Windows下比較好用的串口工具XShell。實(shí)際上,XShell不僅支持串口連接,還可以連接Telnet服務(wù)器、SSH服務(wù)器等。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第52頁!5.6.1ADS集成開發(fā)環(huán)境介紹ADS是ARM公司推出的ARM集成開發(fā)工具,目前最新版本是1.2,只能在Windows系統(tǒng)安裝。ADS包括程序庫、命令行開發(fā)工具、圖形界面、調(diào)試工具和代碼編輯器等。本節(jié)介紹一下ADS自帶的命令行工具。1.C語言編譯器armcc2.C++語言編譯器armcppARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第53頁!5.6.3建立自己的工程本節(jié)介紹如何在ADS環(huán)境下建立自己的工程并且編譯生成目標(biāo)文件。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第54頁!第6章個Linux應(yīng)用程序?qū)W習(xí)嵌入式程序開發(fā)首先從最簡單的程序開始。一個最基本的Linux應(yīng)用程序可以涵蓋編程的所有基本知識,通過編寫Linux可以快速入門程序開發(fā)。本章目的是通過實(shí)際的程序向讀者介紹Linux程序的基本框架和工作流程。主要內(nèi)容如下:編寫一個最基本的應(yīng)用程序分析程序的執(zhí)行過程程序生成過程程序編譯過程管理ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第55頁!6.1.1用vi編輯源代碼文件在5.3.2小節(jié)介紹了vi編輯器的用法,現(xiàn)在使用vi編輯器編寫個源代碼文件。具體操作過程如下:1.創(chuàng)建源代碼文件hello_test.c2.編寫源代碼3.保存退出ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第56頁!6.1.3執(zhí)行程序到目前為止,個程序已經(jīng)編譯好了,下面就是執(zhí)行程序了。在大多數(shù)的Linux系統(tǒng)上,都是通過一個名為PATH的環(huán)境變量來管理系統(tǒng)可執(zhí)行程序的路徑的,但是不幸的是這個變量里并沒有包含了當(dāng)前路徑的‘./’,所以需要按照下面的方式執(zhí)行程序:./a.out執(zhí)行a.out程序后,輸出結(jié)果如下:[root@slashdev_test]#./a.outHello,World!ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第57頁!6.2.1程序執(zhí)行的過程一個Linux程序的加載和執(zhí)行過程。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第58頁!6.2.3動態(tài)庫的作用Linux系統(tǒng)有兩種程序庫,一種是被稱作靜態(tài)庫(staticlibrary),在程序連接的時候,把庫函數(shù)的目標(biāo)代碼和程序連接在一起;還有一種就是前面提到的動態(tài)庫(sharedlibrary),從英文字面翻譯,動態(tài)庫可以翻譯為共享庫。動態(tài)庫是Linux系統(tǒng)最廣泛的一種程序使用方式,它的工作原理是相同功能的代碼可以被多個程序共同使用。在程序加載的時候,內(nèi)核會檢查程序使用到的動態(tài)庫是否已經(jīng)加載到內(nèi)存,如果沒有加載到內(nèi)存,則從系統(tǒng)庫路徑搜索并且加載相關(guān)的動態(tài)庫;如果動態(tài)庫已經(jīng)被加載到內(nèi)存,程序可以直接使用而扌爰釉亍從動態(tài)庫的工作原理可以看出,任何一個動態(tài)庫僅會被系統(tǒng)加載一次。使用程序動態(tài)庫還有一個好處,就是可以減小應(yīng)用程序占用的空間和加載時間。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第59頁!6.3.1編譯源代碼編譯的目的是把人書寫的高級語言代碼翻譯成目標(biāo)程序的語言處理程序,編譯用的程序(例如gcc)也可以稱為編譯系統(tǒng)。一個編譯系統(tǒng)把一個源程序翻譯成目標(biāo)程序的工作過程分為五個階段:詞法分析、語法分析、中間代碼生成、代碼優(yōu)化和目標(biāo)代碼生成。其中主要階段是詞法分析和語法分析,也可以稱為源代碼分析,分析過程中發(fā)現(xiàn)有語法錯誤,給出提示信息。1.詞法分析2.語法分析3.中間代碼生成4.代碼優(yōu)化5.目標(biāo)代碼生成ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第60頁!6.4更簡單的辦法——用Makefile管理工程6.1.2節(jié)講述了可以使用如下的方法編譯一個鏈接動態(tài)庫的程序:gcchello_test.c以及使用如下的方法編譯一個靜態(tài)程序:gcc–statichello_test.cARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第61頁!6.4.2它是如何工作的Makfile的工作原理是通過比對目標(biāo)文件和依賴文件的時間戳,執(zhí)行對應(yīng)的命令。Makfile的語法結(jié)構(gòu)如下:(目標(biāo)文件):(依賴文件1)(依賴文件2)(依賴文件…)(命令1)(命令2)(命令…)ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第62頁!6.4.4好的源代碼管理習(xí)慣在一個軟件項(xiàng)目中,往往會將不同功能的代碼放在不同的文件中,這時候,一個好的代碼管理方法就顯得很重要,凌亂的代碼分布不僅對調(diào)試帶來很多麻煩,對以后的升級和維護(hù)都是一個不小的挑戰(zhàn)。這里給出幾個代碼管理的建議:1.把不同功能的代碼放在不同的文件,并且把必要的函數(shù)放在對應(yīng)的頭文件2.對軟件模塊劃分層次ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第63頁!第7章Linux應(yīng)用程序編程基礎(chǔ)Linux系統(tǒng)的應(yīng)用程序是為了完成某項(xiàng)或者某些特定任務(wù)的計(jì)算機(jī)程序,應(yīng)用程序和文檔組成了軟件。應(yīng)用程序都是在操作系統(tǒng)基礎(chǔ)上運(yùn)行的,Linux應(yīng)用程序運(yùn)行在用戶模式,可以通過Shell或者圖形界面與用戶交互。應(yīng)用程序運(yùn)行在獨(dú)立的進(jìn)程,擁有自己獨(dú)立的地址空間,通俗的說,在一個應(yīng)用程序看來,他自己擁有計(jì)算機(jī)的資源,并不知道其他應(yīng)用程序的存在。本章講解Linux應(yīng)用程序開發(fā)的重要概念,主要內(nèi)容如下:C內(nèi)存管理ANSIC文件讀寫操作POSIX文件讀寫操作ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第64頁!7.1.1堆和棧的區(qū)別1.棧棧(stack)是一個由編譯器分配釋放的區(qū)域,用來存放函數(shù)的參數(shù),局部變量等。操作方式類似于數(shù)據(jù)結(jié)構(gòu)教材里的棧。當(dāng)調(diào)用函數(shù)時,被調(diào)用函數(shù)的參數(shù)和返回值被存儲到當(dāng)前程序的棧區(qū),之后被調(diào)用函數(shù)在為自身的自動變量和臨時變量在棧區(qū)上分配空間。當(dāng)函數(shù)調(diào)用返回時,在棧區(qū)內(nèi)的參數(shù)返回值,自動變量和臨時變量等會被釋放。這就是為什么C語言函數(shù)參數(shù)如果不是指針的話,被修改的參數(shù)結(jié)果用戶無法得到的原因。函數(shù)的調(diào)用和棧的使用方式保證了不同函數(shù)內(nèi)部定義相同名字的變量不會混淆。棧的管理方式是FILO(FirstInLastOut),稱作先進(jìn)后出,學(xué)過數(shù)據(jù)結(jié)構(gòu)的讀者知道,棧內(nèi)的數(shù)據(jù)是在一個方向管理的,先到達(dá)的數(shù)據(jù)最后被讀出來,生活中就有這樣的例子,比如火車的棧,就是車頭先進(jìn)入,但是出來的時候卻是車尾先出來,車頭最后出。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第65頁!7.1.2內(nèi)存管理函數(shù)malloc()和free()C程序有兩個主要的內(nèi)存管理函數(shù):malloc()函數(shù)負(fù)責(zé)分配內(nèi)存;free()函數(shù)釋放malloc()分配的內(nèi)存。這兩個函數(shù)都是C標(biāo)準(zhǔn)庫stdlib.h頭文件定義的,Linux系統(tǒng)函數(shù)原型:void*malloc(size_tsize);voidfree(void*ptr);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第66頁!7.1.4內(nèi)存管理編程實(shí)例本節(jié)給出一個內(nèi)存管理編程實(shí)例。該實(shí)例代碼展示了malloc()函數(shù),calloc()函數(shù)分配內(nèi)存空間寫入字符串,之后使用realloc()函數(shù)重新分配內(nèi)存空間,最后釋放動態(tài)分配的內(nèi)存。程序在分配的內(nèi)存空間內(nèi)寫入字符串,通過打印字符串到屏幕展示內(nèi)存分配的結(jié)果。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第67頁!7.2.1文件指針和流文件是可以永久存儲的,有特定順序的一個有序,有名稱的字節(jié)組成的集合。在Linux系統(tǒng)中,通常能見到的目錄、設(shè)備文件和管道等,都屬于文件,具有不同的特性。本節(jié)描述的ANSI文件只能用于普通文件操作。ANSI文件操作提供了一個重要的結(jié)構(gòu)-文件指針FIL。文件的打開、讀寫和關(guān)閉以及其他訪問都要通過文件指針完成。FILE結(jié)構(gòu)通常作為FILE*的方式使用,因此被稱作文件指針,這個結(jié)構(gòu)在stdio.h頭文件的定義:typedefstruct{intlevel; unsignedflags; charfd; unsignedcharhold;intbsize; unsignedchar_FAR*buffer; unsignedchar_FAR*curp; unsignedistemp;shorttoken; }FILE;ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第68頁!7.2.3標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)錯誤Linux系統(tǒng)為每個進(jìn)程定義了標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤三個文件流,也稱作I/O數(shù)據(jù)流。系統(tǒng)預(yù)定義的三個文件流有固定的名稱,因此無需創(chuàng)建可以直接使用。stdin是標(biāo)準(zhǔn)輸入,默認(rèn)是從鍵盤讀取數(shù)據(jù);stdout是標(biāo)準(zhǔn)輸出,默認(rèn)向屏幕輸出數(shù)據(jù);stderr是標(biāo)準(zhǔn)錯誤,默認(rèn)是向屏幕輸出數(shù)據(jù)。三個I/O數(shù)據(jù)流定義在stdio.h頭文件里,程序在使用前需要引用相關(guān)頭文件。C標(biāo)準(zhǔn)庫函數(shù)printf()默認(rèn)使用stdout輸出數(shù)據(jù),用戶也可以通過重新設(shè)置標(biāo)準(zhǔn)I/O,把程序的輸入輸出結(jié)果定向到其他設(shè)備。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第69頁!7.2.5打開關(guān)閉文件ANSIC文件庫定義了打開文件函數(shù)fopen()和關(guān)閉文件函數(shù)fclose(),定義如下:FILE*fopen(constchar*path,constchar*mode);intfclose(FILE*stream);mode參數(shù)說明r或rb為讀打開文件w或wb為寫打開文件,并把文件長度置為0(清空文件)a或ab在文件結(jié)尾添加打開r+或r+b或rb+為讀和寫打開w+或w+b或wb+為寫打開文件,并把文件長度置0(清空文件)a+或a+b或ab+在文件結(jié)尾讀寫打開ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第70頁!7.2.7文件流定位在讀寫文件的時候每個文件流都會維護(hù)一個文件流指針,表示當(dāng)前文件流的讀寫位置,在打開文件的時候文件流指針位于文件的最開頭(使用‘a(chǎn)’方式打開的文件,文件流指針位于文件最后),當(dāng)讀寫文件流的時候,讀寫文件流的函數(shù)會不斷改變文件流當(dāng)前位置。當(dāng)用戶在寫入一些數(shù)據(jù)后,如果需要讀取之前寫入的數(shù)據(jù),或者需要修改指定文件位置的數(shù)據(jù),就需要用到文件流定位功能。為此,ANSI文件I/O庫提供了文件流定位函數(shù),定義如下:intfseek(FILE*stream,longoffset,intwhence);longftell(FILE*stream);voidrewind(FILE*stream);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第71頁!7.3POSIX文件I/O編程POSIX是可移植操作系統(tǒng)接口的簡寫,英文全程是PortableOperatingSystemInterface。最初由IEEE(InstituteofElectricalandElectronicsEngineers,IEEE)開發(fā),目的是為了提高UNIX環(huán)境下的應(yīng)用程序可移植性。實(shí)際上POSIX并不局限于UNIX,只要符合此標(biāo)準(zhǔn)的操作系統(tǒng)的系統(tǒng)調(diào)用是一致的,例如Linux和MicrosoftWindowsNT。POSIX是一組操作系統(tǒng)調(diào)用的規(guī)范,本節(jié)介紹其中的文件I/O編程規(guī)范。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第72頁!7.3.2文件描述符POSIX文件操作也使用文件描述符來標(biāo)識一個文件。與ANSI文件描述符不同的是,POSIX文件描述符是int類型的一個整數(shù)值。POSIX文件描述符僅是一個索引值,代表內(nèi)核打開文件記錄表的記錄索引。在一個系統(tǒng)中,文件打開關(guān)閉比較頻繁,因此同一個POSIX文件描述符的值在不同時間可能代表不同的文件。任何打開的文件都將被分配一個唯一標(biāo)識該打開文件的文件描述符,為一個大于等于0的整數(shù)。需要注意的是,對于一個進(jìn)程來說,打開文件的數(shù)量不是任意大小的。POISX沒有規(guī)定一個進(jìn)程可以打開文件的最大數(shù)目,不同的系統(tǒng)有不同的規(guī)定,例如Linux系統(tǒng)默認(rèn)一個進(jìn)程最多可以打開1024個文件,用戶可以在console模式下通過ulimit–n命令查看系統(tǒng)允許進(jìn)程打開文件的數(shù)量。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第73頁!7.3.4讀寫文件內(nèi)容POSIX文件操作使用read()函數(shù)和write()函數(shù)對文件讀寫,和ANSI文件操作的fread()函數(shù)和fwrite()函數(shù)不同的是read()函數(shù)和write()函數(shù)是不帶緩沖的,并且不支持記錄方式。write()函數(shù)的定義如下:#include<unistd.h>ssize_twrite(intfd,constvoid*buf,size_tcount);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第74頁!7.3.5文件內(nèi)容定位每當(dāng)打開一個文件的時候,都會有一個與文件相關(guān)聯(lián)的讀寫位置偏移量,相當(dāng)于一個文件指針。文件偏移量是一個非負(fù)整數(shù),表示相對于文件開頭的偏移。通常情況下,文件的讀寫操作都是從當(dāng)前文件偏移量開始,讀寫之后使文件偏移量增加讀寫的字節(jié)數(shù)。打開文件時,如果不指定O_APPEND方式,文件偏移量默認(rèn)是從0開始。POSIX文件操作提供了lseek()函數(shù)用于設(shè)置文件偏移量,函數(shù)定義如下:#include<sys/types.h>#include<unistd.h>off_tlseek(intfildes,off_toffset,intwhence);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第75頁!7.3.6修改已打開文件屬性fcntl()函數(shù)提供了獲取或者改變已打開文件性質(zhì)的功能,函數(shù)定義如下:#include<unistd.h>#include<fcntl.h>intfcntl(intfd,intcmd);intfcntl(intfd,intcmd,longarg);intfcntl(intfd,intcmd,structflock*lock);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第76頁!7.4小結(jié)本章講解了Linux應(yīng)用程序開發(fā)有關(guān)的基本技術(shù),包括程序在內(nèi)存中的結(jié)構(gòu)、文件管理等內(nèi)容。計(jì)算機(jī)應(yīng)用程序是可以直接與用戶打交道的,用戶的功能需求幾乎都是通過應(yīng)用程序?qū)崿F(xiàn)的。讀者應(yīng)該掌握應(yīng)用程序的基本結(jié)構(gòu),為后面的編程開發(fā)打下基礎(chǔ)。第8章講解應(yīng)用程序開發(fā)最常用的技術(shù)之一,多線程和多進(jìn)程程序開發(fā)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第77頁!8.1多進(jìn)程開發(fā)Linux是一個UNIX類兼容的操作系統(tǒng),為用戶提供了完整的多進(jìn)程工作環(huán)境。UNIX類操作系統(tǒng)最大的特點(diǎn)就是支持多任務(wù),學(xué)習(xí)和使用多任務(wù)編程對Linux編程十分有必要。本節(jié)將講解Linux多進(jìn)程程序開發(fā)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第78頁!8.1.2進(jìn)程環(huán)境和屬性在Linux系統(tǒng),C程序總是從main()函數(shù)開始的,當(dāng)用戶編寫好的程序在運(yùn)行的時候,操作系統(tǒng)會使用exec()函數(shù)運(yùn)行程序,在調(diào)用main()函數(shù)之前,exec()系統(tǒng)調(diào)用會先調(diào)用一個特殊的啟動例程,負(fù)責(zé)從操作系統(tǒng)內(nèi)核讀取程序的命令行參數(shù),為main()函數(shù)準(zhǔn)備好工作環(huán)境。一個進(jìn)程除了能獲得操作系統(tǒng)提供的環(huán)境變量外,還具備自身的基本屬性,主要包括:進(jìn)程號(PID:ProcessID):父進(jìn)程號(PPID:ParentProcessID):進(jìn)程組號(PGID:ProcessGroupID):真實(shí)用戶號(UID:UserID):真實(shí)組號(GID:GroupID):有效用戶號(EUID:EffectiveUserID):有效組號(EGID:EffectiveGroupID):ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第79頁!8.1.3創(chuàng)建進(jìn)程ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第80頁!8.1.5退出進(jìn)程Linux提供了幾個退出進(jìn)程相關(guān)的函數(shù)exit()、_exit()、atexit()和on_exit()。exit()函數(shù)的作用是退出當(dāng)前進(jìn)程,并且盡可能釋放當(dāng)前進(jìn)程占用的資源。_exit()函數(shù)作用也是退出當(dāng)前進(jìn)程,但是并不試圖釋放進(jìn)程占用的資源。atexit()函數(shù)和on_exit()函數(shù)作用都是為程序退出時指定調(diào)用用戶的代碼,區(qū)別在于on_exit()函數(shù)可以為設(shè)定的用戶函數(shù)設(shè)定參數(shù)。這幾個函數(shù)的定義:#include<stdlib.h>intatexit(void(*function)(void));inton_exit(void(*function)(int,void*),void*arg);voidexit(intstatus);#include<unistd.h>void_exit(intstatus);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第81頁!8.1.6常用進(jìn)程間通信的方法ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第82頁!8.2多線程開發(fā)多進(jìn)程為用戶編程和操作帶來了便利。但是對于操作系統(tǒng)來說,進(jìn)程占有系統(tǒng)資源,進(jìn)程的切換也給操作系統(tǒng)帶來了額外的開銷。每次創(chuàng)建新進(jìn)程會把父進(jìn)程的資源復(fù)制一份到子進(jìn)程,如果創(chuàng)建多個進(jìn)程的話,會占用大量的資源。此外,進(jìn)程間的數(shù)據(jù)共享也需要操作系統(tǒng)的干預(yù)。由于進(jìn)程的種種缺點(diǎn),提出了線程的概念。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第83頁!8.2.2進(jìn)程和線程對比進(jìn)程和線程有許多相似之處,但是也有許多不同:資源分配不同。工作效率不同。執(zhí)行方式不同。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第84頁!8.2.3創(chuàng)建線程Linux系統(tǒng)開發(fā)多線程程序大多使用pthread庫,pthread庫是符合POSIX線程標(biāo)準(zhǔn)的一個應(yīng)用庫,提供了線程的管理和操作方法。pthread庫對線程操作的函數(shù)基本都以pthread開頭,創(chuàng)建線程的函數(shù)定義如下:#include<pthread.h>intpthread_create(pthread_t*restrictthread,constpthread_attr_t*restrictattr,void*(*start_routine)(void*),void*restrictarg);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第85頁!8.2.5等待線程在線程操作實(shí)例中,主線程使用sleep()函數(shù)暫停自己的運(yùn)行,等待新創(chuàng)建的線程結(jié)束。使用延遲函數(shù)的方法在簡單的程序中還能對付,但是復(fù)雜一點(diǎn)的程序就不好用了。由于線程的運(yùn)行時間不確定,導(dǎo)致程序的運(yùn)行結(jié)果無法預(yù)測。pthread庫提供了一種等待其他線程結(jié)束的方法,使用pthread_join()函數(shù)等待一個線程結(jié)束,函數(shù)定義如下:#include<pthread.h>intpthread_join(pthread_tthread,void**value_ptr);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第86頁!8.3小結(jié)本章講解了Linux應(yīng)用程序開發(fā)最重要的兩種技術(shù):多進(jìn)程和多線程。多進(jìn)程和多線程技術(shù)是應(yīng)用最廣泛的技術(shù)之一,使用該技術(shù)可以并發(fā)處理業(yè)務(wù)流程,充分利用計(jì)算機(jī)資源提高業(yè)務(wù)處理能力。理解多進(jìn)程和多線程最關(guān)鍵的是建立并發(fā)工作的概念,讀者在學(xué)習(xí)的時候應(yīng)該多實(shí)踐,通過實(shí)踐加深理解。第9章講解目前最常用的應(yīng)用網(wǎng)絡(luò)程序開發(fā)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第87頁!9.1網(wǎng)絡(luò)通信基礎(chǔ)互聯(lián)網(wǎng)(internet)是目前世界上應(yīng)用最廣泛的網(wǎng)絡(luò),最早從美國軍方的科研項(xiàng)目ARPA(AdvancedResearchProjectsAgency)發(fā)展而來。互聯(lián)網(wǎng)采用TCP/IP協(xié)議傳輸數(shù)據(jù),雖然TCP/IP協(xié)議并不是ISO規(guī)定的標(biāo)準(zhǔn)協(xié)議,但是作為應(yīng)用最廣泛的協(xié)議已經(jīng)成為大規(guī)模網(wǎng)絡(luò)通信的事實(shí)標(biāo)準(zhǔn)。本節(jié)介紹TCP/IP協(xié)議簇以及其中重要的IP協(xié)議、TCP協(xié)議和UDP協(xié)議。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第88頁!9.1.2IP協(xié)議在圖看出,IP協(xié)議工作在傳輸層,負(fù)責(zé)數(shù)據(jù)包的傳輸管理。IP協(xié)議實(shí)現(xiàn)兩個基本功能:尋址和分段。尋址是IP協(xié)議提供的最基本功能,IP協(xié)議根據(jù)包頭中目的地址傳送數(shù)據(jù)報(bào)文。在傳送數(shù)據(jù)報(bào)文過程中,IP協(xié)議可以根據(jù)目的地址選擇報(bào)文在網(wǎng)絡(luò)中的傳輸路徑,這個過程稱作路由。分段是IP協(xié)議一個重要功能。由于不同類型的網(wǎng)絡(luò)之間傳輸?shù)木W(wǎng)絡(luò)報(bào)文長度是不同的,為了能適應(yīng)在不同的網(wǎng)絡(luò)中傳輸TCP/IP協(xié)議報(bào)文,IP協(xié)議提供分段機(jī)制幫助數(shù)據(jù)包穿過不同類型的網(wǎng)絡(luò)。IP協(xié)議在協(xié)議頭記錄了分段后的報(bào)文數(shù)據(jù),但是IP協(xié)議并不關(guān)心數(shù)據(jù)的內(nèi)容。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第89頁!9.1.3TCP協(xié)議TCP協(xié)議是一個傳輸層協(xié)議。如圖9-1所示,TCP協(xié)議位于網(wǎng)絡(luò)互聯(lián)層后,是IP協(xié)議的上層協(xié)議。TCP是一個面向連接的可靠傳輸協(xié)議。在一個協(xié)議棧處理程序中,如果發(fā)現(xiàn)數(shù)據(jù)包的IP層后攜帶了TCP頭,會把數(shù)據(jù)包交給TCP協(xié)議層處理。TCP協(xié)議層對數(shù)據(jù)包排序并進(jìn)行錯誤檢查,按照TCP數(shù)據(jù)包頭中的序列號排序,如果發(fā)現(xiàn)排序隊(duì)列中少某個數(shù)據(jù)包,則啟動重傳機(jī)制重新傳送丟失的數(shù)據(jù)包。TCP協(xié)議層處理完畢后,把其余數(shù)據(jù)交給應(yīng)用層程序處理,如FTP的服務(wù)程序和客戶程序。面向連接的應(yīng)用幾乎都使用TCP協(xié)議作為傳輸協(xié)議。TCP傳輸協(xié)議有高度可靠性,可以最大限度保證數(shù)據(jù)在傳遞過程中不丟失。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第90頁!9.1.5學(xué)習(xí)分析協(xié)議的方法網(wǎng)絡(luò)協(xié)議一般都比較抽象,給人感覺枯燥。學(xué)習(xí)網(wǎng)絡(luò)協(xié)議需要一個直觀的認(rèn)識,推薦讀者使用網(wǎng)絡(luò)協(xié)議分析的工具分析協(xié)議。目前有很多的網(wǎng)絡(luò)協(xié)議分析工具,著名的Sniffer就是一款專業(yè)的網(wǎng)絡(luò)協(xié)議分析利器,本書介紹一個比較流行的工具Ethereal,這是一個開源的網(wǎng)絡(luò)協(xié)議分析工具,功能十分強(qiáng)大,使用libpcap庫做數(shù)據(jù)包解析,使用GTK+庫做界面,由于這兩個庫是跨平臺的,所以Ethereal可以在多種平臺使用。Ethereal最大的特點(diǎn)是支持用表達(dá)式書寫包過濾條件,同時支持常見協(xié)議的深度分析,如HTTP,SIP等。Ethereal最新版本已經(jīng)更名為WireShark,官方網(wǎng)站是.,官方網(wǎng)站有軟件的使用手冊以及下載。軟件的安裝本書不做介紹,安裝過程一般不需要選擇,按照提示一步一步進(jìn)行即可。本節(jié)介紹WireShark軟件的使用。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第91頁!9.2.1創(chuàng)建socket對象在使用socket通信之前,需要創(chuàng)建socket對象。對應(yīng)用程序員來說,soeket對象就是一個文件句柄,通常使用socket()函數(shù)創(chuàng)建socket()對象。函數(shù)定義如下:#include<sys/types.h>#include<sys/socket.h>intsocket(intdomain,inttype,intprotocol);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第92頁!9.2.2面向連接的socket通信實(shí)現(xiàn)ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第93頁!9.2.4無連接的socket通信實(shí)現(xiàn)無連接的socket通信相對于建立連接的流socket簡單,因?yàn)閿?shù)據(jù)傳輸過程中不能保證到達(dá),常用在一些對數(shù)據(jù)要求不高的地方,如在線視頻等。無連接的套接字不需要建立連接,省去了維護(hù)連接的開銷,所以,同樣環(huán)境下一般比流套接字傳輸數(shù)據(jù)速率快。實(shí)際應(yīng)用中,一些應(yīng)用軟件會自己維護(hù)無連接的套接字?jǐn)?shù)據(jù)傳輸狀態(tài)。無連接的套接字使用TCP/IP協(xié)議簇的UDP協(xié)議傳輸數(shù)據(jù)。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第94頁!9.2.5無連接的時間服務(wù)編程實(shí)例無連接的套接字通信比較簡單,本節(jié)給出一個獲取時間的例子,服務(wù)端程序time_serv.c負(fù)責(zé)創(chuàng)建socket并且綁定到本機(jī)9090端口,然后等待客戶端發(fā)出請求,當(dāng)收到客戶端發(fā)送的請求時間命令”time”以后,生成當(dāng)前時間的字符串發(fā)送給客戶端。客戶端建立socket以后,直接向指定的服務(wù)端發(fā)送請求時間命令,之后等待服務(wù)端返回,發(fā)送退出命令,關(guān)閉連接。

ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第95頁!9.3.1socket超時處理實(shí)際的網(wǎng)絡(luò)通信數(shù)據(jù)常會因?yàn)楦鞣N網(wǎng)絡(luò)故障導(dǎo)致傳輸失敗,在應(yīng)用程序里需要對數(shù)據(jù)發(fā)送和接收做對應(yīng)的超時處理,超時指的是預(yù)先假定一次數(shù)據(jù)傳輸需要的時間,如果超過這個時間沒有得到反饋,認(rèn)為數(shù)據(jù)傳輸失敗,socket庫提供了兩個強(qiáng)大的函數(shù)setsockopt()和getsockopt()用來設(shè)置套接字和得到套接字參數(shù),函數(shù)定義如下:#include<sys/types.h>#include<sys/socket.h>intgetsockopt(ints,intlevel,intoptname,void*optval,socklen_t*optlen);intsetsockopt(ints,intlevel,intoptname,constvoid*optval,socklen_toptlen);ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第96頁!9.3.3使用poll機(jī)制處理多連接poll()函數(shù)提供與select()函數(shù)類似的功能,解決了select()函數(shù)存在的一些問題,并且函數(shù)調(diào)用方式也更加簡單。函數(shù)定義如下:#include<sys/poll.h>intpoll(structpollfd*ufds,unsignedintnfds,inttimeout);事件名稱解釋POLLIN有數(shù)據(jù)可讀POLLRDNORM有普通數(shù)據(jù)可讀POLLRDBAND有優(yōu)先數(shù)據(jù)可讀POLLPRI有緊迫數(shù)據(jù)可讀POLLOUT寫數(shù)據(jù)不會導(dǎo)致阻塞POLLWRNORM寫普通數(shù)據(jù)不會導(dǎo)致阻塞POLLWRBAND寫優(yōu)先數(shù)據(jù)不會導(dǎo)致阻塞POLLMSGSIGPOLL消息可用POLLER指定的文件描述符發(fā)生錯誤(僅出現(xiàn)在revents域)POLLHUP指定的文件描述符掛起事件(僅出現(xiàn)在revents域)POLLNVAL指定的文件描述符非法(僅出現(xiàn)在revents域)ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第97頁!9.4小結(jié)本章講解socket編程。首先介紹了TCP/IP協(xié)議簇,在第2節(jié)講解socket編程的基礎(chǔ)知識,包括面向連接的流套接字和無連接的數(shù)據(jù)報(bào)編程,這部分是socket編程最基本的,初學(xué)者應(yīng)該把這兩種類型的套接口通信模式與TCP/IP協(xié)議的層次關(guān)系對比,可以更快的理解里面的含義。第3節(jié)介紹了socket編程的一些高級技術(shù),主要是集中在如何對阻塞數(shù)據(jù)處理,包括超時機(jī)制,多線程機(jī)制,讀者可以參考Linux的man手冊得到更多的細(xì)節(jié)。第10章另一種常見的通信方式-串口通信編程。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第98頁!10.1串口介紹在計(jì)算機(jī)領(lǐng)域,串口可以說是歷史悠久而且應(yīng)用廣泛。從最早的PC機(jī)到目前工業(yè)控制領(lǐng)域廣泛應(yīng)用的工業(yè)計(jì)算機(jī)、以及嵌入式系統(tǒng)等,都提供了串口。串口有功能簡單、成本低、便于連接等優(yōu)點(diǎn),是許多嵌入式系統(tǒng)必備接口之一。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第99頁!10.1.2串口工作原理串口通過直接連接在兩臺設(shè)備間的線發(fā)送和接收數(shù)據(jù),兩臺設(shè)備通信最少需要三根線(發(fā)送數(shù)據(jù)、接收數(shù)據(jù)和接地)才可以通信。以最常見的RS232串口為例,通信距離較近時(<12m),可以用電纜線直接連接標(biāo)準(zhǔn)RS232端口。如果傳輸距離遠(yuǎn),可以通過調(diào)制解調(diào)器(MODEM)傳輸。因?yàn)榇谠O(shè)備工作頻率低且容易受到干擾,遠(yuǎn)距離傳輸會造成數(shù)據(jù)丟失。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第100頁!10.1.3串口流量控制常見的串口工具軟件都提供了RTS/CTS與XON/XOFF選項(xiàng)。這兩個選項(xiàng)對應(yīng)RS232串口的兩種流量控制方式。串口流量控制主要應(yīng)用于調(diào)制解調(diào)器的數(shù)據(jù)通訊,對于普通RS232串口編程,了解一點(diǎn)流量控制方面的知識是有好處的。1.什么是串口流量控制2.硬件流量控制3.軟件流量控制ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第101頁!10.2.1操作串口需要用到的頭文件在Linux系統(tǒng)操作串口需要用到以下頭文件:#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h>#include<sys/stat.h>#include<fcntl.h> #include<termios.h> #include<errno.h> ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第102頁!10.2.3串口屬性設(shè)置10.1節(jié)講解串口的基本知識,提到串口的基本屬性包括波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)等參數(shù)。Linux系統(tǒng)通常使用termios結(jié)構(gòu)存儲串口參數(shù),該結(jié)構(gòu)在termios.h頭文件定義如下:structtermios{ unsignedshortc_iflag; unsignedshortc_oflag; unsignedshortc_cflag; unsignedshortc_lflag; unsignedcharc_line; unsignedcharc_cc[NCC]; };ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第103頁!10.3串口應(yīng)用實(shí)例-手機(jī)短信發(fā)送手機(jī)是目前使用最廣泛的通信設(shè)備之一,許多手機(jī)都提供了與PC互聯(lián)的功能,其中最重要的一個接口就是串口(一些提供USB接口的手機(jī)指令收發(fā)是把USB設(shè)備虛擬一個串口設(shè)備進(jìn)行通信的)。在GSM(全球數(shù)字移動電話網(wǎng)絡(luò))協(xié)議中規(guī)定了一組AT指令用于手機(jī)與其他設(shè)備通信,其中提供了發(fā)送短信的方法。本節(jié)講解如何利用手機(jī)發(fā)送短信并且給出了實(shí)例。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第104頁!10.3.2AT指令介紹AT指令集是GSM網(wǎng)絡(luò)中網(wǎng)絡(luò)設(shè)備之間發(fā)送控制信息的標(biāo)準(zhǔn)指令集。GSM網(wǎng)絡(luò)終端設(shè)備(TE)或者數(shù)據(jù)終端設(shè)備(DTE)可以向終端適配器(TA)發(fā)送AT指令。使用AT指令,用戶可以控制DTE發(fā)送短信息、呼叫電話、讀寫電話本、發(fā)送傳真等。AT指令由手機(jī)制造商諾基亞、愛立信、摩托羅拉等共同研制,其中包括了短消息(SMS)控制功能。對SMS的控制有Block模式、文本模式和協(xié)議數(shù)據(jù)(PDU)模式三種。目前主要使用PDU模式,其它兩種模式逐步被淘汰。ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第105頁!10.3.4PDU編碼方式通常發(fā)送短信使用PDU模式,在GSM協(xié)議中對PDU模式發(fā)送短信的數(shù)據(jù)做了規(guī)范。使用PDU模式發(fā)送短信需要接收號碼、短消息中心號碼和短消息內(nèi)容三個數(shù)據(jù)。這三個數(shù)據(jù)的定義方法如下:1.接收號碼生成方法2.短消息中心號碼生成方法3.短消息內(nèi)容生成方法4.組合成完整的消息格式ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第106頁!10.3.6使用AT指令發(fā)送短信10.3.4節(jié)講解如何生成PDU模式的數(shù)據(jù),在生成符合PDU模式的數(shù)據(jù)后,可以通過AT+CMGF指令和AT+CMGS指令發(fā)送一條短信。以10.3.4節(jié)的內(nèi)容為例,使用AT指令發(fā)送短消息過程如下:AT+CMGF=0<回車>OKAT+CMGS=msg_len<回車>entire_msg<Ctrl+Z發(fā)送>ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第107頁!第11章嵌入式GUI程序開發(fā)許多嵌入式設(shè)備都提供了圖形界面。由于嵌入式設(shè)備輸入輸出設(shè)備的限制,鍵盤和鼠標(biāo)等傳統(tǒng)的輸入設(shè)備不便于使用,通過圖形界面,可以很好的完成人機(jī)交互。在嵌入式Linux系統(tǒng),有許多的圖形庫可以使用。本節(jié)重點(diǎn)介紹在嵌入式Linux上使用最廣泛的Qt程序庫,主要內(nèi)容如下:嵌入式Linux圖形庫介紹Qt開發(fā)環(huán)境搭建開發(fā)Qt應(yīng)用程序搭建嵌入式Qt工作環(huán)境在嵌入式Linux系統(tǒng)使用Qt應(yīng)用程序ARM嵌入式Linux系統(tǒng)開發(fā)詳解共542頁,您現(xiàn)在瀏覽的是第108頁!11.1.1LinuxGUI的發(fā)展從1981個計(jì)算機(jī)圖形界面誕生到現(xiàn)在,計(jì)算機(jī)圖形界面有著飛速的發(fā)展。與圖形界面發(fā)展相應(yīng)的是計(jì)算機(jī)硬件處理能力的不斷提高。最初的圖形界面僅提供了很簡單的功能,而且不支持鼠標(biāo)操作,受到硬件的限制,顏色位數(shù)也很低。在計(jì)算機(jī)圖形界面發(fā)展過稱中,XWindow、MacOS

溫馨提示

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

最新文檔

評論

0/150

提交評論