1. lwip原始碼目錄結構
lwip原始碼目錄中包括doc、src、test資料夾和其他檔案,其中src資料夾是lwip的重點,裡面包含了lwip的原始碼
src原始碼資料夾如下示,由api、core、include、netif這4個資料夾組成
+
---src|+
---api //協議棧sequentialapi和socket api兩種介面函式的原始碼|+
---core //lwip核心原始碼|+
---include //lwip使用到的標頭檔案||
+---lwip||
+---netif
|| \--
-posix
| \--
-netif //與網路底層介面有關的檔案
2. lwip移植
將lwip原始碼新增到工程中,並新增或修改部分檔案
2.1 網絡卡驅動相關移植
此檔案是將lwip原始碼和乙太網驅動庫結合起來的橋梁
/********** lwip.h ***********/
extern eth_handletypedef heth;
/* lwip init function */
void
mx_lwip_init
(void);
#if !with_rtos
//如果不帶作業系統,則需要在lwip.c中實現以下函式
/* 來從乙太網緩衝區讀取接收到的資料報;傳送資料報到lwip堆疊進行處理 */
void
mx_lwip_process
(void);
#endif
/* with_rtos */
mx_lwip_init()函式實現原始碼在lwip網絡卡實現原理一文有詳細介紹
此檔案完成外設eth初始化
/********** ethernetif.h ***********/
//完成硬體(stm32->eth)相關的外設初始化
err_t ethernetif_init
(struct netif *netif)
;//完成乙太網底層資料接收任務
void
ethernetif_input
(void
const
* argument)
;//用於檢測網線狀態(link狀態)
void
ethernetif_set_link
(void
const
*argument)
;//當link狀態發生改變時,會呼叫下面的函式
void
ethernetif_update_config
(struct netif *netif)
;//當使用者需要監聽link狀態時,需要自己實現以下函式介面
void
ethernetif_notify_conn_changed
(struct netif *netif)
;//lwip核心的時間基準,以hal庫的systick的時基為準
u32_t sys_jiffies
(void);
u32_t sys_now
(void
);
以上部分函式實現原始碼在lwip網絡卡實現原理一文有詳細介紹
2.2 作業系統相關移植
如果需要使用作業系統,則要新增sys_arch.h和sys_arch.c檔案
該檔案定義了4中資料型別:訊號量、互斥訊號、訊息郵箱和執行緒id
//由於cmsis的不斷發展,已經出現多個版本,因此在移植的時候,就需要關注cmsis版本
//要確保在lwip中使用的作業系統的資料型別定義和cmsis保持一致
#if (oscmsis < 0x20000u)
#define sys_mbox_null (osmessageqid)0
#define sys_sem_null (ossemaphoreid)0
typedef ossemaphoreid sys_sem_t;
typedef ossemaphoreid sys_mutex_t;
typedef osmessageqid sys_mbox_t;
typedef osthreadid sys_thread_t;
#else
#define sys_mbox_null (osmessagequeueid_t)0
#define sys_sem_null (ossemaphoreid_t)0
typedef ossemaphoreid_t sys_sem_t;
typedef ossemaphoreid_t sys_mutex_t;
typedef osmessagequeueid_t sys_mbox_t;
typedef osthreadid_t sys_thread_t;
#endif
#ifdef __cplusplus
}#endif
該檔案定義了sys.h標頭檔案中宣告的關於訊號量、訊息郵箱和建立執行緒相關的操作函式2.3 配置選項相關設定
由於使用了作業系統,因此需要在以下檔案中更改作業系統相關巨集定義
/* stm32cubemx specific parameters (not defined in opt.h) */
/* parameters set in stm32cubemx lwip configuration gui */
/* ----- with_rtos enabled (since freertos is set) ----- */
#define with_rtos 1
3. lwip裁剪#if !defined no_sys || defined __doxygen__
#define no_sys 0
#endif
使用stm32cuebmx可以非常方便的對lwip進行裁剪和配置,根據需要使用的功能使能或者關閉相應的功能
如果不使用stm32cuebmx進行裁剪和配置,也可以在opt.h和lwipopts.h兩個標頭檔案中根據需要對相應功能的巨集定義進行使能或者失能
LWIP 移植檔案
要將乙太網驅動和lwip鏈結在一起還需要一些中間檔案,這些檔案很重要。這些中間檔案包括 cc.h cpu.h perf.h sys arch.c 和sys arch.h。stm32f4x7 eth bsp.c netconf.c 為硬體驅動配置檔案。stm32f4x7 eth.c 驅動庫傳輸層硬體配...
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...