版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 目次</b></p><p><b> 1 緒論2</b></p><p> 1.1 課題研究背景及意義2</p><p> 1.2 嵌入式系統(tǒng)的現(xiàn)狀和發(fā)展趨勢2</p><p> 1.3 嵌入式網(wǎng)絡的關(guān)鍵問題4</p><p
2、> 1.4 本論文的主要工作4</p><p> 2 ARM嵌入式系統(tǒng)6</p><p> 2.1 系統(tǒng)開發(fā)環(huán)境6</p><p> 2.2 ARM嵌入式硬件平臺7</p><p> 2.3 搭建ARM嵌入式開發(fā)環(huán)境9</p><p> 2.4 PC機Linux開發(fā)環(huán)境的建立2
3、3</p><p> 2.5 本章小結(jié)23</p><p> 3 ARM嵌入式以太網(wǎng)通信的開發(fā)25</p><p> 3.1 OSI網(wǎng)絡模型25</p><p> 3.2 TCP/IP協(xié)議棧的基本概念25</p><p> 3.3 TCP協(xié)議基本概念26</p><p&
4、gt; 3.4 UDP協(xié)議29</p><p> 3.5 本章小結(jié)31</p><p> 4 ARM嵌入式的以太網(wǎng)通信程序設計32</p><p> 4.1 TCP通信程序設計32</p><p> 4.2 TCP網(wǎng)絡程序設計流程34</p><p> 4.3 TCP服務器/客戶端網(wǎng)絡
5、程序的實現(xiàn)43</p><p> 4.4 UDP通信程序設計48</p><p> 4.5 UDP服務器/客戶端網(wǎng)絡程序的實現(xiàn)53</p><p> 4.6 本章小結(jié)56</p><p><b> 結(jié)論57</b></p><p><b> 致謝58</
6、b></p><p><b> 參考文獻59</b></p><p><b> 附錄 160</b></p><p><b> 附錄 263</b></p><p><b> 附錄 366</b></p><p&g
7、t;<b> 1 緒論</b></p><p> 隨著信息技術(shù)的迅猛發(fā)展,在我們的生活工作中,對于網(wǎng)絡通信的要求逐年增高,且隨著移動互聯(lián)網(wǎng)絡的發(fā)展與需求,嵌入式系統(tǒng)與通信網(wǎng)絡,日日夜夜伴隨著我們。嵌入式系統(tǒng)與網(wǎng)絡技術(shù)融合已經(jīng)是必然的發(fā)展趨勢,當嵌入式設備具有網(wǎng)絡功能時,人們可以在任何地方、任何時間、任何平臺隨時瀏覽設備的信息,并進行操作和測試。這是在嵌入式系統(tǒng)在其網(wǎng)絡性和開放性的發(fā)展趨
8、勢。</p><p> 1.1 課題研究背景及意義</p><p> 如今,我們的生活與工作中已經(jīng)無法離開網(wǎng)絡。人們進行信息的傳送和交流,之所可以實時且效地,恰是因為有“信息高速公路”,而“信息高速公路”的重要支撐網(wǎng)就是以太網(wǎng)[1]?!耙蕴?Ether)”這個詞,是來源自十九世紀的物理學家們假設出的某種媒介,用以傳播電磁波的輻射。在下,他們認為“以太”充斥于世界各處,因此,到后來將“
9、以太”這個假說引入到計算機局域網(wǎng)中,從而用來表現(xiàn)它在通信領(lǐng)域也是無處不在,就像“以太”充斥于世界中那樣普遍存在。以太網(wǎng)可以方便的接入網(wǎng)絡,以太網(wǎng)使用的通信協(xié)議也因為適用性,有著十分優(yōu)異的兼容性。</p><p> 當前,在嵌入式系統(tǒng)接入因特網(wǎng)的所有技術(shù)中,被使用最多的局域網(wǎng)通信技術(shù)即是以太網(wǎng)通信。通過以太網(wǎng)可以十分方便地搭建局域網(wǎng),因而能與因特網(wǎng)鏈接。嵌入式系統(tǒng)的開發(fā)與設計有了前所未有的空間與機遇,對于嵌入式系
10、統(tǒng)的發(fā)展應用,任何時候都有機會跨入嵌入式以太網(wǎng)時代,這些都是需要兩者技術(shù)上的完美融合。</p><p> 只要完成了嵌入式系統(tǒng)與以太網(wǎng)的鏈接,使嵌入式系統(tǒng)發(fā)展成為以太網(wǎng)中單獨的一個節(jié)點,用戶在節(jié)點可以通過網(wǎng)絡,便捷且低代價地進行數(shù)據(jù)傳輸。所以為了實現(xiàn)整個系統(tǒng)的數(shù)據(jù)的傳輸功能,而在嵌入式系統(tǒng)與以太網(wǎng)鏈接的方法上做相應的研究,是具有十分重要的經(jīng)濟價值和現(xiàn)實意義的。</p><p> 在這種
11、背景下,本文對基于ARM的以太網(wǎng)通信的這一問題,進行研究與應用,具有充分的實際意義。</p><p> 1.2 嵌入式系統(tǒng)的現(xiàn)狀和發(fā)展趨勢</p><p> 幾乎電子設備所有新的生機都與嵌入式系統(tǒng)的發(fā)展關(guān)系緊密,在電子通信、醫(yī)療衛(wèi)生、輕工業(yè)產(chǎn)品、監(jiān)控安防、消費類電子、工業(yè)自動化系統(tǒng)等行業(yè)都有重要的嵌入式相關(guān)產(chǎn)品。 尤其是在消費電子相關(guān)產(chǎn)業(yè),占有最高的嵌入式系統(tǒng)的產(chǎn)品的市場比重,監(jiān)控安
12、防、電子通信、醫(yī)療衛(wèi)生以及其他領(lǐng)域緊隨其后。</p><p> 近十幾年來,嵌入式系統(tǒng)得到了根本性的發(fā)展。微處理器、微控制器大量在產(chǎn)品中使用,CPU 也從當初8 位的單片機發(fā)展到現(xiàn)在的16位、32位甚至64 位的高端微處理器;從僅具備單一內(nèi)核發(fā)展到提供豐富外設及接口功能;從幾兆的頻率發(fā)展到現(xiàn)在幾百兆甚至1~2G 的處理速度。伴隨著CPU性能的不斷攀升,嵌人式系統(tǒng)也具備了文件系統(tǒng)、網(wǎng)絡系統(tǒng)、圖形界面系統(tǒng)等功能,并
13、形成了以嵌入式操作系統(tǒng)為核心的嵌入式軟件體系。跟隨應用程度的不斷加深擴大的嵌入式系統(tǒng),全新領(lǐng)域應用以及商品化的需求在嵌入式系統(tǒng)軟硬件上面表現(xiàn)出了更高的需求。嵌入式系統(tǒng)不僅僅具有微小性、低功耗、高可靠性的特點,還要向高實時性、高自適應性、易于操作和棋塊化的方向發(fā)展[2]??偟恼f來,嵌入式系統(tǒng)在以下幾個方面將會有更大的發(fā)展:</p><p> 1. 嵌入式操作系統(tǒng):</p><p> 嵌入
14、式系統(tǒng)剛剛發(fā)展的時候,軟件系統(tǒng)還是前后臺方式的系統(tǒng)開發(fā),這種開發(fā)方式也被大多數(shù)人比喻為“裸奔”。前后臺方式下的軟件系統(tǒng)的實時性差、功能單一、代碼不易于維護等缺點越來越不適應嵌入式系統(tǒng)的高速發(fā)展,為此嵌入式操作系統(tǒng)被引人。嵌入式操作系統(tǒng)的使用能夠更加豐富嵌人式系統(tǒng)的功能,使得產(chǎn)品更加穩(wěn)定可靠,多任務并發(fā)的處理方式也讓系統(tǒng)的實時性要求得到滿足,模塊化的編程方式讓產(chǎn)品的可定制性進一步增強。當前普遍使用的嵌入式的操作系統(tǒng)有Windows CE、
15、μC/OS-II、Linux、VxWorks等。</p><p> 這些嵌入式操作系統(tǒng)中當屬Linux具有最高的人氣和應用潛力,原因是其源代碼公開且具有很好的定制性和可利用性,支持硬件廣泛、安全可靠、擁有眾多的開發(fā)者,另外有一重要原由便是產(chǎn)品生產(chǎn)商們在研發(fā)基于Linux系統(tǒng)的相關(guān)產(chǎn)品時,通常不必為發(fā)行軟件或者生產(chǎn)產(chǎn)品而支付Linux的許可費用。目前廣泛應用在手機、PAD等消費電子產(chǎn)品上的安卓操作系統(tǒng),便是由Li
16、nux的內(nèi)核所開發(fā)出來的。由此可見嵌入式操作系統(tǒng),特別是嵌入式Linux系統(tǒng)應用潛力巨大。</p><p><b> 2.網(wǎng)絡互連:</b></p><p> 網(wǎng)絡技術(shù)已經(jīng)深入到我們生活和工業(yè)生產(chǎn)的各個領(lǐng)域,由互聯(lián)網(wǎng)引發(fā)的物聯(lián)網(wǎng)技術(shù)正在快速發(fā)展中,網(wǎng)絡也使得人與人、設備與設備之間的聯(lián)系更加緊密,嵌人式設備為了適應網(wǎng)絡技術(shù)的發(fā)展,必然要求在硬件上提供各種網(wǎng)絡通信接口
17、。傳統(tǒng)單片機的系統(tǒng)對于網(wǎng)絡連接有很大欠缺,然而現(xiàn)在的嵌入式處理器,卻擁有了內(nèi)置的網(wǎng)絡端口,不僅擁有對TCP/IP協(xié)議的支持外,對于USB、總線、IEEE1394、藍牙、或紅外通信接口的支持,擁有上述通信接口中的一項或者多項,而且還對物理層提供其驅(qū)動的軟件,以及對應的通訊網(wǎng)的協(xié)議腳本。</p><p> 3.易于操作的人機界面:</p><p> 嵌入式產(chǎn)品是為人們的生產(chǎn)生活服務的,如果
18、目前的嵌入式設備還像以前DOS系統(tǒng)那樣使用命令行操作方式的話,就不會便于人們使用和操作,那些給我們生產(chǎn)生活帶來方便和事受的電子高科技產(chǎn)品也不會產(chǎn)生,嵌人式產(chǎn)品被大家使用和接受的程度也將大大降低。</p><p> 嵌入式系統(tǒng)的普及和應用離不開億萬大眾,嵌入式產(chǎn)品的親和力和人機互動性起著決定性的作用。我們都希望在一套圖形漂亮、直觀簡潔的界面下,僅僅通過手指點擊就完成我們的操作。蘋果產(chǎn)品的熱賣,平板電腦、智能手機的
19、普及就充分說明了這點。</p><p> 1.3 嵌入式網(wǎng)絡的關(guān)鍵問題 </p><p> 在嵌入式網(wǎng)絡上面,主要關(guān)心如下2部分的問題</p><p> 嵌入式本身的內(nèi)存大小以及其運算速度,這些硬件問題需要被考慮,雖然AT91SAM9G20有著較高的主頻,但也要盡量的減少系統(tǒng)開支,達到最大的效率。</p><p> 搭建合適的平臺以
20、完成通信,選擇合適的平臺將大大降低網(wǎng)絡搭建的工作量,所以依照所需要的功能搭建通信平臺。</p><p> 1.4 本論文的主要工作</p><p> 本課題通過對基于ARM嵌入式的以太網(wǎng)通信的研究,主要采用由Atmel公司推出的AT91SAM9G20芯片、DM9161AEP網(wǎng)絡芯片、Nand Flash等形成設計基礎,在ARM嵌入式平臺中移植Linux內(nèi)核,通過Linux操作系統(tǒng)完成
21、TCP/IP、UDP/IP通信的功能,最終在YL-9G20開發(fā)板上進行硬件測試。</p><p> 本文第2章介紹了基于ARM的嵌入式系統(tǒng)硬件平臺,介紹了基于ARM的嵌入式系統(tǒng)硬件平臺的組成以及開發(fā)平臺的組建,重要硬件實現(xiàn)部分的構(gòu)成,囊括相關(guān)芯片的問題進行依次進行敘述,且對核心處理器芯片、網(wǎng)絡控制芯片的內(nèi)部結(jié)構(gòu)、實現(xiàn)功能以及其工作的原理,分別做了相關(guān)簡介;以及論述服務器端的開發(fā)環(huán)境搭建,以及基于ARM的AT91
22、Bootstrap的移植,U-Boot的移植,Linux內(nèi)核配置與根文件系統(tǒng)的移植。</p><p> 本文第3章介紹了以太網(wǎng)通信的基本理論,通過Linux系統(tǒng)實現(xiàn)TCP/IP、UDP通信協(xié)議,體現(xiàn)了Linux操作系統(tǒng)實現(xiàn)網(wǎng)絡通信的技術(shù)優(yōu)勢,分別講述協(xié)議棧中ARP、IP、ICMP、TCP、UDP協(xié)議的實現(xiàn)過程,同時也介紹了協(xié)議棧與底層設備及應用層的接口設計。最后介紹了運用socket套接字接口進行網(wǎng)絡程序編寫的
23、流程。</p><p> 本文第4章介紹了基于ARM嵌入式的以太網(wǎng)通信程序的設計。論述了TCP、UDP網(wǎng)絡編程,且在服務器和客戶端測試TCP、UDP通信,實現(xiàn)基于ARM嵌入式的以太網(wǎng)通信功能,完成通信程序的編寫。</p><p> 2 ARM嵌入式系統(tǒng)</p><p> 目前,嵌入式系統(tǒng)相關(guān)技術(shù)已經(jīng)在工業(yè)系統(tǒng)、個人消費電子產(chǎn)品、工業(yè)系統(tǒng)、智能家居等領(lǐng)域有著良
24、好發(fā)展,其中多數(shù)伴隨嵌入式系統(tǒng)產(chǎn)品的就是其嵌入式網(wǎng)絡系統(tǒng)的開發(fā),ARM嵌入式微處理器一般具有如下特點:體積小、低功耗、低成本、高性能;支持Thumb(16位)/ARM(32位)雙指令集,能很好地兼容8位/16位器件[3]。本章,主要講述嵌入式系統(tǒng)的硬件平臺模塊以及發(fā)開環(huán)境。</p><p> 2.1 系統(tǒng)開發(fā)環(huán)境</p><p> 系統(tǒng)開發(fā)環(huán)境主要由硬件部分包括計算機、ARM9開發(fā)板
25、、網(wǎng)絡設備;軟件中包含:嵌入式Linux的開發(fā)環(huán)境以及相關(guān)設備驅(qū)動、SecureCRT組成。軟件部分的工作均在計算機PC(Personal Computer)上完成,嵌入式Linux開發(fā)環(huán)境負責程序的開發(fā)和調(diào)試,SecureCRT可以打印串口輸出的數(shù)據(jù),以及通過串口向開發(fā)板發(fā)送數(shù)據(jù)。</p><p> ARM嵌入式系統(tǒng)的開發(fā)環(huán)境如下圖 2.1 所示。</p><p> 圖2.1 系統(tǒng)開
26、發(fā)環(huán)境圖</p><p> PC機提供了程序編寫開發(fā)和調(diào)試的平臺,搭載了Linux操作系統(tǒng)的開發(fā)環(huán)境和SecureCRT串口調(diào)試工具,完成嵌入式Linux系統(tǒng)的移植以及相關(guān)環(huán)境的搭建、程序的編寫以及調(diào)試的功能。通過串口和USB接口連接開發(fā)板,在PC機上進行對開發(fā)板的相關(guān)操作,通過以太網(wǎng)口完成PC機與開發(fā)板中的網(wǎng)絡芯片的以太網(wǎng)通信的硬件連接,實現(xiàn)以太網(wǎng)通信。</p><p> 2.2
27、ARM嵌入式硬件平臺</p><p> 硬件系統(tǒng)是ARM嵌入式系統(tǒng)一切的根本,實現(xiàn)產(chǎn)品的基礎就是硬件平臺,實現(xiàn)產(chǎn)品的附加服務,則需要軟件的幫助。為了實現(xiàn)本文的目標 - 基于ARM嵌入式的以太網(wǎng)通信程序設計,我第一步要做的就是進行對ARM嵌入式系統(tǒng)硬件的學習和了解,所以在下面幾節(jié)對于ARM嵌入式系統(tǒng)的硬件平臺結(jié)構(gòu)以及關(guān)鍵器件芯片進行介紹。</p><p> 2.2.1 嵌入式硬件平臺結(jié)
28、構(gòu)</p><p> 由上一節(jié)圖2.1可以看出,ARM嵌入式平臺需要通過以太網(wǎng)網(wǎng)絡芯片和以太網(wǎng)口完成網(wǎng)絡的聯(lián)通;以及需要USB和串口對程序和內(nèi)核等進行下載燒寫以及調(diào)試;同時,我們還需要存儲部分以及實時時鐘來提供支持,當然電源模塊為整個ARM嵌入式開發(fā)平臺提供運行的保障 。如圖2.2 所示為本文所需的ARM嵌入式系統(tǒng)的硬件結(jié)構(gòu)。</p><p> 圖 2.2 ARM嵌入式平臺硬件結(jié)構(gòu)&
29、lt;/p><p> 通過RJ45連接到PC機,在完成前期工作后,通過設置端口,運行服務器端(PC機)和客戶端(ARM嵌入式平臺)中的網(wǎng)絡程序即可實現(xiàn)TCP或UDP協(xié)議的通信。</p><p> 2.2.2 嵌入式處理器</p><p> 在嵌入式系統(tǒng)中,處理器依照其性能高低分別為嵌入式微控制器以及嵌入式微處理器。在一些低端如:簡單運算處理、邏輯控制、IO控制等
30、場合中,通常使用微控制器,這些微控制器大多是16位或8位的。而在應用一些復雜運算、有處理速度需求且實時性要求的場合中,使用的處理器多是32位甚是64位的微處理器。從2.1.1節(jié)的硬件結(jié)構(gòu)可以看出,我們需要完成通信和數(shù)據(jù)處理的相關(guān)任務,要求處理器具有較快的處理速度,然而處理器的系統(tǒng)時鐘對處理速度起決定性作用。</p><p> 本文使用的ARM嵌入式硬件平臺使用的處理器AT91SAM9G20,Atmel公司的AT
31、91SAM9G20芯片主頻達400MHz,完全滿足應用需求[4]。AT91SAM9G20微處理器基于ARM926EJ-S處理器核心內(nèi)核,包含3個32位并行的I/O控制器,可控制SDRAM以及包括Nand Flash在內(nèi)的靜態(tài)存儲器。如圖2.3為該處理器的結(jié)構(gòu)圖。</p><p> 圖2.3 AT91SAM9G20結(jié)構(gòu)圖</p><p> 2.2.3 網(wǎng)絡芯片</p>&
32、lt;p> 時今網(wǎng)絡硬、軟件技術(shù)的快速發(fā)展使得網(wǎng)絡設備的應用呈現(xiàn)大幅增長的態(tài)勢。控制各類儀器儀表、智能家電、消費電子產(chǎn)品、工業(yè)生產(chǎn)中的設備,以及它們相關(guān)數(shù)據(jù)采集的設備都開始了網(wǎng)絡化,在Internet中共享及獲取資源,從而進一步方便我們的工作和生活。</p><p> 以太網(wǎng)通信,顧名思義,我們需要實現(xiàn)網(wǎng)絡連接,也就離不開網(wǎng)絡控制芯片。在我完成設計的過程中,必要解決的就是硬件平臺同以太網(wǎng)的通信問題。本文
33、中使用的ARM嵌入式平臺采用了DM9161系列的網(wǎng)絡控制芯片DM9161AEP,DM9161AEP的結(jié)構(gòu)圖如圖2.4所示。</p><p> DM9161AEP的芯片特點如下所示:</p><p> 1.48pin LQFP封裝</p><p> 2.工藝:0.25μm,輸入輸出供電電壓3.3V,模擬部分2.5V </p><p>
34、 3.支持MII和RMII連接方式(推薦使用MII)</p><p> 4.支持雙絞線自適應(AUTO-mix)</p><p> 5.支持TCP/IP硬加速</p><p> 6.與大部分廠家的微控制器是完全兼容。使用的單口PHY。</p><p> 圖 2.4 DM9161AEP 結(jié)構(gòu)圖</p><p>
35、 2.3 搭建ARM嵌入式開發(fā)環(huán)境</p><p> 在上面介紹完ARM嵌入式系統(tǒng)的硬件平臺,展開了軟件方面的工作。對于嵌入式系統(tǒng)的軟件開發(fā)來說,需要完成建立交叉編譯工具;由于嵌入式系統(tǒng)所使用的芯片型號多種多樣,很多芯片和硬件接口不能直接兼容[6],我們需要完成移植的工作:AT91Bootstarp移植,U-Boot移植與燒寫,Linux內(nèi)核移植與燒寫,根文件系統(tǒng)移植與燒寫,PC機上開發(fā)環(huán)境的建立等任務。&l
36、t;/p><p> 2.3.1 嵌入式Linux簡介</p><p> Linux最早是由Linus Torvalds所創(chuàng)建的,經(jīng)過20年時間的發(fā)展,Linux已經(jīng)成為一個有著強大功能且穩(wěn)定可靠的OS。經(jīng)過對原有的Linux操作系統(tǒng)進行調(diào)整和剪裁,形成了可在嵌入式平臺運行的嵌入式Linux操作系統(tǒng)。嵌入式Linux操作系統(tǒng)擁有嵌入式操作系統(tǒng)的全部特征,同時保留了十分豐富的開放的源代碼,所
37、以應用在嵌入式系統(tǒng)中是越來越普遍。</p><p> 嵌入式Linux操作系統(tǒng)與其它嵌入式操作系統(tǒng)相比具有以下特點:</p><p> 開放源代碼。Linux最大的特點就是源代碼公開并且執(zhí)行GPL協(xié)議,嵌入式Linux開發(fā)人員根據(jù)自己產(chǎn)品的需求可以更改內(nèi)核源碼來滿足功能使用;不存在黑箱技術(shù),遍布全球的眾多Linux愛好者又是Linux開發(fā)的強大技術(shù)后盾[5]。</p>&
38、lt;p> 可裁剪、高效率的微小內(nèi)核。Linux小內(nèi)核、高效率,內(nèi)核的更新速度快而且可以被定制。它的系統(tǒng)內(nèi)核最小可以到134KB,這么優(yōu)秀的內(nèi)核設計可以使系統(tǒng)的僅僅占據(jù)更小的資源便可以可靠且穩(wěn)定的運行。獨特的模塊機制可以將用戶的驅(qū)動或者應用程序模塊動態(tài)的從內(nèi)核中插入或卸載。</p><p> 免費。產(chǎn)品制造生產(chǎn)商在開發(fā)完基于嵌入式Linux的產(chǎn)品以后無需為產(chǎn)品的發(fā)布支付相關(guān)的許可費。</p>
39、<p> 支持眾多硬件。嵌入式Linux操作系統(tǒng)可以支持多種處理器和多種硬件體系,是一種可以跨越平臺的操作系統(tǒng)。</p><p> 安全、可靠。嵌入式Linux十分可靠,可以毫無故障的運行數(shù)年,一直廣泛被數(shù)據(jù)中心所應用。與此同時,嵌入式Linux的開發(fā)人員還可以使用systrace或者grsecurity此類的工具來加強其安全性,這是Windows操作系統(tǒng)開發(fā)者無法想象的。</p>
40、<p> 優(yōu)秀的網(wǎng)路功能。嵌入式Linux在網(wǎng)絡方面有著十分完整的內(nèi)核結(jié)構(gòu),Linux對網(wǎng)絡中最常用的網(wǎng)絡協(xié)議,如TCP/IP網(wǎng)絡通信協(xié)議有著整體的支持。并且提供包括了10兆、100兆、1000兆的以太網(wǎng)絡的支持。因此嵌入式Linux十分適用于網(wǎng)絡相關(guān)產(chǎn)品的開發(fā)。</p><p> 嵌入式Linux的應用,主要在數(shù)字電話、機頂盒、視頻通信、數(shù)據(jù)網(wǎng)絡、以太網(wǎng)交換機、Hub、遠程通信、網(wǎng)橋、醫(yī)療電子、
41、信息家電、PDA、工業(yè)等領(lǐng)域。可以說嵌入式Linux在民用還是工用范疇都有著普遍應用,當前很多平板電腦和智能手機采用的安卓也是采用Linux的內(nèi)核。</p><p> 2.3.2 ARM嵌入式系統(tǒng)一般的開發(fā)方法</p><p> 與多數(shù)常見的桌面軟件的開發(fā)所不同,當嵌入式軟件開發(fā)人員開發(fā)一個基于嵌入式系統(tǒng)的應用時,首先會在PC機上選擇合適的嵌入式開發(fā)環(huán)境并且進行軟件開發(fā),然后在實驗板
42、或者開發(fā)平臺上對其代碼進行測試,最后PC機編譯生成正確的映像文件或者可執(zhí)行的文件,并且燒寫到最終的目標產(chǎn)品中,如圖2.5所示。</p><p> 圖 2.5 ARM嵌入式系統(tǒng)開發(fā)的一般方法</p><p> 對于ARM嵌入式平臺的Linux軟件開發(fā)一般步驟如下:</p><p> PC機的開發(fā)環(huán)境選擇。這里本文選擇的是Fedora 14 系統(tǒng)。通過在Windo
43、ws系統(tǒng)中的虛擬機來安裝Fedora 14操作系統(tǒng),便于調(diào)試。</p><p> 建立交叉編譯工具:Fedora 14自帶的GCC都是針對x86架構(gòu)的,為了可以讓編寫的代碼在開發(fā)板或者最終產(chǎn)品上良好運行,建立交叉編譯工具是所必須條件。</p><p> 開發(fā)、移植Bootloader。</p><p> 配置、燒寫U-Boot。</p><
44、p> 配置、移植Linux內(nèi)核。</p><p><b> 建立根文件系統(tǒng)。</b></p><p><b> 開發(fā)程序。</b></p><p> 2.3.3 嵌入式Linux交叉編譯環(huán)境的建立</p><p> 嵌入式系統(tǒng)的硬件性能和其存儲空間有限,因此,在對程序進行開發(fā)的時候
45、都是在PC機上進行操作,首先建立一個用于開發(fā)板的交叉編譯工具,用其在PC機上編譯程序用于開發(fā)板??梢钥闯?,可以在一個系統(tǒng)平臺中編譯出能夠運行在不同的體系架構(gòu)上的代碼,這就是交叉編譯。比如在處理器架構(gòu)為x86的微機中編譯出可以運行在ARM嵌入式中的代碼。若使用桌面級編譯環(huán)境,則無法生成在ARM平臺上運行的程序代碼。</p><p> 在PC機Linux系統(tǒng)下利用GCC編譯程序,這樣的編譯方法稱之為本地編譯,本地編
46、譯的代碼只能夠在本地運行。與本地編譯相對應的,即是上面所介紹的交叉編譯,通過交叉編譯器可以編譯出這種跨平臺程序。</p><p> 采用arm-linux-gcc-4.3.2版本的交叉編譯工具,通過網(wǎng)絡下載到的文件解壓到個人目錄中。隨后由終端進入解壓后生成的/usr/local/目錄中,將目錄下的arm目錄整體復制到系統(tǒng)文件根目錄/usr/local/下面。然后所有交叉編譯工具都存儲在其中,如圖2.6所示。&l
47、t;/p><p> 圖2.6 交叉編譯工具 arm-linux-gcc-4.3.2</p><p> 然后更改環(huán)境變量PATH的函數(shù),將統(tǒng)一存儲的交叉編譯工具的路徑目錄添加到其中。在終端中對PATH進行修改,鍵入:</p><p> #export PATH = /usr/local/arm/4.3.2/bin: $PATH</p><p>
48、; 繼而檢查是否正確添加路徑到PATH中,鍵入:</p><p> #echo $PATH</p><p> 如圖2.7所示,可以看到,有顯示包含有交叉編譯工具的路徑,說明已完成添加新路徑至PATH。至此,已經(jīng)完成交叉編譯環(huán)境的搭建。</p><p> 圖2.7 添加交叉編譯工具環(huán)境變量</p><p> 2.3.4 開發(fā)、移植A
49、T91Bootstrap</p><p> 在AT91SAM9G20芯片內(nèi)部含有一個BootRom代碼。當沒有燒寫任何Bootloader和內(nèi)核文件的情況之下給芯片上電啟動,通過串口調(diào)試工具(本文使用SecureCRT)可以看到串口是有打印消息的,顯示的內(nèi)容為“RomBoot”,此RomBoot代碼是Atmel廠商定制在芯片中的,人為不能對其作修改。作為ARM嵌入式開發(fā)人員,在啟動代碼的編寫、修改和學習中,AT
50、91Bootstrap是最先面對的環(huán)節(jié)。</p><p> AT91Bootstrap它的主要作用即是對SDRAM初始化以及相關(guān)的存儲器(Nand Flash)初始化,然后加載U-Boot到SDRAM中的指定字節(jié)并開始運行U-Boot。AT91Bootstrap源代碼由公共的硬件驅(qū)動、頭文件以及庫文件等組成。</p><p> 首先,解壓下載的AT91Bootstrap,在終端中輸入:
51、</p><p> #unzip AT91Boostrap1.13.zip</p><p> 解壓后,在當前目錄下生成AT91Bootstrap目錄。進入相應9g20源碼區(qū),修改編譯工具的路徑,打開其文件夾,使用vi進行函數(shù)修改</p><p> 此時,可以直接編譯,在源目錄下執(zhí)行“make”指令。編譯過后可在該目錄下看到nandflash_at91sam9g
52、20ek.bin文件,如圖2.8所示。</p><p> #cd /home/dietrich/Bootstrap-v1.13/board/at91sam9g20ek/nandflash</p><p><b> #make</b></p><p> 圖2.8 make編譯后生成bin文件</p><p> 在這
53、里就完成了ARM嵌入式系統(tǒng)的Bootstrap編譯,接下來使用SAM-BA2.8燒寫生成的.bin文件至Nand Flash內(nèi)存的起始地址處,即0x0,也就是處理器啟動以后首先要從NandFlash上的)0x0地址位上讀取AT91Bootstrap且開始運行,這也說明在啟動代碼中,AT91Bootstrap是第一部分。</p><p> 2.3.5 U-Boot移植與燒寫</p><p&g
54、t; U-Boot的編譯形式、源碼目錄都喝Linux的內(nèi)很很相似。實際上,很多U-Boot源代碼就是通過對應的Linux系統(tǒng)內(nèi)核弱化而來,特別是很多設備驅(qū)動程序??梢栽赨-Boot源代碼的注釋行中有很多表現(xiàn)。隨著U-Boot版本不斷的升級,其所支持的硬件資源和系統(tǒng)資源也是越來越豐富。</p><p> U-Boot有著諸多優(yōu)點:源代碼開放、對很多系列的處理器支持、對很多嵌入式OS內(nèi)核支持、十分靈活的功能設置、
55、優(yōu)異的穩(wěn)定以及可靠性、多種設備的驅(qū)動源代碼以及對網(wǎng)絡的強大支持。正是因為這些特點使得U-Boot被越來越多的嵌入式操作系統(tǒng)所應用,也有著更好的使用前景。</p><p> U-Boot啟動并且引導Linux內(nèi)核這一過程可以分為兩個階段,第一個階段即為實現(xiàn)設備的初始化,絕大多數(shù)是采用匯編語言所編寫來達到目的的;第二個階段則是采用C語言編寫,可讀性強,并可實現(xiàn)相對復雜的功能。兩個階段實現(xiàn)的功能如下:</p&g
56、t;<p><b> 1.第一階段功能:</b></p><p> 設置異常項和異常處理函數(shù);</p><p> - 設置控制寄存器地址;</p><p> - 關(guān)閉著門狗和屏蔽中斷;</p><p> - 配置PLLCO飛等寄存器,確定系統(tǒng)的主頻;</p><p> -
57、 關(guān)閉MMU功能;</p><p> - 初始化RAM控制寄存器;</p><p> - 拷貝數(shù)據(jù)至SDRAM;</p><p><b> - 設置堆攏;</b></p><p><b> - 消除BSS段;</b></p><p> - 跳轉(zhuǎn)到第二階段代碼人口。&
58、lt;/p><p><b> 2.第二階段功能:</b></p><p> - 初始化本階段所涉及的硬件設備;</p><p> - 設置SDRAM的起始地址和大??;</p><p> - 讀取內(nèi)核到RAM 中;</p><p> - 為內(nèi)核設置啟動參數(shù);</p><p&
59、gt;<b> - 調(diào)用內(nèi)核。</b></p><p> 可以從網(wǎng)絡上下載U-Boot。本文采用的版本是1.3.4。在終端中使用解壓命令將U-Boot-1.3.4.tar.bz2壓縮文件在個人文件夾內(nèi)進行解壓操作,然后進入生成的u-boot-1.3.4目錄對Makefile文件進行修改,將CROSS_COMPILE變量修改為編譯器所在目錄(本文2.2.3節(jié))。保存退出vi后對U-Boot
60、進行make編譯,即可在文件目錄下生成我們需要的二進制.bin文件。</p><p> 圖2.9 編譯后生成的bin文件</p><p> 燒寫U-Boot的方法仍然與上一節(jié)燒寫AT91SAM9G20相同,如圖2.10所示,也是通過SAM-BA軟件。不過需要注意的是燒寫起始地址應為NandFlash的0x200000地址處,然后Send File開始燒寫u-boot.bin。</
61、p><p> 圖2.10 燒寫U-Boot.bin</p><p> 2.3.6 嵌入式Linux內(nèi)核的移植及燒寫</p><p> 嵌入式Linux內(nèi)核在本文中選擇Linux-2.6.27這個一個版本,解壓Linux-2.6.27.tar.bz2壓縮文件,可以觀察到源碼包內(nèi)有相當多的文件和目錄,為了掌握Linux內(nèi)核的移植方法,了解其結(jié)構(gòu)很有必要的。</
62、p><p> Linux-2.6.27內(nèi)核包中一共有20個文件夾,有很多都與本文無關(guān),不做介紹,下面只介紹最為重要的7個文件目錄:</p><p> arch目錄。arch子目錄包括了和硬件體系相關(guān)的核心代碼。它的每一個子目錄都是代表一種可以支持的硬件體系結(jié)構(gòu),例如i386 就是關(guān)于Intel CPU 及與之相兼容體系結(jié)構(gòu)的子目錄(PC 機一般都基于此目錄)。其中的arm 目錄是我們需要特
63、別關(guān)心的,里面包含的是基于ARM處理器的體系結(jié)構(gòu),是本文對Linux 進行移植所需用到的目錄。</p><p> drivers目錄。drivers 子目錄里面是Linux系統(tǒng)所支持的硬件設備驅(qū)動程序;每種驅(qū)動程序各占用一個下級子目錄,如/usb目錄下為通用串行總線USB設備驅(qū)動程序。對drivers/block/這個目錄下的genhd.c文件進行查看,其中的device_setup()函數(shù)可以了解設備初始化的
64、過程。</p><p> fs目錄。fs子目錄包含的是所有文件系統(tǒng)和各種類型的文件操作代碼,此目錄包含用于配置核心的腳本文件等。</p><p> kenerl目錄。此目錄內(nèi)為核心代碼,包含了進程通信、進程調(diào)度、內(nèi)存管理、虛擬文件系統(tǒng)等在內(nèi)的Linux系統(tǒng)大多數(shù)的內(nèi)核函數(shù)。</p><p> include 目錄。include 子目錄包括編譯核心所需要的大部
65、分頭文件。</p><p> init 目錄。這個目錄內(nèi)包含初始化代碼。</p><p> lib 目錄。lib 子目錄里面包含Linux 內(nèi)核庫函數(shù)代碼。</p><p> 在Linux 內(nèi)核源碼的根目錄下還有一個文件需要特別注意,就是“Makefile文件”。它是Linux內(nèi)核里面的第一個Makefile文件,其主要用來聯(lián)系內(nèi)核的各個模塊,保存各種模塊互相
66、間的承接關(guān)系以及連接,在進行內(nèi)核編譯的時候需要修改這個文件。</p><p> 對Linux內(nèi)核的配置修改,是移植Linux內(nèi)核的流程中所做的第一步,亦是相當重要且十分繁雜的一步。內(nèi)核配置相當繁雜,有3000條左右需要配置,掌握一些方法可以降低工作的難度。</p><p> 在內(nèi)核源代碼/arch/arm/configs目錄中的配置文件可以看出Linux內(nèi)核所支持的硬件都有哪些,在這里
67、本文使用的ARM嵌入式硬件平臺與Linux內(nèi)核中提供的AT91SAM9G20EK很匹配,所以在配置內(nèi)核的過程中可以直接加載AT91SAM9G20EK這個配置文件,然后在這個配置文件的基礎上再做修改就可以了。這樣大大的提高了內(nèi)核的配置效率和準確度。</p><p> 在Linux內(nèi)核的配置上,需要對文件系統(tǒng)、雜項、網(wǎng)絡設備支持、設備驅(qū)動等進行設置,第一次設置之前需要在終端里清除設置,以免出錯。通過make men
68、uconfig。如圖2.11所示進入配置菜單界面。</p><p> 圖2.11 Linux內(nèi)核配置界面</p><p> 進入File systems文件系統(tǒng)選項,如圖2.12所示,從雜項文件系統(tǒng)中查看是否支持cramfs文件系統(tǒng)(本文使用的文件系統(tǒng))。</p><p> 圖2.12 cramfs文件系統(tǒng)支持</p><p> 然后
69、進入Device Drivers選項中的網(wǎng)絡設備支持。如圖2.13所示然后進入</p><p> 圖 2.13 網(wǎng)絡芯片驅(qū)動支持</p><p> Ethernet(10 or 100Mbit)選項,選擇需要的網(wǎng)絡芯片的驅(qū)動,進行添加。</p><p> 最后退出配置界面并且保存設置,即完成Linux內(nèi)核的配置。然后在終端進入Linux內(nèi)核源碼的目錄下,為了防
70、止編譯報錯,執(zhí)行make clean 清除之前生成的過程文件。然后執(zhí)行make uImage,如圖2.14所示生成zImage鏡像文件。</p><p> 圖2.14 編譯生成的內(nèi)核鏡像文件</p><p> 然而,還需要使用mkimage工具去編譯內(nèi)核文件,可以將其放在/usr/bin文件夾中,這樣可以直接編譯生成uImage。</p><p> 然后燒寫內(nèi)
71、核文件,同之前一樣,也是利用SAM-BA軟件。在燒寫完成AT91Bootstrap以及U-Boot后繼續(xù)燒寫uImage內(nèi)核。但是還要注意燒寫的目的地址為0xA0000。然后開始下載內(nèi)核鏡像文件uImage到Nand Flash中。</p><p> 2.3.7 根文件系統(tǒng)的移植</p><p> Linux必須在硬件的一個分區(qū)上存放系統(tǒng)啟動所必需的一些文件[7],即根文件系統(tǒng),它是
72、嵌入式Linux組成中一個特別重要的組成,它是嵌入式Linux運行里所必須的,Linux內(nèi)核運行以后,會自動尋找并且掛載自己的根文件系統(tǒng),然后執(zhí)行根文件系統(tǒng)中的可執(zhí)行文件或啟動腳本,嵌入式Linux的應用程序在經(jīng)過交叉編譯后,生成的可執(zhí)行文件也是需要放在根文件系統(tǒng)里的。</p><p> CramFS是本文所采用的根文件系統(tǒng),它是一個壓縮式的、十分小且簡單的文件系統(tǒng)。</p><p>
73、 首先在用戶文件夾創(chuàng)立一個名為cramfs的目錄,并且將根文件掛載到目錄下,將根文件系統(tǒng)和cramfs相對應。然后通過mkcramfs工具再次打包,形成新的根文件。如圖2.15所示。</p><p> 圖2.15 生成根文件系統(tǒng)</p><p> 燒寫根文件系統(tǒng)與前面的Linux內(nèi)核、U-Boot、AT91Bootstrap不同,本文使用tftp的方式燒寫根文件系統(tǒng),因為根文件系統(tǒng)可以
74、做到很大,采用串口或并口傳輸會很慢,通過網(wǎng)線使用tftp的方式燒寫要快捷很多。如圖2.16所示,windows下的tftp界面。設置configure中的Home Directory為當前存放根文件映象的目錄,網(wǎng)線連接開發(fā)板,上電,點擊軟件中的Start可以看到左下角顯示Server is running,表示tftp服務器運行正常,設置完畢。</p><p> 圖2.16 tftp啟動界面</p>
75、<p> 啟動串口調(diào)試終端軟件SecureCRT,接下來重新給開發(fā)板上電,在等待進入U-Boot倒計時的時候按住空格鍵,直接進入Boot界面,在這個U-Boot中設置tftp的服務器(PC虛擬機上Fedora)及客戶端(開發(fā)板)的IP地址。如圖2.17所示。</p><p> 圖2.17 設置TFTP服務器及客戶端的IP</p><p> 通過U-Boot命令下載根文件
76、系統(tǒng)鏡像到目標板內(nèi)存中,如圖2.18所示,燒寫根文件到內(nèi)存地址0x20000000處。同時把內(nèi)存中的根文件系統(tǒng)鏡像復制至Nand Flash,從而完成對ARM嵌入式的根文件系統(tǒng)的燒寫。</p><p> 圖2.18 在boot通過tftp燒寫根文件系統(tǒng)</p><p> 2.4 PC機Linux開發(fā)環(huán)境的建立</p><p> 在之前,已經(jīng)安裝了交叉編譯的環(huán)
77、境,本應屬于本節(jié)的內(nèi)容,但編譯內(nèi)核、U-boot等都對其有需要,所以不在本節(jié)敘述。對于程序開發(fā)的環(huán)境,本文使用集成開發(fā)環(huán)境Eclipse。</p><p> Eclipse集成開發(fā)環(huán)境僅僅只是個平臺框架,不過各種插件對其支持從而使得其獲得別的功能單一IDE工具難以比擬的靈活性。</p><p> 選擇Eclipse還有一點,即是Eclipse的圖形界面的開發(fā)方式和其良好的框架設計體系。
78、這對習慣Windows圖形界面下開發(fā)方式的人員來說要方便許多。在Fedora14系統(tǒng)中,在安裝時選擇全部安裝,在安裝完畢以后,可以直接在程序里的編程目錄中直接啟動Eclipse。如圖2.19所示Eclipse的工作界面。</p><p> 圖2.19 Eclipse工作界面</p><p> 對于Eclipse的的使用,本文將在第4章嵌入式通信程序的設計中給予說明。</p>
79、<p><b> 2.5 本章小結(jié)</b></p><p> 本章介紹了ARM嵌入式Linux構(gòu)建的相關(guān)知識,也是進行ARM嵌入式以太網(wǎng)通信程序開發(fā)首先要面對的工作,具體涉及啟動代碼、內(nèi)核、根文件系統(tǒng)的編譯和配置、PC宿主機開發(fā)環(huán)境的搭建以及Eclipse軟件的應用。完成了AT91Bootstrap、U-Boot、Kernle、CramFS 的編譯和配置。在編譯過程中會出
80、現(xiàn)的問題本章也做了說明并提出了解決辦法。這部分知識具有一定的通用性,其中Eclipse是進行代碼調(diào)試常有效的軟件平臺,熟練掌握后可以很有效地進行嵌入式linux代碼的編寫和在線仿真調(diào)試。</p><p> 3 ARM嵌入式以太網(wǎng)通信的開發(fā)</p><p> Linux系統(tǒng)的一個主要特點是它強大的網(wǎng)絡支持功能,它在網(wǎng)絡方面的應用也越來越廣泛。本章敘述了TCP/IP 協(xié)議和Linux 網(wǎng)
81、絡開發(fā)的基礎知識,本章是下一章TCP服務器、TCP客戶端開發(fā),UDP服務器以及UDP客戶端開發(fā)程序設計的理論基礎。</p><p> 3.1 OSI網(wǎng)絡模型</p><p> 網(wǎng)絡結(jié)構(gòu)的標準模型是OSI模型。它是很多網(wǎng)絡協(xié)議模型的基礎,目前大多數(shù)的網(wǎng)絡通信協(xié)議都是基于這個模型建立起來的,這種分層的思想在很多領(lǐng)域中都得到了廣泛地應用。</p><p> OSI
82、協(xié)議參考模型從上到下共分為7層,分別是:應用層、表示層、會話層、傳輸層、網(wǎng)絡層、數(shù)據(jù)鏈路層及物理層。OSI七層網(wǎng)絡模型及其功能如表3.1所列。</p><p> 表3.1 OSI 7層網(wǎng)絡模型</p><p> 在OSI七層網(wǎng)絡模型中,各層之間的規(guī)則是相互獨立的,每層通過下一層的數(shù)據(jù)為上一層提供服務,不同主機相同層次之間是對等的,每一層都規(guī)定了不同的特性并完成不同的功能。</p&
83、gt;<p> 3.2 TCP/IP協(xié)議棧的基本概念</p><p> 上節(jié)中簡單介紹了國際互聯(lián)網(wǎng)標準化組織推薦的OSI網(wǎng)絡模型,但OSI模型過于龐大且較為復雜,具體實現(xiàn)有很多困難。在實際應用中,TCP/IP是網(wǎng)絡中使用的基本通信協(xié)議。</p><p> TCP/IP 的協(xié)議參考和OSI協(xié)議的對應關(guān)系如圖3.1所示。</p><p> 圖3.
84、1 OSI七層模型與TCP/IP四層模型對照圖</p><p> 目前有很多種實現(xiàn)的方式,比如串行線路(Serial Line IP, SLIP)、點對點P2P等。在以太網(wǎng)應用中,該層網(wǎng)絡在IP數(shù)據(jù)的基礎上增加了一共14個字節(jié)的報頭,這14個字節(jié)被稱為以太網(wǎng)報頭,其數(shù)據(jù)格式如圖3.2 所示。</p><p> 圖3.2 以太網(wǎng)數(shù)據(jù)格式</p><p> 3.3
85、 TCP協(xié)議基本概念</p><p> TCP協(xié)議建立在不可靠的網(wǎng)絡層IP協(xié)議之上,在IP協(xié)議的基礎上,增加了確認重發(fā)、超時重傳、流量控制等機制,實現(xiàn)了一種面向連接的傳輸協(xié)議。建立好連接后,雙方便均可收發(fā)信息直到連接斷開[7]。</p><p> TCP協(xié)議是在IP協(xié)議的基礎上進行數(shù)據(jù)傳輸?shù)?,TCP數(shù)據(jù)在IP報文中的位置如圖3.3所示。</p><p> 圖
86、3.3 TCP數(shù)據(jù)在IP報文中的位置</p><p> 3.3.1 建立與斷開TCP連接</p><p> 主機A 與主機B 要想通過TCP協(xié)議進行通信,需要通過3個報文段完成TCP</p><p> 連接的建立,這個過程稱為三次握手(three-way handshake),即對每次發(fā)送的數(shù)據(jù)量是怎樣跟蹤進行協(xié)商使數(shù)據(jù)段的發(fā)送和接收同步[8],如圖3.4所
87、示。TCP 連接的建立需要雙方發(fā)送自己的同步SYN信息給對方,在SYN中包含了末端初始化的數(shù)據(jù)序號,并且需要收到對方對自身發(fā)出SYN的確認。三次握手過程為:</p><p> 第一次:主機A向主機B發(fā)送連接請求,其中包含SYN段信息,通知主機B主機端口和序號。</p><p> 第二次:主機B應答主機A,向主機A發(fā)送建立連接請求,并發(fā)送主機B的初始序號,其中ACK段為主機A發(fā)送的ISN
88、 + l。</p><p> 第三次:主機A將主機B發(fā)送的SYN段加1(SYN + 1)作為確認號返回給主機B作為應答。</p><p> 圖3.4 TCP建立連接的三次握手過程</p><p> 建立一個TCP連接需要三次握手,而斷開一個TCP連接需要四次揮手,其過程如圖3.5所示。</p><p> 圖3.5 TCP斷開連接的四次
89、揮手過程</p><p> 第一次:主機A發(fā)送FIN字段到主機B,發(fā)送斷開連接的請求。</p><p> 第二次:主機B先確認主機A的FIN請求,然后發(fā)送ACK字段到主機A,確認序號為主機A序號加上1。</p><p> 第三次:主機B向主機A發(fā)送FIN請求。</p><p> 第四次:主機A對主機B的請求確認后,隨之斷開TCP連接。
90、</p><p> 3.3.2 TCP傳輸中數(shù)據(jù)的封裝和解封</p><p> TCP/IP協(xié)議中數(shù)據(jù)傳輸過程與OSI七層模型相似,只不過是TCP/IP協(xié)議只是四層的網(wǎng)絡模型,實現(xiàn)起來較為方便。TCP數(shù)據(jù)通信傳輸過程如圖3.6所示。</p><p> 圖3.6 TCP通行數(shù)據(jù)傳輸中的封裝和解封</p><p> 數(shù)據(jù)從應用程序發(fā)送到
91、物理層驅(qū)動程序處的過程是一個將數(shù)據(jù)封裝的過程。在發(fā)送數(shù)據(jù)的主機A中,數(shù)據(jù)經(jīng)過傳輸層增加了TCP頭部,再經(jīng)過網(wǎng)絡層增加了IP頭部,最后達到物理層驅(qū)動程序中并添加了以太網(wǎng)頭部,然后將封裝完畢的數(shù)據(jù)發(fā)送到以太網(wǎng)中進行傳輸,送往接收主機B一端。</p><p> 以太網(wǎng)數(shù)據(jù)包從物理層傳送到應用程序處的過程是一個將數(shù)據(jù)解封的過程。在主機B上,驅(qū)動程序從以太網(wǎng)中接收到以太網(wǎng)數(shù)據(jù)包,將以太網(wǎng)數(shù)據(jù)包去除頭部和尾部后進行CRC校
92、驗后發(fā)送到網(wǎng)絡層,在IP協(xié)議層內(nèi)去除IP頭部并發(fā)送至傳輸層的TCP協(xié)議,在TCP協(xié)議層去除掉TCP頭部獲得需要的數(shù)據(jù),然后將數(shù)據(jù)傳遞給應用程序,在主機B上的應用程序最后得到的是去除掉各種協(xié)議層頭部的有效數(shù)據(jù)。</p><p> 3.3.3 TCP協(xié)議的特點</p><p> 總結(jié)TCP 協(xié)議具有以下幾個突出的特點。</p><p> 1.面向連接的服務:TC
93、P進行數(shù)據(jù)傳輸之前必須要建立TCP連接,連接完成后,所有TCP報文的傳輸都在此連接的基礎上進行。</p><p> 2.可靠的傳輸服務:采用校驗和應答重發(fā)機制保證傳輸?shù)目煽啃?,接收方需要對接收的TCP報文進行校驗和計算,如果計算結(jié)果錯誤則不發(fā)送確認響應,沒有接收到響應的發(fā)送端主機將在超時后自動重發(fā)剛才的TCP報文。</p><p> 3.字節(jié)流服務:TCP協(xié)議進行傳輸?shù)臅r候?qū)?shù)據(jù)視為沒
94、有結(jié)構(gòu)的字節(jié)流,這樣基于這樣的字節(jié)流傳輸就沒有字節(jié)順序(大端模式/小端模)的問題。</p><p> 4.流量控制:支持端到端的流量控制。</p><p> 3.4 UDP協(xié)議</p><p> 用戶數(shù)據(jù)包協(xié)議(User Datagram Protocol),簡稱UDP協(xié)議。UDP是OSI參考模型中一種無連接的傳輸層協(xié)議,提供面向事務的簡單不可靠信息傳送服務
95、,IP協(xié)議是TCP/IP協(xié)議中最為核心的協(xié)議[10]。</p><p> UDP 數(shù)據(jù)報封裝成一份IP 數(shù)據(jù)報的格式,如圖3.7 所示。</p><p> 圖3.7 UDP數(shù)據(jù)在IP報文中的位置</p><p> 鑒于UDP協(xié)議的上述特點,在網(wǎng)絡質(zhì)量較差的環(huán)境下使用UDP協(xié)議會出現(xiàn)數(shù)據(jù)包丟失嚴重的問題,但使用UDP協(xié)議比獲得較快的使用速度,我們?nèi)粘5膽贸绦蛑?/p>
96、老版的QQ就是使用UDP協(xié)議傳輸[11]。</p><p> 3.4.1 UDP傳輸中數(shù)據(jù)的封裝和解封</p><p> 由于UDP協(xié)議與TCP協(xié)議都同屬于傳輸層,其在網(wǎng)絡傳輸中的作用也比較相似,因此UDP協(xié)議數(shù)據(jù)傳輸過程中的數(shù)據(jù)封裝和解封過程與TCP協(xié)議極為相似。UDP協(xié)議層的數(shù)據(jù)傳輸過程如圖3.8所示。</p><p> 圖3.8 UDP通信數(shù)據(jù)傳輸中的
97、封裝和解封</p><p> 數(shù)據(jù)從應用程序發(fā)送到物理層驅(qū)動程序處的過程是一個將數(shù)據(jù)封裝的過程。在發(fā)送數(shù)據(jù)的主機A中,數(shù)據(jù)經(jīng)過傳輸層增加了UDP 頭部,再經(jīng)過網(wǎng)絡層增加了IP頭部,最后達到物理層驅(qū)動程序代碼中添加了以太網(wǎng)頭部,然后將封裝完畢的數(shù)據(jù)發(fā)送到以太網(wǎng)中進行傳輸,送往接收主機B一端。</p><p> 以太網(wǎng)數(shù)據(jù)包從物理層傳送到應用程序處的過程是一個將數(shù)據(jù)解封的過程。在主機B上,
98、驅(qū)動程序從以太網(wǎng)中接收到以太網(wǎng)數(shù)據(jù)包,將以太網(wǎng)數(shù)據(jù)包去除頭部和尾部后進行CRC校驗后發(fā)送到網(wǎng)絡層,在IP協(xié)議層內(nèi)去除IP頭部并發(fā)送至傳輸層UDP協(xié)議處,在UDP協(xié)議層去除掉UDP頭部獲得需要的數(shù)據(jù),然后將數(shù)據(jù)傳遞給應用程序,在主機B上的應用程序最后得到的是去除掉各種頭部的有效數(shù)據(jù)。</p><p> 3.4.2 UDP協(xié)議特點</p><p> 總結(jié)UDP協(xié)議具有以下特點:</
99、p><p> 1.UDP無連接協(xié)議,</p><p> 2.可廣播傳輸相同的消息。</p><p> 3.UDP信息包的開銷小。</p><p> 4.吞吐量不受算法的調(diào)節(jié)。</p><p> 5.UDP是面向報文的。</p><p><b> 3.5 本章小結(jié)</b&
100、gt;</p><p> 本章介紹了TCP協(xié)議和UDP協(xié)議的數(shù)學模型,以及數(shù)據(jù)轉(zhuǎn)移的流程,這是ARM嵌入式以太網(wǎng)通信程序設計的基礎,有了這一章的基礎知識,我么可以畫出流程圖,對TCP和UDP通信的流程進行分解,通過下一章的Linux網(wǎng)絡編程套接字的幫助,然后實現(xiàn)其軟件的編程,即可實現(xiàn)ARM嵌入式以太網(wǎng)通信程序的設計。</p><p> 4 ARM嵌入式的以太網(wǎng)通信程序設計</p
101、><p> 通過前面幾章,完成了本課題的前期工作,也是非常重要的,搭建了開發(fā)環(huán)境,搭建了嵌入式Linux系統(tǒng),熟悉了嵌入式的網(wǎng)絡知識;熟悉了TCP/IP和UDP/IP的原理;以及學習了嵌入式Linux的網(wǎng)絡編程,本章講述TCP/IP與UDP/IP的以太網(wǎng)通信程序的設計過程,以及在開發(fā)板上與PC之間以太網(wǎng)通信的測試。</p><p> 4.1 TCP通信程序設計</p>&l
102、t;p> TCP 網(wǎng)絡編程的分為對服務器端和客戶端兩個部分的的程序設計,通過兩端互相接收/發(fā)送請求、進行連接和傳輸數(shù)據(jù),TCP協(xié)議設計了嚴格的3次建立連接握手過程、4次關(guān)閉連接握手過程[11]。</p><p> 4.1.1 TCP 服務器踹編程模式</p><p> TCP 服務器端模式下編程主要分為以下流程:建立套接字socket()、綁定套接字與端口bind()、設置服
103、務器的監(jiān)聽連接listen()、接收客戶端連接accept()、接收和發(fā)送數(shù)據(jù)read()/write()。和recv() /send()等、關(guān)閉套在字close()。如圖4.1 (a)所示為該TCP服務器端模式的流程圖。</p><p> 圖4.1 TCP服務器端模式流程圖</p><p> socket()函數(shù)用于對網(wǎng)絡、協(xié)議以及協(xié)議具體參數(shù)進行設置,實現(xiàn)套接字的初始化</p
104、><p> 套接字與端口的綁定過程中,調(diào)用bind()函數(shù)將套接字與一個地址結(jié)構(gòu)進行綁定。只有綁定之后才能進行數(shù)據(jù)的接收和發(fā)送。</p><p> 函數(shù)listen()用來初始化服務器可連接的隊列。</p><p> TCP服務器用accept()函數(shù)一直監(jiān)聽端口,直到一個客戶端的連接請求到達。</p><p> TCP 服務器通過sen
105、d()和recv()或write()和read()等函數(shù)進行數(shù)據(jù)發(fā)送和接收。</p><p> 當完成通訊需求后,此時需要通過close()函數(shù)去關(guān)閉套接字的連接,結(jié)束通信。</p><p> 4.1.2 TCP客戶端編程模式</p><p> TCP客戶端模式下編程主要分為以下流程:建立套接字、服務器連接、接收和發(fā)送數(shù)據(jù)、關(guān)閉套接字。圖4.2為該TCP 客
106、戶端模式的流程圖。</p><p> 圖4.2 TCP客戶端模式流程圖</p><p> 客戶端模式流程與服務器端模式流程類似,兩者不同之處是客戶端直接利用connect()函數(shù)連接服務器端,并根據(jù)用戶設置的服務器地址、端口等參數(shù)與特定服務器程序進行通信。在TCP 協(xié)議的客戶端是不需要綁定端口、監(jiān)聽、接受客戶端連接這3個函數(shù)的。</p><p> 4.1.3
107、 TCP服務器端與客戶端通信過程</p><p> TCP服務器端與客戶端進行數(shù)據(jù)交換要進行三次握手才可以完成TCP連接,之后才開始進行數(shù)據(jù)交換[12],客戶端的讀數(shù)據(jù)過程對應服務器端的寫數(shù)據(jù)過程,客戶端與服務器端之間的的讀寫數(shù)據(jù)過程是相互對應的。當兩者完成數(shù)據(jù)讀寫后,關(guān)閉套接字的連接,結(jié)束通信。該過程如圖4.3所示。</p><p> 圖4.3 TCP服務器端與客戶端數(shù)據(jù)交互過程&l
108、t;/p><p> 4.2 TCP網(wǎng)絡程序設計流程</p><p> 4.2.1 創(chuàng)建網(wǎng)絡套接字函數(shù)socket()</p><p> socket()函數(shù)用于建立一個socket套接字的連接,可指定socket類型等信息。在建立了socket連接之后,可對sockaddr和sockaddr_in兩個數(shù)據(jù)類型進行初始化,以保存所建立的socket信息。sock
109、et()函數(shù)調(diào)用成功后會返回一個表示套接字的文件描述符。該函數(shù)的原型如下所示:</p><p> Family設置使用的協(xié)議族。通信協(xié)議在頭文件<sys/socket.h>中定義。常見的協(xié)議族見表4.1所列,在以太網(wǎng)中通常將這個參數(shù)設置為AF_INET。</p><p> 表4.1 參數(shù)family可選值及代表的協(xié)議族</p><p> Socke
110、t()函數(shù)的第二個參數(shù)type用于指明套接字通信的類型,type的可選值及所代表的的含義如表4.2所示。</p><p> 表4.2參數(shù)type可選值及代表的通信類型</p><p> 第三個參數(shù)protocol通常設置為0,表示通過參數(shù)family指定的協(xié)議族和參數(shù)type 指定的套接字類型來確定使用的協(xié)議。當為原始套接字時,系統(tǒng)無法唯一地確定協(xié)議,此時就需要使用該參數(shù)所指定的協(xié)議。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于arm嵌入式的以太網(wǎng)通信程序設計
- 基于ARM Cortex的嵌入式以太網(wǎng)通信的實現(xiàn).pdf
- 基于DSP嵌入式以太網(wǎng)通信系統(tǒng)的設計.pdf
- 基于dsp嵌入式以太網(wǎng)通信系統(tǒng)的設計(1)
- 交通狀態(tài)獲取的嵌入式以太網(wǎng)通信方法.pdf
- 基于嵌入式系統(tǒng)的電場數(shù)據(jù)存儲及以太網(wǎng)通信設計.pdf
- 基于ARM7的嵌入式系統(tǒng)CAN總線和以太網(wǎng)通信研究與實現(xiàn).pdf
- 交通狀態(tài)獲取的嵌入式以太網(wǎng)通信方法(1)
- 基于μC-OS-Ⅱ的嵌入式工業(yè)以太網(wǎng)通信接口設計與應用.pdf
- 基于嵌入式ARM的視頻以太網(wǎng)服務器的設計.pdf
- 基于ARM的嵌入式系統(tǒng)驅(qū)動程序設計.pdf
- 基于ARM的WSN與以太網(wǎng)互聯(lián)的嵌入式網(wǎng)關(guān)設計.pdf
- 基于以太網(wǎng)的嵌入式電表的設計.pdf
- 基于C-CORE的嵌入式系統(tǒng)研究及以太網(wǎng)驅(qū)動程序設計.pdf
- 基于嵌入式的工業(yè)以太網(wǎng)網(wǎng)關(guān)設計.pdf
- 基于嵌入式系統(tǒng)的以太網(wǎng)接口設計.pdf
- 嵌入式以太網(wǎng)的通信技術(shù)研究.pdf
- 基于SOPC的以太網(wǎng)通信系統(tǒng)的設計.pdf
- 基于嵌入式系統(tǒng)的聊天程序設計
- 基于以太網(wǎng)技術(shù)的嵌入式控制平臺設計
評論
0/150
提交評論