LwIP 协议栈移植教程

这篇具有很好参考价值的文章主要介绍了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 信息,确认最新的 代码版本。

lwip下载,lwip,tcpip,网络,物联网,iot,驱动开发,网络协议

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

lwip下载,lwip,tcpip,网络,物联网,iot,驱动开发,网络协议        3、代码树简介

                 lwip-2.1.3

                |

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

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

                + -------- test 

                contrib-2.1.0

                |

                + -------- addons

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

                + -------- Coverity

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

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

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

lwip下载,lwip,tcpip,网络,物联网,iot,驱动开发,网络协议

图 裸机环境下的 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下载,lwip,tcpip,网络,物联网,iot,驱动开发,网络协议

 图 操作系统环境下的 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语言)文章来源地址https://www.toymoban.com/news/detail-619670.html

到了这里,关于LwIP 协议栈移植教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 CubeMX LwIP + freertOS 移植

    开发板: 官方 STM32F746  MCU型号:STM32F746NGH 网卡型号:LAN8742A  原理图如下 先用裸机测试LAN8742A的网卡驱动 使用CubeMX创建工程 系统时钟和时基定时器如下 无系统LWIP协议栈设置,静态IP地址,关闭DHCP 生产代码,下载进开发板。开发板网口与电脑网口通过网线直连,设置电脑本

    2024年01月16日
    浏览(72)
  • STM32F407+LWIP+DP83848以太网驱动移植

      最近有个项目上需要用到网络功能,于是开始移植网络相关代码。在移植的过程中感觉好难,网上找各种资料都没有和自己项目符合的,移植废了废了好的大劲。不过现在回头看看,其实移植很简单,主要是当时刚开始接触网络,各种新的知识和概念扑面而来,加上LWI

    2024年02月12日
    浏览(27)
  • 11.物联网lwip,网卡原理

    一。LWIP协议栈内存管理 1.LWIP内存管理方案 (1)堆heap 1.灰色为已使用内存 2.黑色为未使用内存 3.紫色为使用后内存 按照某种算法,把数据放在内存块中 (2)池pool 设置内存池,设置成大小相同的内存块。  2.LWIP内存管理 (1)内存池API //内存池初始化 void  memp_init(void); //内

    2024年02月10日
    浏览(23)
  • 10.物联网LWIP之TCP状态转变

    一。TCP状态机 1.青粗线:理想TCP状态转变(服务器视角下) 2.虚线:被动TCP状态转变(服务器视角下) 3.细实线:不经常出现的TCP状态转变(类似于边界处理) 1.青粗线解释--》服务器主动通信,客户端被动通信(服务器也可作为客户端) (1)服务器主动创建socket后开始监听

    2024年02月10日
    浏览(26)
  • Lwip之TCP协议实现(二)

    接上文:Lwip之TCP协议实现(一)_龙赤子的博客-CSDN博客 第二部分:数据输入处理 Tcp数据的输入处理主要在文件tcp_in.c中实现。输入的数据包在IP层进行分发处理。如果输入的数据包为TCP包,则调用tcp_input进行TCP包的输入处理。因此,tcp_input为tcp输入处理的入口。在tcp_input中会

    2023年04月09日
    浏览(26)
  • LWIP协议与TCP/IP

             a. 例如: LWIP 这个东西是干什么用的 :他就是一个裁剪后保持大部分TCP/IP功能的协议。用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。此外LwIP既可以

    2023年04月23日
    浏览(29)
  • Lwip之TCP协议实现(一)

    TCP本身是一个相对复杂的协议,Lwip中最复杂的部分也是此处。这里,我们分部分描述。 第一部分:TCP处理 Tcp.c该文件提供了一些通用的函数接口。该文件中的函数主要的操作对象就是tcp_pcb,包括对tcp pcb的设置,修改读取等。另外,在该文件中还实现了tcp的定时器。 目录 一

    2023年04月09日
    浏览(23)
  • 7.物联网LWIP之DNS,超时机制,组播,广播

    一。DNS域名解析 1.DNS作用       DNS是计算机域名系统(Domain Name System 或 Domain Name Service)的缩写,它是由解析器和域名服务器组成的,作用是把域名转换成为网络可以识别的ip地址。举一个简单的例子,域名相当于门牌号,而IP地址相当于具体的地理位置。       DNS是用来做

    2024年02月12日
    浏览(28)
  • 8.物联网LWIP之使用web点亮led灯

    一。HTTP详解 1.超文本:(HyperText) (1)超文本文件彼此链接,形成 网状 (web),内含有 超链接 (Link)与各种 媒体元素标记 (Markup)。 (2)超文本文件彼此 链接使用URL 表示。(下面解释URL) (3)常见超文本格式是 超文本标记 语言 HTML 。(下面解释HTML,代码) 综上

    2024年02月11日
    浏览(21)
  • 【lwip】13-TCP协议分析之源码篇

    TCP源码篇,当前只分析TCP层的源码实现,按功能分块分析,接口为RAW接口。 NETCONN接口和SOCKET接口会独立一篇文章进行分析。 本文基于读者已学习了TCP协议原理篇的基础上进行源码分析,不再在此篇文章中过多解析TCP相关概念。 ‍ 建议读者对着LWIP库源码进行阅读。对于初学

    2024年02月06日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包