一、源码目录结构

api 、 core、netif、 include

core下又有IPV4 、 IPV6 、 SNMP 和.c文件

include下又有IPV4、IPV6、LWIP、netif

netif下的文件有

1. ethernetif.c这里主要涉及到具体的硬件

2.etharp.c 这里有个函数ethernet_input在初始化时被赋给netif 接口卡的input,功能为处理到来的数据,然后分发给arp  ip等等。里面还有就是完成arp方面的更新arp 缓冲什么的。

3.loopif.c

4.slipif.c

5. ppp文件夹

二、开始移植

1、在keil里新建文件夹,将文件包含进去,然后设置include路径,ok

2、首先修改opt.h里的 NO_SYS为1,表示无系统,SYS_LIGHTWEIGHT_PROT为0,表示不保护临界区域,开始编译根据错误提示修改

最终在include文件加下建立arch文件夹里面包含cc.h, arch.h , perf.h, sys_arch.h

cc.h里包含的内容为

#ifndef __CC_H__

#define __CC_H__

#include "stdio.h"



typedef signed char s8_t;

typedef unsigned char u8_t;

typedef unsigned short u16_t;

typedef signed short s16_t;

typedef unsigned int u32_t;

typedef signed int s32_t;                       // 定义数据类型



typedef u32_t mem_ptr_t;            /* Unsigned 32 bit quantity        */ 定义指针大小



#define PACK_STRUCT_BEGIN __packed

#define PACK_STRUCT_STRUCT 

#define PACK_STRUCT_END

#define PACK_STRUCT_FIELD(x) x      //预编译器有关,为了实现对齐



#define BYTE_ORDER LITTLE_ENDIAN   //定义小端模式



#ifndef LITTLE_ENDIAN

#define LITTLE_ENDIAN 1234     //定义小端

#endif



#ifndef BIG_ENDIAN

#define BIG_ENDIAN 4321         //定义大端

#endif



#ifndef LWIP_PLATFORM_ASSERT      //调试用

#define LWIP_PLATFORM_ASSERT(x) \

    do \

    {   printf("Assertion \"%s\" failed at line %d in %s\n", x, __LINE__, __FILE__); \

    } while(0)

#endif



#ifndef LWIP_PLATFORM_DIAG     //调试用

#define LWIP_PLATFORM_DIAG(x) do {printf x;} while(0)

#endif



#endif /* __CC_H__ */



perf.h里包含的内容为

#ifndef __PERF_H__

#define __PERF_H__



#define PERF_START    /* null definition */   // 没深去弄,你看看,不难

#define PERF_STOP(x)  /* null definition */



#endif /* __PERF_H__ */

我arch.h sys_arch.h里为空

      3,编译,如果没有问题者开始修改ethernetif.c文件,#if 1 打开底层接口修改low_level_init,  low_level_output,  low_level_input, ethernetif_init函数,

编译无误,OK忘了,还要修改opt.h里

#define MEM_ALIGNMENT                   4       //内存对齐

#define MEM_SIZE                        8*1204

#define ETHARP_TRUST_IP_MAC             1  //更新arp缓冲列表

三、定时部分

1,设置一个定时器约为250ms调用tcp.c里的tcp_tmr函数。

tcp_tmr该函数完成了 连接超时,延迟ACK(捎带确认),持续(persist),保鲜(keep alive),  FIN_WAIT_2,  TIME_WAIT定时功能

2,如果开启了arp缓冲功能ETHARP_TRUST_IP_MAC ,则需要5s定时调用etharp.c里的etharp_tmr()函数来删除arp表。

四、到这里就是移植完成了,下面写一个简单的例子tcp

1、首先定义一个struct netif接口,然后调用mem_init(); memp_init(); pbuf_init(); netif_add()初始化,然后调用netif_set_default 和netif_set_up搞定。

2、

struct tcp_pcb *tcppcb = NULL;

void tcp_app(void)

{

    err_t err = 0;

    struct ip_addr ipaddr;

    IP4_ADDR(&ipaddr, 192,168,1,15);

     tcppcb = tcp_new();

    if(tcppcb == NULL)

        return;

    err = tcp_bind(tcppcb, &ipaddr, 80);

    tcppcb = tcp_listen(tcppcb);

tcp_accept(tcppcb, tcppcb_accept);

}

static err_t  tcppcb_accept(void *arg, struct tcp_pcb *pcb, err_t err)

{

  struct http_state *hs;



  /* Allocate memory for the structure that holds the state of the connection */

  hs = mem_malloc(sizeof(struct http_state));



  if (hs == NULL)

  {

    return ERR_MEM;

  }



  /* Initialize the structure. */

  hs->file = NULL;

  hs->left = 0;



  /* Tell TCP that this is the structure we wish to be passed for our

     callbacks. */

  //tcp_arg(pcb, hs);



  /* Tell TCP that we wish to be informed of incoming data by a call

     to the http_recv() function. */

  tcp_recv(pcb, tcppcb_recv); //数据接收完毕之后,调用tcppcb_recv函数



  //tcp_err(pcb, conn_err);



 // tcp_poll(pcb, http_poll, 10);

  return ERR_OK;

}

static err_t tcppcb_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t err) //处理接收到得数据

