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