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