一、源码目录结构

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. pycharm连git和gitee

    http://www.cnblogs.com/feixuelove1009/p/5955332.html https://www.58jb.com/html/171.html

  2. Django Web开发指南笔记

    Django Web开发指南笔记 语句VS表达式 python代码由表达式和语句组成,由解释器负责执行. 主要区别:表达式是一个值,它的结果一定是一个python对象:如:12,1+2,int('12 ...

  3. typescript import 全局node_modules报错

    项目里面有一个node_modules的包太大,每次放到docker里面都要下载半天,大大减少了部署效率. 所以考虑将这个node包全局安装到docker的基础镜像中,那么代码里面直接引用全局包就可以 ...

  4. Java for LeetCode 124 Binary Tree Maximum Path Sum

    Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. ...

  5. Java for LeetCode 103 Binary Tree Zigzag Level Order Traversal

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  6. Java for LeetCode 082 Remove Duplicates from Sorted List II

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

  7. 设置sudo的过期时间

    默认sudo的过期时间过短,经常要输入密码 sudo visudo Defaults env_reset找到这行代码 后面加上timestamp_timeout参数,数值是分钟 ,timestamp_ ...

  8. Protothread 机制

    一.概述 很多传感器操作系统都是基于事件驱动模型的,事件驱动模型不用为每个进程都分配一个进程栈,这对内存资源受限的无线传感器网络嵌入式系统尤为重要. 然而事件驱动模型不支持阻塞等待抽象语句,因此程序员 ...

  9. JAVA-三大语句(选择语句、条件语句、循环语句)

    跳出指定的for循环体,和goto很像 1 K:for(int i=0;i<3;i++){//给这个for循环体取一个名字为K 2 for(int j=0;j<3;j++){ 3 if(j ...

  10. RQNOJ 622 最小重量机器设计问题:dp

    题目链接:https://www.rqnoj.cn/problem/622 题意: 一个机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得. w[i][j]是从供应商j处购得的部件i的重量, ...