{

char *data;

int32_t ,len=0;

if (err == ERR_OK && p != NULL)

  {

    /* Inform TCP that we have taken the data */

    tcp_recved(pcb, p->tot_len);

data = p->payload;

      len = p->tot_len;

}

tcp_write()

LwIP通过调用函数tcp_write()来发送TCP数据。当数据被成功地发送到远程主机后,应用程序将会收到应答从而去调用一个指定的回调函数

tcp_sndbuf()

返回发送队列中可用字节的大小

tcp_sent ()

该函数用于设定远程主机成功接收到数据后调用的回调函数,通常也在函数tcp_listen()之后调用


lwip 移植的更多相关文章

  1. LwIP移植和使用

    LwIP移植和使用 本手册基于lwip-1.4.x编写,本人没有移植过1.4.0之前的版本,更早的版本或许有差别.如果看官发现问题欢迎联系<QQ: 937431539  email: 93743 ...

  2. 关于lwip移植到ucsos-ii平台的遇到的问题(一)

    移植的步骤参照<Day_Day_Up笔记之uCOS-II_LwIP_在_STM32F107_上移植>,<uCOS平台下的LwIP移植笔记>,<嵌入式网络那些事>. ...

  3. lwip移植到stm32上-enc28j60,103mcu(2)

    前面小玩了一下ucos和lwip,但是都还不是真正的网络多任务,真正的网络多任务应该是什么样子的呢?应该是有一个专门的任务负责网络的通讯,他负责将数据发送出去,将数据接收回来,而其他的需要用到网络的任 ...

  4. LwIP移植uCos+stm32f407

    LwIP同操作系统一起工作的时候模型如下: 1.TCP/IP协议栈和应用程序以分离的任务运行 2.应用同协议栈沟通是通过API函数调用(API函数调用事实上就是通过OS自带的进程间通信机制,由应用程序 ...

  5. LWIP移植文件介绍

    在介绍文件之前首先介绍一下DMA描述符 stm32以太网模块接收/发送FIFO和内存之间的以太网传输是通过以太网DMA使用DMA描述符完成的,一共有两个描述符列表:一个用于接收,一个用于发送, 两个列 ...

  6. LWIP移植

  7. LwIP学习笔记——STM32 ENC28J60移植与入门

    0.前言     去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一 ...

  8. lwip协议栈移植(1)

    lwip移植分为两类: 1,只移植内核核心,用户应用程序编写只能基于raw/callback api进行 2,移植内核核心和上层API函数模块,用户可以使用所有三种API编程,即 raw/callba ...

  9. LWIP总结

    介绍 Lwip,light weight IP:是由Adam Dunkels 开发的一个小型开源的TCP/IP协议栈:目前已经为全球共同开发的开源协议:支持TCPIP协议族的核心协议:包括:ARP/I ...

随机推荐

  1. 循序渐进学Python 1 安装与入门

    1 安装 2 使用 2.1 运行程序 3 艺搜参考 by 2013年10月16日 安装 Windows安装版,源码,帮助文档: 使用 打开开始菜单中的Python GUI启动Python解释器: 启动 ...

  2. Android中怎样控制LogCat的自己定义输出

    在Android开发中,LogCat是一个非常重要的调试工具,能够输出非常多关于项目或者手机的信息. 可是正是因为LogCat功能的过于强大,输出的信息量也是极为庞大的,那么我们就须要通过一定的方式依 ...

  3. IOS获取当前地理位置文本

    本文转载至  http://blog.csdn.net/lvxiangan/article/details/28101119   以下内容摘抄自网络,著作权属于原作者 方法1:使用ios自带联网查询功 ...

  4. python 基础 8.3 match方法和search方法

    一,正则对象的split 方法 split(string[,maxsplit]) 按照能够匹配的字串讲string 分割后返回列表.maxsplit 用于指定最大分割次数,不指定将全部分割.来查找符合 ...

  5. EasyNVR H5无插件摄像机直播解决方案前端解析之:监控实时直播的四分屏的前端展示

    完成运行效果图: 一.四分屏展示样式布局 1.通过html.css等来进行样式排版 根据需求的四分屏的样式:来合理的划分出四个大块,分别用于放置四个播放器: 以四等分结构为例进行前端的排版: html ...

  6. ptyhon ORM mongoengine

    参考资料:http://www.tuicool.com/articles/bMvI7vN from mongoengine import * from datetime import datetime ...

  7. 九度OJ 1049:字符串去特定字符 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8499 解决:3860 题目描述: 输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果. 输入: 测试数据有多组,每组输入字符串s和 ...

  8. lasso the moon

  9. lvs虚拟服务器

    NAT模式 1.模拟环境: LVS服务器有两块网卡,连接外网(用户端)和内网(服务器),充当"交警"角色. 优点: 节省ip开销 缺点: LVS服务器负载过高,数据吞吐量降低 三台 ...

  10. Tomcat学习笔记【3】--- Tomcat目录结构

    本文主要讲Tomcat包的目录结构. 1 bin目录 这个目录只要是存放了一些bat文件或者sh文件.比如说我们需要启动tomcat的bat文件就在这个目录下. 2 conf 这个目录中存放的都是一些 ...