LwIP協(xié)議棧開(kāi)發(fā)嵌入式網(wǎng)絡(luò)的三種方法分析_第1頁(yè)
LwIP協(xié)議棧開(kāi)發(fā)嵌入式網(wǎng)絡(luò)的三種方法分析_第2頁(yè)
LwIP協(xié)議棧開(kāi)發(fā)嵌入式網(wǎng)絡(luò)的三種方法分析_第3頁(yè)
LwIP協(xié)議棧開(kāi)發(fā)嵌入式網(wǎng)絡(luò)的三種方法分析_第4頁(yè)
LwIP協(xié)議棧開(kāi)發(fā)嵌入式網(wǎng)絡(luò)的三種方法分析_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

LwIP協(xié)議棧開(kāi)發(fā)嵌入式網(wǎng)絡(luò)的三種方法分析摘要輕量級(jí)的TCP/IP協(xié)議棧LwIP,提供了三種應(yīng)用程序設(shè)計(jì)方法,且很容易被移植到多任務(wù)的操作系統(tǒng)中。本文結(jié)合gC/OS-II這一實(shí)時(shí)操作系統(tǒng),以建立TCP服務(wù)器端通信為例,分析三種方法以及之間的關(guān)系,著重介紹基于rawAPI的應(yīng)用程序設(shè)計(jì)。最后在ST公司STM32F107微處理器平臺(tái)上驗(yàn)證,并給出了測(cè)試結(jié)果。關(guān)鍵詞LwIP協(xié)議棧;gC/OS-II;嵌入式網(wǎng)絡(luò);STM32F107;隨著嵌入式系統(tǒng)功能的多樣化以及網(wǎng)絡(luò)在各個(gè)領(lǐng)域的中的廣泛應(yīng)用,具備網(wǎng)絡(luò)功能的嵌入式設(shè)備擁有更高的使用價(jià)值和更強(qiáng)的通用性。然而大部分嵌入式設(shè)備使用經(jīng)濟(jì)型處理器,受內(nèi)存和速度限制,資源有限,不需要也不可能完整實(shí)現(xiàn)所有的TCP/IP協(xié)議,有時(shí)只需要滿足實(shí)際需求就行。LwIP是由瑞典計(jì)算機(jī)科學(xué)研究院開(kāi)發(fā)的輕量型TCP/IP協(xié)議棧,其特點(diǎn)是保持了以太網(wǎng)的基本功能,通過(guò)優(yōu)化減少了對(duì)存儲(chǔ)資源的占用°LwIP是免費(fèi)、開(kāi)源的,任何人可以使用,能夠在裸機(jī)的環(huán)境下運(yùn)行,當(dāng)然設(shè)計(jì)的時(shí)候也考慮了將來(lái)的移植問(wèn)題,可以很容易移植到多任務(wù)操作系統(tǒng)中。本文介紹了以ARM微處理器STM32F107和PHY接口DP83848為平臺(tái),構(gòu)建的嵌入式系統(tǒng)中,采用LwIP和嵌入式操作系統(tǒng)gC/OS-II,使用協(xié)議棧提供的三種應(yīng)用程序接口,實(shí)現(xiàn)嵌入式設(shè)備的網(wǎng)絡(luò)通信功能。1LwIP和uC/OS-II介紹LwIP協(xié)議棧LwIP協(xié)議是瑞士計(jì)算機(jī)科學(xué)院的AdamDunkels等開(kāi)發(fā)的一套用于嵌入式系統(tǒng)的開(kāi)放源代碼TCP/IP協(xié)議棧。LwIP含義是lightweight(輕型)IP協(xié)議,在實(shí)現(xiàn)時(shí)保持了TCP協(xié)議的主要功能基礎(chǔ)上減少對(duì)RAM的占用,一般它只需要幾十K的RAM和40K左右的ROM就可以運(yùn)行,這使LwIP協(xié)議棧很適合在低端嵌入式系統(tǒng)中使用。LwIP協(xié)議棧的設(shè)計(jì)才用分層結(jié)構(gòu)的思想,每一個(gè)協(xié)議都作為一個(gè)模塊來(lái)實(shí)現(xiàn),提供一些與其它協(xié)議的接口函數(shù)。所有的TCP/IP協(xié)議棧都在一個(gè)進(jìn)程當(dāng)中,這樣TCP/IP協(xié)議棧就和操作系統(tǒng)內(nèi)核分開(kāi)了。而應(yīng)用程序既可以是單獨(dú)的進(jìn)程也可以駐留在TCP/IP進(jìn)程中,它們之間利用ICP機(jī)制進(jìn)行通訊。如果應(yīng)用程序是單獨(dú)的線程可以通過(guò)操作系統(tǒng)的郵箱、消息隊(duì)列等,與協(xié)議棧進(jìn)程通訊。如果應(yīng)用程序駐留在協(xié)議棧進(jìn)程中,則應(yīng)用程序可以通過(guò)內(nèi)部回調(diào)函數(shù)和協(xié)議棧進(jìn)程通訊。pC/OS-II實(shí)時(shí)操作系統(tǒng)gC/OS-II是一個(gè)源碼公開(kāi)、可移植、可固化、可裁剪及占先式的實(shí)時(shí)多任務(wù)操作系統(tǒng),是專門(mén)為嵌入式應(yīng)用設(shè)計(jì)的實(shí)時(shí)操作系統(tǒng)內(nèi)核,已廣泛的應(yīng)用在各種嵌入式系統(tǒng)中。gC/OS-II是多任務(wù)系統(tǒng),內(nèi)核負(fù)責(zé)管理各個(gè)任務(wù),每個(gè)任務(wù)都有其優(yōu)先級(jí),gC/OS-II最多可以管理64個(gè)任務(wù),其每個(gè)任務(wù)都擁有自己獨(dú)立的堆棧。gC/OS-II提供了非常豐富的系統(tǒng)服務(wù)功能,比如信號(hào)量、消息郵箱、消息隊(duì)列、事件標(biāo)志、內(nèi)存管理和時(shí)間管理等,這些功能可以幫助用戶實(shí)現(xiàn)非常復(fù)雜的應(yīng)用。LwIP協(xié)議棧移植到pC/OS-IILwIP協(xié)議棧在設(shè)計(jì)的時(shí)候就考慮到了將來(lái)的移植問(wèn)題,因此把所有與硬件、操作系統(tǒng)、編譯器有關(guān)的部分都全部獨(dú)立起來(lái),形成了一個(gè)操作系統(tǒng)模擬層。操作系統(tǒng)模擬層用進(jìn)程間的信號(hào)量、郵箱機(jī)制處理通信問(wèn)題,而gC/OS-II是一個(gè)基于任務(wù)調(diào)度的嵌入式實(shí)時(shí)操作系

