LwIP協(xié)議棧的實(shí)現(xiàn)
lwIP是TCP/IP協(xié)議棧的一個(gè)實(shí)現(xiàn)。lwIP協(xié)議棧主要關(guān)注的是怎么樣減少內(nèi)存的使用和代碼的大小,這樣就可以讓lwIP適用于資源有限的小型平臺(tái)例如嵌入式系統(tǒng)。為了簡(jiǎn)化處理過程和內(nèi)存要求,lwIP對(duì)API進(jìn)行了裁減,可以不需要復(fù)制一些數(shù)據(jù)。
LwIP是LightWeight(輕型)IP協(xié)議,有無操作系統(tǒng)的支持都可以運(yùn)行。LwIP實(shí)現(xiàn)的重點(diǎn)是在保持TCP協(xié)議主要功能的基礎(chǔ)上減少對(duì)RAM的占用,一般它只需要幾百字節(jié)的RAM和40K左右的ROM就可以運(yùn)行,這使LwIP協(xié)議棧適合在低端的嵌入式系統(tǒng)中使用。
其主要特性如下:
①支持多網(wǎng)絡(luò)接口下的IP轉(zhuǎn)發(fā);
②支持ICMP協(xié)議;
③包括實(shí)驗(yàn)性擴(kuò)展的UDP(用戶數(shù)據(jù)報(bào)協(xié)議);
④包括阻塞控制、RTT估算、快速恢復(fù)和快速轉(zhuǎn)發(fā)的TCP(傳輸控制協(xié)議);
⑤提供專門的內(nèi)部回調(diào)接口(RawAPI),用于提高應(yīng)用程序性能;
⑥可選擇的Berkeley接口API(在多線程情況下使用)。
(1)信號(hào)量
LwIP中需要使用信號(hào)量進(jìn)行通信,所以在sys_arch中應(yīng)實(shí)現(xiàn)相應(yīng)的信號(hào)量結(jié)構(gòu)體structsys_semt和處理函數(shù)sys_sem_new()、sys_sem_free()、sys_sem_signal()和sys_arch_sem_wait()。由于μC/OS已經(jīng)實(shí)現(xiàn)了信號(hào)量OSEVENT的各種操作,并且功能和LwIP上面幾個(gè)函數(shù)的目的功能是完全一樣的,所以只要把μC/OS的函數(shù)重新包裝成上面的函數(shù),就可直接使用。
(2)消息隊(duì)列
LwIP使用消息隊(duì)列來緩沖、傳遞數(shù)據(jù)報(bào)文,因此要實(shí)現(xiàn)消息隊(duì)列結(jié)構(gòu)sys_mbox_t,以及相應(yīng)的操作函數(shù):sys_mbox_new()、sys_mbox_free()、sys_mbox_post()和sys_arch_mbox_fetch()。μC/OS實(shí)現(xiàn)了消息隊(duì)列結(jié)構(gòu)及其操作,但是μC/OS沒有對(duì)消息隊(duì)列中的消息進(jìn)行管理,因此不能直接使用,必須在μC/OS的基礎(chǔ)上重新實(shí)現(xiàn)。具體實(shí)現(xiàn)時(shí),對(duì)隊(duì)列本身的管理利用μC/OS自己的OSQ操作完成,然后使用μC/OS中的內(nèi)存管理模塊實(shí)現(xiàn)對(duì)消息的創(chuàng)建、使用、刪除和回收,兩部分綜合起來形成了LwIP的消息隊(duì)列功能。
(3)定時(shí)器函數(shù)
LwIP中每個(gè)和TCP/IP相關(guān)的任務(wù)的一系列定時(shí)事件組成一個(gè)單向鏈表,每個(gè)鏈表的起始指針存在lwip_timeouts的對(duì)應(yīng)表項(xiàng)中,如圖2所示。移植時(shí)需要實(shí)現(xiàn)structsys_timeouts*sys_arch_timeouts(void)函數(shù),該函數(shù)返回目前正處于運(yùn)行態(tài)的線程所對(duì)應(yīng)的timeout隊(duì)列指針。
(4)創(chuàng)建新線程函數(shù)
在μC/OS中,沒有線程(thread)的概念,只有任務(wù)(Task)。它提供了創(chuàng)建新任務(wù)的系統(tǒng)API調(diào)用OSTaskCreate,因此只要把OSTaskCreate封裝一下,就可以實(shí)現(xiàn)sys_thread_new。需要注意的是LwIP中的thread并沒有μC/OS中優(yōu)先級(jí)的概念,實(shí)現(xiàn)時(shí)要由用戶事先為L(zhǎng)wIP中創(chuàng)建的線程分配好優(yōu)先級(jí)。
【編輯推薦】