一、什么是 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语言)文章来源:https://www.toymoban.com/news/detail-619670.html
使用DM9051模块的LwIP协议栈在FreeRTOS系统上的移植(C语言)文章来源地址https://www.toymoban.com/news/detail-619670.html
到了这里,关于LwIP 协议栈移植教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!