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 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 协议栈移植教程相关推荐
- GG32F450XX上移植RT-Thread+LWIP协议栈
GD官方提供的例程ENET例程是FreeRtos+LWIP协议的,所以本人自己又重新做了一下移植(RT-Thread nano + LWIP1.4.1). 总结以下几点: 1,第一步是ENET的初始化 ...
- 【安富莱】【RL-TCPnet网络教程】第8章 RL-TCPnet网络协议栈移植(RTX)
第8章 RL-TCPnet网络协议栈移植(RTX) 本章教程为大家讲解RL-TCPnet网络协议栈的RTX操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要 ...
- 【RL-TCPnet网络教程】第7章 RL-TCPnet网络协议栈移植(裸机)
第7章 RL-TCPnet网络协议栈移植(裸机) 本章教程为大家讲解RL-TCPnet网络协议栈的裸机移植方式,学习了上个章节讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文 ...
- lwip路由实现_基于LWIP协议栈对路由缓存数据结构实现改进设计
LWIP(Light Weight Internet Protoco1)是瑞士计算机科学院(Swedish Institute of C++omputer Science)AdamDunkels等人开 ...
- lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现
1.概述: LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件.OS.编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下.因此LwIP在 ...
- 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模块 ...
- LwIP应用笔记(三):在RTOS环境下运行LwIP协议栈
前言 这篇文章是 LwIP应用笔记(二):无操作系统支持下的RAW API移植 的后续,以下所有内容都是建立在已经完成RAW API移植的前提下.本文可能不会太纠结于代码细节,因为本文的目标并不是演示 ...
- LWIP协议栈设计与实现笔记:
LWIP协议栈设计与实现笔记 一.进程模型:采用何种方法把系统分成不同的进程. TCP/IP协议族的每一个协议作为一个独立的进程存在.此模型必须符合协议的每一层,同时必须指定协议之间的通讯点. 优势: ...
- 【STM32F429】第6章 ThreadX NetXDUO网络协议栈移植到STM32F429
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=104619 第6章 ThreadX NetXDUO网络协议栈移植到STM ...
最新文章
- python不能加密吗_为什么我不能解密我用pycrypto加密的内容?
- SAP MM初阶之ERS功能展示
- php时间戳与日期互转
- lua代码格式化工具_FFLUA——C++嵌入Luaamp;扩展Lua利器
- Linux下首次操作MySQL失败
- 云服务器配置出现的问题 2
- 简单计算机面试题库及答案_460道Java后端面试高频题答案版【模块六:计算机操作系统】...
- ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await
- linux计划任务一小时,linux,计划任务,每小时执行一次(共7篇).docx
- 拓端tecdat|R语言逻辑回归预测分析付费用户
- 网络协议 18 - CDN:家门口的小卖铺
- Effective Java 第三版 中文翻译
- 华为交换机,登录密码忘记
- vue+vant开发app打包apk
- matlab数据拟合polyfit与polyval初等用法
- (Excel)常用函数公式及操作技巧之六:汇总计算与统计(一)
- IDEA 打开窗口切换的快捷键
- 数据结构C语言版严蔚敏——每周一更新
- 听Nicholas讲课的一些感想
- Android Retrofit的学习