LwIP 协议栈移植教程

一、什么是 LwIP,以及何时使用 LwIP ?

        官网地址:lwIP - A Lightweight TCP/IP stack - Summary [Savannah]

        按照官网的描述:lwIP is a small independent implementation of the TCP/IP protocol suite that has been initially developed by Adam Dunkels and is now continued here.(lwIP是TCP/IP协议套件的一个小型独立实现,最初由Adam Dunkels开发,现在在这里继续。)

        当使用 C 语言开发单片机类的设备时,因为设备资源问题,无法使用像 Linux / Android 这类的带网络功能的操作系统,就需要用到 LwIP 协议栈,使得设备可以通过以太网连接网络。

二、LwIP 代码下载

        1、首先,需要下载 LwIP 的代码,和对应的资源包。

                在官网首页,可以查看 release 信息,确认最新的 代码版本。

         2、点击官网的 download 按钮,下载最新的代码和资源包。

        3、代码树简介

                 lwip-2.1.3

                |

                + -------- doc 移植的说明,应用的使用说明 等

                + -------- src 该文件夹下是程序的源代码,移植时需要全部拷贝到工程目录下

                + -------- test 

                contrib-2.1.0

                |

                + -------- addons

                + -------- apps 上层应用例程,开发时可参考里面的代码(套接字编程参考Linux)

                + -------- Coverity

                + -------- examples 移植和使用 lwip 的代码例子

                + -------- ports 移植到操作系统环境下的代码参考

三、LwIP 在裸机环境下的移植说明

图 裸机环境下的 lwip 程序框图 

        1、程序说明

                main:主程序,先初始化网络,然后在 mainloop 中执行应用逻辑;

                :lwip 提供的接口;

                :用户实现的网卡相关的接口,有初始化,输入,输出;

                :上层应用程序,在裸机环境下,lwip 提供的网络通信,采用回调的方式实现;

                官方参考说明:lwip 官网的 homepage 页面,Mainloop mode

        2、拷贝 lwip 所有源代码到工程目录下,并包含头文件引用路径;

                源代码:lwip-2.1.3 / src

                头文件:lwip-2.1.3 / src / include

        3、创建 portable 文件夹,并创建以下文件,同时包含头文件引用路径;

                lwip-2.1.3

                |

                + -------- portable

                                |

                                + -------- include

                                |               |

                                |               + -------- arch

                                |               |               |

                                |               |               + -------- cc.h(芯片相关的指令定义)

                                |               + -------- lwipopts.h(lwip相关的宏定义配置参数)

                                + -------- ethernetif.c(lwip与底层 MAC 芯片通信的接口实现)

                                + -------- sys_arch.c(系统相关的指令定义)

                头文件:lwip-2.1.3 / portable / include

                3.1、cc.h

                        此处需给出系统临界区代码定义,裸机环境下,宏定义为空即可。

#ifndef CC_H_
#define CC_H_

#define SYS_ARCH_DECL_PROTECT(lev)
#define SYS_ARCH_PROTECT(lev)
#define SYS_ARCH_UNPROTECT(lev)

typedef int sys_prot_t;

#endif

                3.2、sys_arch.c

                        此处需给出系统时钟的代码定义,即 1ms 计时器的实现。

                        如 STM32 取 HAL 的心跳。

#include "stm32f1xx_hal.h"

#include "lwip/arch.h"

u32_t sys_now(void)
{
	return HAL_GetTick();
}

                3.3、lwipopts.h

                        lwip 已经在 src / include / lwip / opt.h 中定义了默认参数值,

                        因此,在 lwipopts.h 文件中,只需定义需要改动的值即可。

#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__

/* ---------- NO SYS options ---------- */
#define NO_SYS 					1

/* ---------- Core locking options ---------- */

/* ---------- Memory options ---------- */

/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
   lwIP is compiled.
    4 byte alignment -> define MEM_ALIGNMENT to 4,
    2 byte alignment -> define MEM_ALIGNMENT to 2.
 */
#define MEM_ALIGNMENT 				4

/* MEM_SIZE: the size of the heap memory. If the application will send
a lot of data that needs to be copied, this should be set high. */
//#define MEM_SIZE 					4096

/* ---------- Pbuf options ---------- */
///* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
//#define PBUF_POOL_SIZE          10

///* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
//#define PBUF_POOL_BUFSIZE       512

/* ---------- ARP options ---------- */
#define LWIP_ARP                1

/* ---------- IP options ---------- */
#define LWIP_IPV4               1

/* ---------- ICMP options ---------- */
#define LWIP_ICMP               1

