lwip 移植
一、源码目录结构
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 移植的更多相关文章
- LwIP移植和使用
LwIP移植和使用 本手册基于lwip-1.4.x编写,本人没有移植过1.4.0之前的版本,更早的版本或许有差别.如果看官发现问题欢迎联系<QQ: 937431539 email: 93743 ...
- 关于lwip移植到ucsos-ii平台的遇到的问题(一)
移植的步骤参照<Day_Day_Up笔记之uCOS-II_LwIP_在_STM32F107_上移植>,<uCOS平台下的LwIP移植笔记>,<嵌入式网络那些事>. ...
- lwip移植到stm32上-enc28j60,103mcu(2)
前面小玩了一下ucos和lwip,但是都还不是真正的网络多任务,真正的网络多任务应该是什么样子的呢?应该是有一个专门的任务负责网络的通讯,他负责将数据发送出去,将数据接收回来,而其他的需要用到网络的任 ...
- LwIP移植uCos+stm32f407
LwIP同操作系统一起工作的时候模型如下: 1.TCP/IP协议栈和应用程序以分离的任务运行 2.应用同协议栈沟通是通过API函数调用(API函数调用事实上就是通过OS自带的进程间通信机制,由应用程序 ...
- LWIP移植文件介绍
在介绍文件之前首先介绍一下DMA描述符 stm32以太网模块接收/发送FIFO和内存之间的以太网传输是通过以太网DMA使用DMA描述符完成的,一共有两个描述符列表:一个用于接收,一个用于发送, 两个列 ...
- LWIP移植
- LwIP学习笔记——STM32 ENC28J60移植与入门
0.前言 去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一 ...
- lwip协议栈移植(1)
lwip移植分为两类: 1,只移植内核核心,用户应用程序编写只能基于raw/callback api进行 2,移植内核核心和上层API函数模块,用户可以使用所有三种API编程,即 raw/callba ...
- LWIP总结
介绍 Lwip,light weight IP:是由Adam Dunkels 开发的一个小型开源的TCP/IP协议栈:目前已经为全球共同开发的开源协议:支持TCPIP协议族的核心协议:包括:ARP/I ...
随机推荐
- erlang中遍历取出某个位置的最大值
例:有这么一个列表,A = [["abc","bds",3],["ssdss","dddx",2],["sfa ...
- 不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }
[0]写在前面 0.1)我们讲 CPU的保护机制,它是可靠的多任务运行环境所必须的: 0.2) CPU保护机制:分为段级保护 + 页级保护: 0.2.1)段级保护分为:段限长 limit 检查.段类型 ...
- 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)
[0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是 ...
- python 基础 7.5 commands 模块
一. commands 模块 1.commands 模块只使用与linxu 的shell 模式下 在我们平时码字时,经常需要调用系统脚本或者系统命令来解决很多问题,接下来,我们就介绍给大家一个很好 ...
- Hihocoder #1602 : 本质不同的回文子串的数量 manacher + BKDRhash
#1602 : 本质不同的回文子串的数量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串S,请统计S的所有子串中,有多少个本质不同的回文字符串? 注意如果 ...
- 50道JAVA基础编程练习题 - 题目
50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...
- 3720: Gty的妹子树
3720: Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1440 Solved: 482[Submit][Status][Disc ...
- XShell 连接 vm虚拟机中的redhat Linux系统
选择的是nat链接,因为nat链接是没有网络的情况下,也是可以链接操作的,当然bridge也可以,那我就从第一步开始; 因为有的人可能改过电脑上的虚拟适配器的ip地址,导致和虚拟机默认的不一样了.如果 ...
- opencv的x64库的版本和vs的版本的对应关系
1 关于vs的版本 visual studio是一个集成开发环境,而vc++是一个c++的compiler,vc++有一个版本和一个版本号,vs也有一个版本,它们的对应关系如下: MSVC++ 4.x ...
- On Using Very Large Target Vocabulary for Neural Machine Translation Candidate Sampling Sampled Softmax
[softmax分类器的加速器] https://www.tensorflow.org/api_docs/python/tf/nn/sampled_softmax_loss This is a fas ...