uIP使用記錄

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

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)

1.uip_dev/clock-arch.h

2.uip_dev/tapdev.c

我們需要在這個檔案中完成3個驅動函式。

#include "tapdev.h"

#include "uip.h"

#include "enc28j60.h"

//用於固定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

#include "clock-arch.h"

clock_time_t uip_timer;

clock_time_t clock_time(void)

2.uip\core\psock.c(303): warning: #167-d: argument of type “char ” is incompatible with parameter of type “u8_t ”

這個使用強制型別轉換

//原本為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變數

8.uip\core\uip-neighbor.c(90): warning: #223-d: function “printf” declared implicitly

註釋掉printf

9.uip\core\uip-split.c(90): warning: #223-d: function “tcpip_output” declared implicitly

將tcpip_output註釋掉

10.uip\dev\tapdev.c(57): error: #20: identifier “uip_ethaddr” is undefined

uip_ethaddr這個變數的定義在uip.c中,在此處使用需要宣告

extern

struct uip_eth_addr uip_ethaddr;

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】

ELK使用1 Elasticsearch使用

一 es 1 通過curl命令獲取es 資訊 a curl i 設定協議的頭資訊 xget http 192 168 30 41 9200 count b 檢視叢集狀態 curl xget c cat api 可以檢視所有東西 curl xget a marvel agent b 安裝head外掛 ...

類的使用,物件的使用

一 類的使用 class student school luffycity def eat self print yes defdrink...

終端使用 echo 命令使用

echo 命令會將輸入的字串送往標準輸出,並在最後加上換行符,可以理解為列印字串。 echo 命令可以結合 符號一起使用,進行檔案的覆蓋 追...