/* ---------- RAW options ---------- */
#define LWIP_RAW                0

/* ---------- DHCP options ---------- */
#define LWIP_DHCP 				0

/*  ---------- IGMP options ----------*/
#define LWIP_IGMP 				1

/*---------- DNS options -----------*/
#define LWIP_DNS              	0

/* ---------- UDP options ---------- */
#define LWIP_UDP                1

/* ---------- TCP options ---------- */
#define LWIP_TCP 				1

/* ---------- THREAD options ---------- */
#if !NO_SYS
#define TCPIP_THREAD_PRIO 			3		// ref freertos:[low 0-6 high]
#define TCPIP_THREAD_STACKSIZE 		4096	//	stack size in bytes for the new thread (may be ignored by ports)
#define TCPIP_MBOX_SIZE          	24		//	number of messages in this mbox

#define DEFAULT_RAW_RECVMBOX_SIZE	TCPIP_MBOX_SIZE
#define DEFAULT_UDP_RECVMBOX_SIZE	TCPIP_MBOX_SIZE
#define DEFAULT_TCP_RECVMBOX_SIZE	TCPIP_MBOX_SIZE
#define DEFAULT_ACCEPTMBOX_SIZE		TCPIP_MBOX_SIZE
#endif

/* ---------- Sequential layer options ---------- */
#define LWIP_NETCONN 			(NO_SYS==0)

/* ---------- SOCKET options ---------- */
#define LWIP_SOCKET 			(NO_SYS==0)

#define LWIP_SO_RCVTIMEO 		(NO_SYS==0)
#define LWIP_SO_SNDTIMEO 		(NO_SYS==0)

/*---------- Statistics options ----------*/
#define LWIP_STATS              0

/*---------- Checksum options ----------*/

/*---------- IPv6 options ----------*/

/*---------- Hook options ----------*/

/* ---------- Debugging options ---------- */

/* ---------- OTHER options ---------- */

#if !NO_SYS
#define LWIP_PROVIDE_ERRNO
#endif
#define LWIP_TIMEVAL_PRIVATE 		0

#endif /* __LWIPOPTS_H__ */

                3.4、ethernetif.c

                        将 contrib-2.1.0 / examples / ethernetif / ethernetif.c 文件,覆盖到当前文件。

                        然后实现文件中的 3 个 low level * 接口,完成与 MAC 芯片通信功能。

                        O 定义网卡的名字,在宏定义:IFNAME0 和 IFNAME1

                        O low level init 方法,需要设置 lwip 的网卡 MAC 地址,MTU,接收标记

                                以及初始化网卡 MAC 芯片

                        O low level output 方法,将 lwip 生成的数据包,发送给 MAC 芯片

                        O low level input 方法,接收 MAC 芯片收到的数据包,并发送给 lwip

四、LwIP 在 FreeRTOS 系统环境下的移植说明

 图 操作系统环境下的 lwip 程序框图

        1、程序说明

                红色部分,是操作系统环境下,与裸机程序的差异部分。

                官方参考说明:lwip 官网的 homepage 页面,OS mode

        2、拷贝 lwip 所有源代码到工程目录下,并包含头文件引用路径;

                源代码:lwip-2.1.3 / src

                头文件:lwip-2.1.3 / src / include

        3、创建 portable 文件夹,并创建以下文件,同时包含头文件引用路径;

                lwip-2.1.3

                |

                + -------- portable

                                |

                                + -------- include

                                |               |

                                |               + -------- arch

                                |               |               |

                                |               |               + -------- cc.h(芯片相关的指令定义)

                                |               |               + -------- sys_arch.h(系统相关的指令定义)

                                |               + -------- lwipopts.h(lwip相关的宏定义配置参数)

                                + -------- ethernetif.c(lwip与底层 MAC 芯片通信的接口实现)

                                + -------- sys_arch.c(系统相关的指令定义)

                头文件:lwip-2.1.3 / portable / include

                3.1、cc.h

                        空文件即可。

                3.2、sys_arch.c / sys_arch.h

                        将 contrib-2.1.0 /ports /freertos / sys_arch.c 文件,

                        将 contrib-2.1.0 /ports /freertos / include / arch / sys_arch.h 文件,

                        覆盖到当前文件。

                3.3、lwipopts.h

                        参考裸机移植文件,定义 NO_SYS 0
                3.4、ethernetif.c

                        参考裸机移植文件。

五、例程代码

使用ENC28J60模块的LwIP协议栈在FreeRTOS系统上的移植(C语言)

使用DM9051模块的LwIP协议栈在FreeRTOS系统上的移植(C语言)

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值