網路通訊之UIP在STM32上的移植
1、什麼是UIP協議棧:
UIP是一種適用於小型嵌入式通訊的TCP/IP協議棧,由瑞典電腦科學院的人開發編寫的,它去掉了完整的TCP/IP中不常用的功能,簡化了通訊過程,但其保留了網路通訊中必須使用的協議,把設計重點放在IP、TCP和ARP協議的實現上。簡單易用、佔用資源少是它的設計特點。
2、協議棧介面
UIP協議棧通過一系列介面函式與底層函式和上層應用程式通訊,在兩者之中,UIP介面函式處於中間。其中UIP提供兩個個介面函式給底層系統。分別是
(1)uip_input()
當網絡卡驅動收到一個輸入包時,將放入全域性緩衝區uip_buf中,包的大小由全域性變數uip_len約束。同時將呼叫 uip_input() 函式,這個函式將會根據包首部的協議處理這個包和需要時呼叫應用程式。當 uip_input() 返回時,一個輸出包同樣放在全域性緩衝區uip_buf裡,大小賦給uip_len。如果uip_len 是0,則說明沒有包要傳送。否則呼叫底層系統的發包函式將包傳送到網路上。
(2)uip_periodic()
uIP 週期計時是用於驅動所有的uIP 內部時鐘事件。當週期計時激發,每一個TCP 連線都會呼叫uIP 函式uip_periodic() 。類似於 uip_input() 函式。uip_periodic()函式返回時,輸出的IP 包要放到uip_buf中,供底層系統查詢uip_len的大小發送。
UIP提供一個呼叫函式uip——appcall() 與上位機應用程式通訊。當uip在接收到底層傳來的資料包後,直接呼叫uip_appcall()就可以把資料傳送到上層應用程式進行處理。
系統底層其實在一開始時還需要呼叫初始化UIP的函式——uip_init(),
3、UIP協議棧在STM32上的移植
(1)DM9000A 初始化和UIP初始化;
tapdev_init(); uip_init();
(2)設定IP地址
uip_ipaddr(ipaddr, 192,168,1,10);
(3)設定預設的路由器地址
uip_ipaddr(ipaddr, 192,168,1,1);
(4)設定網路掩碼
uip_setnetmask(ipaddr);
(5)當DM9000A接收到資料後會產生中斷,這時候從DM9000A讀取一個IP包,返回資料長度;
uip_len = tapdev_read();
(6)校驗處理資料包
BUF->type == htons(UIP_ETHTYPE_IP
(7)去除乙太網幀頭結構,更新ARP表
uip_arp_ipin();
(8)IP包處理
uip_input();