資源描述:
《嵌入式網(wǎng)絡協(xié)議lwip移植》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應用文檔-天天文庫。
1、嵌入式網(wǎng)絡協(xié)議LWIP移植lwIP是瑞士計算機科學院(SwedishInstituteofComputerScience)的AdamDunkels等開發(fā)的一套用于嵌入式系統(tǒng)的開放源代碼TCP/IP協(xié)議棧。Lwip既可以移植到操作系統(tǒng)上,又可以在無操作系統(tǒng)的情況下獨立運行。???????????????LwIP的特性如下:(1)?支持多網(wǎng)絡接口下的IP轉(zhuǎn)發(fā)(2)?支持ICMP協(xié)議(3)?包括實驗性擴展的的UDP(用戶數(shù)據(jù)報協(xié)議)(4)?包括阻塞控制,RTT估算和快速恢復和快速轉(zhuǎn)發(fā)的TCP(傳輸控制協(xié)議)(5)?提供專門的內(nèi)部回調(diào)接口(RawAPI)用于提高應用程序性能(6)?可選擇的Berke
2、ley接口API(多線程情況下)(7)?在最新的版本中支持ppp(8)?新版本中增加了的IPfragment的支持(9)?支持DHCP協(xié)議,動態(tài)分配ip地址?,F(xiàn)在網(wǎng)上有最新的版本。1、lwip的進程模型(processmodel)tcp/ip協(xié)議棧的processmodel一般有幾種方式。1)tcp/ip協(xié)議的每一層是一個單獨進程。鏈路層是一個進程,ip層是一個進程,tcp層是一個進程。這樣的好處是網(wǎng)絡協(xié)議的每一層都非常清晰,代碼的調(diào)試和理解都非常容易。但是最大的壞處數(shù)據(jù)跨層傳遞時會引起上下文切換(contextswitch)。對于接收一個TCPsegment要引起3次contextswit
3、ch(從網(wǎng)卡驅(qū)動程序到鏈路層進程,從鏈路層進程到ip層進程,從ip層進程到TCP進程)。通常對于操作系統(tǒng)來說,任務切換是要浪費時間的。過頻的contextswich是不可取的。2)另外一種方式是TCP/IP協(xié)議棧在操作系統(tǒng)內(nèi)核當中。應用程序通過操作系統(tǒng)的系統(tǒng)調(diào)用(systemcall)和協(xié)議棧來進行通訊。這樣TCP/IP的協(xié)議棧就限定于特定的操作系統(tǒng)內(nèi)核了。如windows就是這種方式。3)lwip的processmodel:所有tcp/ip協(xié)議棧都在一個進程當中,這樣tcp/ip協(xié)議棧就和操作系統(tǒng)內(nèi)核分開了。而應用層程序既可以是單獨的進程也可以駐留在tcp/ip進程中。如果應用程序是單獨的
4、進程可以通過操作系統(tǒng)的郵箱、消息隊列等和tcp/ip進程進行通訊。????如果應用層程序駐留tcp/ip進程中,那應用層程序就利用內(nèi)部回調(diào)函數(shù)口(RawAPI)和tcp/ip協(xié)議棧通訊。對于ucos來說進程就是一個系統(tǒng)任務。lwip的processmodel請參看下圖。在圖中可以看到整個tcp/ip協(xié)議棧都在同一個任務(tcpip_thread)中。應用層程序既可以是獨立的任務(如圖中的tftp_thread,tcpecho_thread),也可以在tcpip_thread中(如圖左上角)中利用內(nèi)部回調(diào)函數(shù)口(RawAPI)和tcp/ip協(xié)議棧通訊。2、PortLwiptouCos????在
5、這個實驗系統(tǒng)中我們用的硬件平臺是s3c44b0x+rtl8019。ucos在44b0上的移植在前面有非常詳盡的講解和移植代碼。需要說明的一點是lwip會為每個網(wǎng)絡連接動態(tài)分配一些信號量(semaphone)和消息隊列(MessageQueue),當連接斷開時會刪掉這些semaphone和Queue。而ucos-2.0不支持semaphone和Queue的刪除,所以要選擇一些較高版本的ucos。我們用的是ucos-2.51。2.1Lwip的操作系統(tǒng)封裝層(operatingsystememulationlayer)????Lwip為了適應不同的操作系統(tǒng),在代碼中沒有使用和某一個操作系統(tǒng)相關(guān)的系
6、統(tǒng)調(diào)用和數(shù)據(jù)結(jié)構(gòu)。而是在lwip和操作系統(tǒng)之間增加了一個操作系統(tǒng)封裝層。操作系統(tǒng)封裝層為操作系統(tǒng)服務(定時、進程同步、消息傳遞)提供了一個統(tǒng)一的接口。在lwip中進程同步使用semaphone和消息傳遞采用”mbox”(其實在ucos的實現(xiàn)中我們使用的是MessageQueue來實現(xiàn)lwip中的”mbox”,下面大家可以看到這一點)Operatingsystememulationlayer的原代碼在…/lwip/src/core/sys.c中。而和具體的操作系統(tǒng)相關(guān)的代碼在../lwip/src/arch/sys_arch.c中。操作系統(tǒng)封裝層的主要函數(shù)如下:voidsys_init(voi
7、d)//系統(tǒng)初始化sys_thread_tsys_thread_new(void(*function)(void*arg),void*arg,intprio)//創(chuàng)建一個新進程sys_mbox_tsys_mbox_new(void)//創(chuàng)建一個郵箱void??sys_mbox_free(sys_mbox_tmbox)//釋放并刪除一個郵箱void??sys_mbox_post(sys_mbox_tmbox,v