介绍
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/