介紹
Lwip,light weight IP;是由Adam Dunkels 開發的一個小型開源的TCP/IP協議棧;目前已經為全球共同開發的開源協議;支持TCPIP協議族的核心協議;包括:ARP/ICMP/TCP/UDP/IPV4/IPV6/DHCP等;其核心特點是:功能齊全、運行需求的RAM和ROM少;
編程模型
所有的功能和性能都可進行裁剪和配置;相關文件為:lwipopts.h
內部實現支持帶操作系統和不帶操作系統;核心框架是:外部單線程驅動協議棧狀態機;底層使用中斷進行數據的接收;
其提供三種API :1)RAW API 2)lwip API 3)BSD API。其中BSD API就是大家最熟悉的socket API了。Linux和Windows平台中的socket接口都與此大同小異;
移植
將lwip移植到不同的平台主要包括兩個部分工作:
-
MAC+PHY層移植,包括初始化、數據的收發;
-
應用層框架移植,如操作系統層的線程創建、定時器、消息郵箱;
平台
硬件:STM32F107 PHY芯片:DM9161AEP
軟件:UCOS-ii
移植核心點
ST公司針對STM32F107 不帶操作系統版本的LWIP移植版本,文件名為STM32F107_ETH_LwIP,版本為V1.0.0;由於其版本不再更新且與本軟件平台不一致,所以不做參考;
由於STM32F1 STM32F2 STM32F4的以太網驅動都是一致的。所以到ST官網下載stm32cubdf2。其中有LWIP針對FREERTOS的移植;而FREERTOS與UCOS大同小異;所以只要針對其修改應用層框架移植的實現即可;相關代碼位於:stm32cubef2\STM32Cube_FW_F2_V1.1.0\Projects\STM322xG_EVAL\Applications\LwIP\LwIP_UDPTCP_Echo_Server_Netconn_RTOS;
LWIP的代碼使用1.4.1版本,可到LWIP官網上下載;也包含在stm32cubef2中;
移植的理論基礎來源於lwip 1.4.1源碼包中doc文件夾中的文件;同時官方也有移植到各個平台中的示例,文件為:contrib-1.4.1.zip,到官網上下載即可;
-
MAC+PHY移植:
需要修改的文件為:
app_ethernet.c/h
ethernetif.c/h
同時需要將stm32cubef2驅動庫中的stm32f2xx_hal_eth.c/h拷貝過來;
以上文件只需要配置好,保證編譯沒問題,則MAC+PHY層移植完成;
2. 應用層框架移植:
修改1個文件sys_arch.c,位於stm32cubef2\STM32Cube_FW_F2_V1.1.0\Middlewares\Third_Party\LwIP\system;
所有的移植即完成;
注意點
STM32Cube_FW_F2_V1.1.0此版本中關於lwip的驅動MAC代碼是有bug的,具體表現在當以太網包數量加大時,會出現底層收數據很慢的情況;使用PING命令經常出現TIMEOUT;
此bug在STM32cubeF4中得到解決;相關問題原因描述見參考資料;
參考資料
-
核心論文 <<Design and Implementation of the lwIP TCP/IP Stack>> By Adam Dunkels.2001
-
移植資料
<<lwIP TCP/IP stack demonstration for STM32F107xx connectivity line microcontrollers >> By ST
3. lwip官方網站https://savannah.nongnu.org/projects/lwip/