統(tǒng),因此移植LwIP協(xié)議棧到以C/OSIL是很容易實(shí)現(xiàn)的。2LwIP開(kāi)發(fā)嵌入式網(wǎng)絡(luò)應(yīng)用程序LwIP提供了三種應(yīng)用程序接口:(1) 低水平的,基于內(nèi)核/回調(diào)函數(shù)的API(后面稱RAWAPI)(2) 高水平的,連續(xù)的API(后面稱LwIPAPI)(3) BSD風(fēng)格的套接字API(后面稱BSDsocket)可以在協(xié)議棧中通過(guò)對(duì)宏定義的不同配置,來(lái)決定使用哪種方式。其中BSDsocket方式不是很成熟,RAWAPI需要編寫(xiě)回調(diào)函數(shù),協(xié)議棧推薦使用LwIPAPI這種方式,但是三種方式到了底層都是通過(guò)回調(diào)函數(shù)實(shí)現(xiàn)的。本文直接從RAWAPI入手,以建立TCP服務(wù)器端通信為例,詳述底層的調(diào)用,然后再講述后面的兩種是如何封裝而成的。2.1基于RAWAPI的應(yīng)用程序設(shè)計(jì)步驟使用RAWAPI進(jìn)行TCP/IP編程,可以使應(yīng)用程序的代碼和協(xié)議棧的代碼很好地結(jié)合起來(lái)。程序的執(zhí)行機(jī)制是以回調(diào)函數(shù)為基礎(chǔ)的事件驅(qū)動(dòng)的,同時(shí)回調(diào)函數(shù)也是被TCP/IP代碼直接調(diào)用的,回調(diào)函數(shù)、數(shù)據(jù)發(fā)送函數(shù)都需要自己編寫(xiě)。這種方式是唯一的一種支持設(shè)備裸機(jī)運(yùn)行,又可以完成網(wǎng)絡(luò)通信完成系統(tǒng)功能。裸機(jī)運(yùn)行實(shí)際相當(dāng)于是一個(gè)線程,而協(xié)議棧代碼和應(yīng)用程序代碼通過(guò)先后次序處理,完成數(shù)據(jù)流轉(zhuǎn)。圖1是使用RAWAPI方式,多任務(wù)系統(tǒng)實(shí)現(xiàn)TCP服務(wù)器端通信的步驟。系統(tǒng)初始化匕任務(wù)啟動(dòng)_完成板級(jí)支持包初始化_系統(tǒng)初始化匕任務(wù)啟動(dòng)_完成板級(jí)支持包初始化_調(diào)用協(xié)議棧接口,完成協(xié)議棧初始化、網(wǎng)卡初始化,創(chuàng)建協(xié)議棧任務(wù)創(chuàng)建網(wǎng)口數(shù)據(jù)接收任務(wù) "力?。'創(chuàng)建止仁?塊結(jié)構(gòu) tcpbind綁定本地卬、_端口tcplisten,處于偵聽(tīng)狀態(tài)1_ ,tcp_accept,注冊(cè)自己編寫(xiě) 的接收函數(shù) tcp_recv,注冊(cè)自己編寫(xiě)的 數(shù)據(jù)接收函數(shù) 編寫(xiě)網(wǎng)口數(shù)據(jù)發(fā)送函數(shù)TaskInitStart協(xié)議棧任務(wù) 「 網(wǎng)口數(shù)據(jù)接收任務(wù)■■—If---網(wǎng)卡有數(shù)據(jù)到來(lái)是調(diào)用協(xié)議棧網(wǎng)絡(luò)接口函數(shù) ethernet|if_input 等待數(shù)據(jù)到來(lái)發(fā)送消息,類型是一調(diào)用與協(xié)議棧任務(wù)通信等待數(shù)據(jù)到來(lái)TCPIP_MSG_INPKT 函數(shù)tcpip_input_數(shù)據(jù)到IP層 = 連接時(shí),回調(diào)接收函數(shù),數(shù)據(jù)到TCP層一 全局的TCP塊指針指向與客戶端通信的塊結(jié)構(gòu)有數(shù)據(jù)到來(lái)時(shí),

