一、什么是 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 whichlwIP 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语言)

LwIP 协议栈移植教程相关推荐

  1. GG32F450XX上移植RT-Thread+LWIP协议栈

    GD官方提供的例程ENET例程是FreeRtos+LWIP协议的,所以本人自己又重新做了一下移植(RT-Thread nano + LWIP1.4.1). 总结以下几点: 1,第一步是ENET的初始化 ...

  2. 【安富莱】【RL-TCPnet网络教程】第8章 RL-TCPnet网络协议栈移植(RTX)

    第8章        RL-TCPnet网络协议栈移植(RTX) 本章教程为大家讲解RL-TCPnet网络协议栈的RTX操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要 ...

  3. 【RL-TCPnet网络教程】第7章 RL-TCPnet网络协议栈移植(裸机)

    第7章        RL-TCPnet网络协议栈移植(裸机) 本章教程为大家讲解RL-TCPnet网络协议栈的裸机移植方式,学习了上个章节讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文 ...

  4. lwip路由实现_基于LWIP协议栈对路由缓存数据结构实现改进设计

    LWIP(Light Weight Internet Protoco1)是瑞士计算机科学院(Swedish Institute of C++omputer Science)AdamDunkels等人开 ...

  5. lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现

    1.概述: LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件.OS.编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下.因此LwIP在 ...

  6. AURIX TriCore学习笔记四:LwIP裸机移植

    一目了然 1 准备工作 2 裸机移植LwIP 2.1 LwIP目录创建 2.2 LwIP源文件移植 2.3 LwIP头文件移植 2.4 网口驱动开发 2.4.1 MAC模块驱动 2.4.2 PHY模块 ...

  7. LwIP应用笔记(三):在RTOS环境下运行LwIP协议栈

    前言 这篇文章是 LwIP应用笔记(二):无操作系统支持下的RAW API移植 的后续,以下所有内容都是建立在已经完成RAW API移植的前提下.本文可能不会太纠结于代码细节,因为本文的目标并不是演示 ...

  8. LWIP协议栈设计与实现笔记:

    LWIP协议栈设计与实现笔记 一.进程模型:采用何种方法把系统分成不同的进程. TCP/IP协议族的每一个协议作为一个独立的进程存在.此模型必须符合协议的每一层,同时必须指定协议之间的通讯点. 优势: ...

  9. 【STM32F429】第6章 ThreadX NetXDUO网络协议栈移植到STM32F429

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=104619 第6章   ThreadX NetXDUO网络协议栈移植到STM ...

最新文章

  1. python不能加密吗_为什么我不能解密我用pycrypto加密的内容?
  2. SAP MM初阶之ERS功能展示
  3. php时间戳与日期互转
  4. lua代码格式化工具_FFLUA——C++嵌入Luaamp;扩展Lua利器
  5. Linux下首次操作MySQL失败
  6. 云服务器配置出现的问题 2
  7. 简单计算机面试题库及答案_460道Java后端面试高频题答案版【模块六:计算机操作系统】...
  8. ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await
  9. linux计划任务一小时,linux,计划任务,每小时执行一次(共7篇).docx
  10. 拓端tecdat|R语言逻辑回归预测分析付费用户
  11. 网络协议 18 - CDN:家门口的小卖铺
  12. Effective Java 第三版 中文翻译
  13. 华为交换机,登录密码忘记
  14. vue+vant开发app打包apk
  15. matlab数据拟合polyfit与polyval初等用法
  16. (Excel)常用函数公式及操作技巧之六:汇总计算与统计(一)
  17. IDEA 打开窗口切换的快捷键
  18. 数据结构C语言版严蔚敏——每周一更新
  19. 听Nicholas讲课的一些感想
  20. Android Retrofit的学习

热门文章

  1. mingw-w64-install.exe
  2. Windows命令行查看文件的MD5 和win10下获取md5-sha1
  3. 使用python自动上传apk到蒲公英
  4. LaTeX之公式及编号
  5. TypeScript报错信息表(备注)
  6. 曾经开发的一个武冈市市民意见采集系统
  7. dev.env.js和prod.env.js
  8. 系统默认进程参考与对比
  9. 操作系统-虚拟内存技术
  10. 各国海关单证有哪些要求?