uip(wiki:的初始開發者是adam dunkels(這是乙個開源的輕量級的tcp/ip協議棧,適用於8位或16位mcu,占用的ram可從幾百byte到幾千byte不等,它僅可以處理單網路介面:ip、icmp、udp、tcp。uip可從adam dunkels的github獲取,最新的版本是1.0,且已經不更新,現在uip已經是開源系統contiki的一部分,更新的部分也會在contiki中完成。
我們先來看看uip在系統中的位置
硬體驅動是需要提前完成,然後和uip連線。在本例中,網絡卡驅動就是enc28j60驅動。
我們將uip檔案中的原始碼放入uip_core中,將unix檔案中的原始碼放入uip_dev中(除了main.c)
我們需要在這個檔案中完成3個驅動函式。
//用於固定ip位址開關開啟後的ip設定
#define uip_dripaddr0 192
#define uip_dripaddr1 168
#define uip_dripaddr2 1
#define uip_dripaddr3 15
//mac位址
const u8 mymac[6]=;
//網絡卡初始化
u8 tapdev_init(void)
//讀取一包資料
uint16_t tapdev_read(void)
//傳送一包資料
void tapdev_send(void)
3.uip_dev/uip_conf.h
//stm32是小端模式
#define uip_conf_byte_order little_endian
//關閉log記錄
#define uip_conf_logging 0
4.uip_dev/clock-arch.c時鐘部分,我們需要為uip提供10ms的時鐘,我們定義了全域性變數uip_timer,使用了乙個定時器,在中斷中,全域性變數uip_timer加1
這個使用強制型別轉換
//原本為buf_setup(&psock->buf, psock->bufptr, psock->bufsize);
buf_setup(&psock->buf, (u8_t*)psock->bufptr, psock->bufsize);
3.uip\core\psock.c(188): warning: #513-d: a value of type 「const char 」 cannot be assigned to an entity of type 「const u8_t 」
這個使用強制型別轉換
//原本為s->sendptr = buf;
s->sendptr = (const u8_t *)buf;
6.uip\core\uip.c(1847): warning: #177-d: label 「ip_send_nolen」 was declared but never referenced
//將label ip_send_nolen放入巨集中
#if uip_udp
ip_send_nolen:
#endif
7.uip\core\uip.c(113): warning: #177-d: variable 「all_ones_addr」 was declared but never referenced
注釋掉all_ones_addr變數
注釋掉printf
9.uip\core\uip-split.c(90): warning: #223-d: function 「tcpip_output」 declared implicitly
將tcpip_output注釋掉
uip_ethaddr這個變數的定義在uip.c中,在此處使用需要宣告
11.若之前uip_conf.h中的log記錄沒有關閉,就會出現下述的linking錯誤
至此我們是0 error(s),0 warning(s)
由於這時我們沒有呼叫uip相關的函式,所以這時程式的大小是和加入uip之前是一樣的。
我們將uip/unix下的main.c中的main函式複製到新工程中,這時,stm32就可以響應ping命令了,這樣乙個簡單的uipdemo,大概占用了9k的flash,3k的ram
【reference】
uIP協議棧分析
uip特性 由於uip協議棧專門為嵌進式系統而設計,因此還具有如下優越功能 1 非常少,其協議棧 不到6k,很方便閱讀和移植。2 占用的記憶體數非常少,ram占用僅幾百位元組。3 其硬體處理層 協議棧層和應用層共用乙個全域性快取區,不存在資料的拷貝,且傳送和接收都是依靠這個快取區,極大的節省空間和時...
uIP協議棧學習(一)
uip 源 可以從 uip的原始碼目錄結構 目錄是一些應用層的協議和例項,doc目錄是文件,lib目錄下有記憶體塊管理函式,uip下 uip協議棧的源 unix 下是unix 環境裡的 uip應用例子。研究unix 下的 可以知道 uip是如何使用的,關鍵是理解 uip協議棧的主控制迴圈。int m...
uip協議棧學習(二)
uip的記憶體管理方法 記憶體管理的實現在memb.c memb.h裡。這兩個檔案負責 uip的記憶體塊的管理,記憶體塊是由 memb 巨集宣告。記憶體從宣告的記憶體塊裡用 memb alloc 分配,用 memb free 釋放。因為命名空間的衝突,每個 c模組只能有乙個 memb 巨集宣告。先看...