回調(diào)數(shù)據(jù)接收函數(shù)將接收到的數(shù)據(jù)處理后,交給應(yīng)用程序任務(wù)處理?要發(fā)送數(shù)據(jù)時(shí)調(diào)用'圖1RAWAPI有數(shù)據(jù)到來(lái)時(shí),

回調(diào)數(shù)據(jù)接收函數(shù)將接收到的數(shù)據(jù)處理后,交給應(yīng)用程序任務(wù)處理?要發(fā)送數(shù)據(jù)時(shí)調(diào)用'LwIP協(xié)議棧中的tcp塊結(jié)構(gòu)有兩種TCP_PCB和TCP_PCB_LISTEN,前者在內(nèi)存池中的默認(rèn)個(gè)數(shù)是5,后者是8,其中l(wèi)isten型的結(jié)構(gòu)占用少量的內(nèi)存,專門(mén)用于處理在偵聽(tīng)狀態(tài)的tcp塊結(jié)構(gòu)°tcp_listen函數(shù)中,釋放tcp_new創(chuàng)建的塊結(jié)構(gòu),而是返回一個(gè)listen型的tcp塊結(jié)構(gòu)??蛻舳诉B接,到達(dá)TCP層,在tcp_listen_input函數(shù)中,重新創(chuàng)建一個(gè)TCP_PCB塊結(jié)構(gòu),專門(mén)用于和客戶端通信。偵聽(tīng)到客戶端連接,完成三次握手后,回調(diào)自己編寫(xiě)的接收函數(shù),然后將全局的指針指向與客戶端通信的塊結(jié)構(gòu),在數(shù)據(jù)發(fā)送時(shí),

使用這個(gè)指針,就是在用這個(gè)塊結(jié)構(gòu)與客戶端通信。由上面看出,這種方式最大的特點(diǎn)是減少了任務(wù)之間的切換,只要數(shù)據(jù)來(lái)到協(xié)議棧線程,通過(guò)回調(diào)的方式就可以完成數(shù)據(jù)的處理。2.2基于LwIPAPI的應(yīng)用程序設(shè)計(jì)LwIPAPI方式的編程,是基于上面的RAWAPI的,封裝了一個(gè)netconn的結(jié)構(gòu),所有操作不在針對(duì)TCP塊結(jié)構(gòu),而變成了netconn型的結(jié)構(gòu)變量。操作都需要協(xié)議棧去處理,應(yīng)用程序與協(xié)議棧通信,通過(guò)發(fā)送消息方式進(jìn)行,因此這種方式會(huì)造成頻繁的任務(wù)切換,速度相比RAW人?1慢了許多,使用步驟如圖2所示。應(yīng)用程序任務(wù)協(xié)議棧任務(wù)netconn_new

創(chuàng)建一個(gè)新的連接netconn_bind

