要將乙太網驅動和lwip鏈結在一起還需要一些中間檔案,這些檔案很重要。這些中間檔案包括:
cc.h
、cpu.h
、perf.h
、sys_arch.c
和sys_arch.h。
stm32f4x7_eth_bsp.c netconf.c 為硬體驅動配置檔案。
stm32f4x7_eth.c 驅動庫傳輸層硬體配置檔案。
st官網資料是相當可以利用的,
按照所示步驟,一步一步便找找到了自己所要的開發包了。
lwip移植工作(一
)cc.h
與cpu
和編譯器的相關介面
lwip的移植主要是三個介面部分:
1、與cpu或編譯器相關介面(
include
中cc.h
檔案)
2、與作業系統
的介面;
3、與底層網絡卡驅動的介面。
一、與cpu或編譯器相關介面
與cpu或編譯器相關介面(
include
中cc.h
檔案),
主要包括資料長度,字的高低位順序,編譯器對
c語言
中struct結構位元組對齊問題(
c語言中
struct
結構是四位元組對對齊的,但
lwip
中是根據
struct
結構中不同資料的長度來讀取資料的)
lwip移植工作
sys_arch.h sys_arch.c
與作業系統的介面
與作業系統的介面,主要分為四個部分 1、
sys_sem_t
訊號量: 在
sys_arch
中應實現如下
sys_sem_t
結構體和處理函式
struct sys_sem_t
sys_sem_new() //建立乙個訊號量結構
sys_sem_free() //釋放乙個訊號量結構
sys_sem_signal() //傳送訊號量
sys_arch_sem_wait() //請求訊號量 2、
sys_mbox_t
訊息:lwip
使用訊息佇列來緩衝、傳遞資料報文,在
sys_arch
中應實現如下
sys_sem_t
結構體和處理函式
struct sys_mbox_t
sys_mbox_new() //建立乙個訊息佇列
sys_mbox_free() //釋放乙個訊息佇列
sys_mbox_post() //向訊息佇列傳送訊息
sys_arch_fetch() //從訊息佇列中獲取訊息
3、 sys_arch_timeout()
函式:lwip
中每個與外界網路連線的執行緒都有自己的
timeout
屬性,即等待超時時間。這個屬性表現為:每個執行緒都對應乙個
sys_timeout
結 構體佇列,包括這個執行緒的
timeout
時間長度,以及超時後應呼叫的
timeout
函式,該函式會釋放連線和**資源的工作。如果乙個執行緒對應的
sys_timeout
為空(null
),說明該執行緒對連線做永久的等待。
timeout結構體已經由
lwip
在sys.h
中定義好了,而 且對結構體佇列的資料操作也由
lwip
負責,我們所要實現的是如下函式:
struct sys_timeouts* sys_arch_timouts(void)
,這個函式的功能是返回目前正處於執行態的執行緒所對應的
timeout
佇列指標。
timeout
佇列屬於線 程的屬性,因此是與
os相關的函式,只用由使用者實現。
sys_thread_new建立新執行緒函式:
lwip
可以是單執行緒執行,即只有乙個
tcpip
執行緒(tcpip_thread)
,負責處理所有的
tcp/udp
連線,各種網路程式都通過
tcpip
執行緒與網路互動。但
lwip
也可以多執行緒執行,以提高效率,降低程式設計複雜度。這時需要使用者實現建立新執行緒的函式:
void sys_thread_new(void(*thread)(void* arg),void* arg);
lwip移植工作
ethernet.c
網絡卡驅動程式
網絡卡驅動程式
lwip的網路驅動有一定的模型,
/src/netif/ethernetif.c
檔案即為驅動的模版,使用者為自己的網路裝置實現驅動時應參照此模組。在
lwip
中可以有多個網路介面,每個網路介面都對應了乙個
struct netif
。這個netif
包含了相應網路介面的屬性、收發函式。
lwip
通過呼叫
netif
的方法netif->input()
及 netif->output()
進行乙太網
packet
的收發等操作。在驅動中主要做的就是,實現網路介面的收發、初始化以及中斷處理函式。驅動程式工作在
ip協議模型的網路介面層,它提供給上層(
ip層)的介面函式如下:
void ethernetif_init(struct netif* netif) //網絡卡初始化函式
void ethernetif_input(struct netif*netif) //網絡卡接收函式,從網路介面接收乙太網資料報,並把其中的
ip報文向
ip層傳送,在中斷
//方式下向網絡卡
isr呼叫
ett_t ethernetif_output(struct netif* netif,struct pbuf*p,struct ip_addr* ipaddr) //網絡卡傳送函式,給
ip層傳過來的
ip報文加上乙太網
//包頭,並通過網路介面傳送
void ethernetif_isr(void) //網絡卡中斷處理函式
isr
LWIP應用開發 LWIP移植和裁剪
1.lwip原始碼目錄結構 lwip原始碼目錄中包括doc src test資料夾和其他檔案,其中src資料夾是lwip的重點,裡面包含了lwip的原始碼 src原始碼資料夾如下示,由api core include netif這4個資料夾組成 src api 協議棧sequentialapi和so...
lwip雙網絡卡移植
我公司產品是雙網口,原來的程式是自己寫的tcp ip協議棧,因為只是簡單實現了arp和tcp udp的最簡單情況,所以有時候在公網上會遇到問題。後來在單網口的產品中移植了lwip,輕量級tcp ip協議棧,覺得一定程度上解決了問題,所以雙網絡卡的產品也要用lwip這個協議棧來實現。這個工作就落到了我...
lwip之ucosii移植報錯集錦
ucosii版本 2.91 lwip版本 1.3.2 keil版本 4.21.00 移植後發現如下報錯資訊 1.user lwip 1.3.2 lwip 1.3.2 src include lwip arch.h 85 warning 47 d incompatible redefinition o...