uIP使用記錄

2022-08-05 15:03:20 字數 3697 閱讀 7732

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 巨集宣告。先看...