綁定本地應(yīng)用程序任務(wù)協(xié)議棧任務(wù)netconn_new

創(chuàng)建一個(gè)新的連接netconn_bind

綁定本地IP、端口TCPIP_MSG_API,, z消息類型TCPIP_MSG_INPKTdo_newconn,建立TCP結(jié)構(gòu) 卜注冊(cè)數(shù)據(jù)接收函數(shù)recv_tcp

do_bind調(diào)用tcp_bind函數(shù) ]TaskNetDataRecv

網(wǎng)口數(shù)據(jù)接收任務(wù)netconnlisten開(kāi)始偵聽(tīng)netconn_accept

等待客戶端連接,成功則

返回一個(gè)新的netconn

netconnlisten開(kāi)始偵聽(tīng)netconn_accept

等待客戶端連接,成功則

返回一個(gè)新的netconn

結(jié)構(gòu),用于客戶端通信dolisten,注冊(cè)接收函數(shù)

accept_function■■給連接的acceptmbox發(fā)送消息、 客戶端連接時(shí)回調(diào)日acceptfunctionnetconnrecv等待數(shù)據(jù)?—給連接的recvmboxnetconnrecv等待數(shù)據(jù)?—給連接的recvmbox發(fā)送消息客戶端有數(shù)據(jù)到來(lái),.回調(diào)recvtcp數(shù)據(jù)接收并處理完畢

后,需要發(fā)送數(shù)據(jù)do_recv,告訴協(xié)議棧,已經(jīng)獲取數(shù)據(jù)+|netconn_write|netconn_write發(fā)送數(shù)據(jù)|do_write,發(fā)送數(shù)據(jù)到TCP層1圖2LwIPAPI方式應(yīng)用程序設(shè)計(jì)2.3基于BSDsocket的應(yīng)用程序設(shè)計(jì)BSDsocket相當(dāng)于對(duì)LwIP人?【做了一層封裝,而netconn結(jié)構(gòu)有一個(gè)變量是socket,這樣兩者很容易結(jié)合起來(lái)。Socket方式很容易被理解,編寫(xiě)應(yīng)用程序也較為容易,但是效率低,消耗的資源更多,使用步驟如圖3所示。Seek前函數(shù)創(chuàng)建一個(gè)套接字—調(diào)用netconn_new_with_callback一Socket函數(shù)創(chuàng)建個(gè)套接字1 創(chuàng)建一個(gè)netconn型的連接bind綁定本地叩、端口調(diào)用netconn_bind實(shí)現(xiàn)listenlisten開(kāi)始偵聽(tīng)調(diào)用netconn_listen_with_backlogaccept接收客戶端連接'調(diào)用netconn_accept實(shí)現(xiàn)read等待客戶端數(shù)據(jù)到1|來(lái)調(diào)用netconn_recv實(shí)現(xiàn)數(shù)據(jù)接收并處理完畢

后,需要發(fā)送數(shù)據(jù)write發(fā)送數(shù)據(jù)write發(fā)送數(shù)據(jù)'調(diào)用netconn_write實(shí)現(xiàn)圖3BSDsocket方式應(yīng)用程序設(shè)計(jì)3實(shí)際應(yīng)用與驗(yàn)證本次驗(yàn)證中使用的開(kāi)發(fā)板,微處理器采用ST公司推出的STM32F107,以太網(wǎng)PHY芯片采用DP83848.STM32F107是一款基于ARMCortex-M3內(nèi)核的32位處理器,是面向網(wǎng)絡(luò)互連型應(yīng)用的,最大工作頻率為72MHz,內(nèi)置了MAC控制器,可以方便地與以太網(wǎng)PHY芯片連接,構(gòu)成以太網(wǎng)接口。以太網(wǎng)PHY芯片DP83848采用RMII模式與STM32F107連接。RMII模式可以減少接口之間的引腳連接,降低了繪制電路板的復(fù)雜性,同時(shí)空閑的引腳可用作其它用途,以太網(wǎng)接口如圖4所示。MII_TX_ENMII_TXD0-MII_TXD1-MII_MDC-STM32F107以太網(wǎng)模塊,MII_MDIO"MII_RXD1?MII_RXD0MII_RX_DV/iRMIICRSDVTX_ENTXD_0TXD_1MDCDP83848接口'MDIO'RXD_1'RXD_0-RX_DV/MIIMODE圖4STM32F107MAC與DP83848連接圖在開(kāi)發(fā)板上,移植好LwIP協(xié)議棧和以C/OSII操作系統(tǒng),應(yīng)用程序中創(chuàng)建一

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論