uip协议栈
- 格式:doc
- 大小:24.50 KB
- 文档页数:6
1 以太网------EtherNet:---------------------------参考图解以太网最早由Xerox(施乐)公司创建,于1980年DEC、lntel和Xerox三家公司联合开发成为一个标准。
以太网是应用最为广泛的局域网,包括标准的以太网(10Mbit/s)、快速以太网(100Mbit/s)和10G(10Gbit/s)以太网,采用的是CSMA/CD访问控制法,它们都符合IEEE802.3。
IEEE 802.3标准IEEE802.3规定了包括物理层的连线、电信号和介质访问层协议的内容。
以太网是当前应用最普遍的局域网技术,它很大程度上取代了其他局域网标准。
如令牌环、FDDI和ARCNET。
历经100M以太网在上世纪末的飞速发展后,目前千兆以太网甚至10G以太网正在国际组织和领导企业的推动下不断拓展应用范围。
常见的802.3应用为:10M: 10base-T (铜线UTP模式)100M: 100base-TX (铜线UTP模式)100base-FX(光纤线)1000M: 1000base-T(铜线UTP模式)2 UIP协议:uIP由瑞典计算机科学学院(网络嵌入式系统小组)的Adam Dunkels 开发。
其源代码由C 语言编写,并完全公开,uIP 的最新版本是1.0 版本,本指南移植和使用的版本正是此版本。
uIP协议栈去掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保留了网络通信必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。
由于uIP协议栈专门为嵌入式系统而设计,因此还具有如下优越功能:1)代码非常少,其协议栈代码不到6K,很方便阅读和移植。
2)占用的内存数非常少,RAM 占用仅几百字节。
3)其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。
竭诚为您提供优质文档/双击可除uip协议栈,下载篇一:uip之udp应用笔记千兆网项目中,移植了uip到mcu中,采用udp通信方式,主要用来做一些控制协议的处理。
刚开始接手的时候,并没有做过网络方面的应用,而且对tcp/ip及udp通信又不太熟悉。
好在网上有一些文档,加上仔细阅读uip_process 代码,一边用抓包软件一边调试,总算把uip很好的应用了起来,而且还针对项目某些应用的特殊性,对uip源码进行了一些修改。
本文前半部分对uip源码的一些重要函数进行介绍,后半部分将对修改的部分做个记录,以备往后查阅。
本次使用的是uip-1.0,抓包软件用的wireshark1.6.7,这个软件真的很不错,居然支持gigevision,这点真的很意外。
一、一个完整的udp数据报文格式其实uip就是将你要发送到网络上的数据加上报头,好让它被成功发送到目的主机。
所以我们要先搞清楚一个完整的数据报文,才能搞清楚uip到底在做些什么。
ethernetheader:由目标mac和本机mac及type组成,共14byte,当目标mac全为ff时,表示是udp广播。
type=0x0800表示是ip。
在uip中,ethernetheader结构体定义如下:ipheader:0x45表示version=4,headerlength=20byte;0028表示ipheader+udpheader+userdata长度为40byte;6c14为包的id,每发一个包,这个id会自加1。
80的意义是timetolive,表示这个包的存活时间,路由每转发一次,就会对它自减1。
17表示通信协议类型为udp,4a0a为ipheader的校验码。
再后面就是源ip和目的ip地址了。
udpheader:0aaa表示srcport为2730;0f74表示dstprot为3956;14表示udpheader+userdata长度为20byte,c477表示udpheader的校验码,在一般的情况下,这个可以为0。
uip 协议栈代码UIP协议栈是一种用于嵌入式系统的TCP/IP协议栈,它的设计旨在提供高效、灵活和易于移植的网络通信解决方案。
本文将介绍UIP 协议栈的基本原理、主要特点以及应用领域。
UIP协议栈的基本原理是将TCP/IP协议分成多个层次,每个层次负责不同的功能。
这些层次包括网络接口层、网络层、传输层和应用层。
网络接口层负责处理硬件接口和数据包的发送与接收,网络层负责处理IP地址和路由,传输层负责提供可靠的数据传输服务,应用层负责提供各种网络应用服务。
UIP协议栈的主要特点之一是它的代码量非常小。
由于嵌入式系统通常具有有限的资源,如处理器速度和存储容量,因此UIP协议栈的设计目标是尽量减小占用的资源。
为了实现这一目标,UIP协议栈使用了一些优化技术,如数据压缩和代码精简等。
这使得UIP协议栈非常适合于低功耗设备和资源受限的系统。
另一个重要特点是UIP协议栈的可移植性。
由于UIP协议栈是使用C语言编写的,它可以在多种嵌入式系统平台上运行。
UIP协议栈提供了一些通用的接口和配置选项,以便用户可以根据自己的需求进行定制。
这使得UIP协议栈可以广泛应用于各种嵌入式系统,如传感器网络、工业控制系统和物联网设备等。
UIP协议栈还具有良好的性能和可靠性。
它使用了一些高效的算法和机制,如快速重传和拥塞控制等,以提高数据传输的速度和可靠性。
同时,UIP协议栈还支持一些高级功能,如安全性、多播和多路径传输等,以满足不同应用的需求。
UIP协议栈广泛应用于各种嵌入式系统领域。
在传感器网络中,UIP 协议栈可以实现传感器节点之间的通信,用于数据采集和监控。
在工业控制系统中,UIP协议栈可以实现远程监控和控制,用于实时数据传输和设备管理。
在物联网设备中,UIP协议栈可以实现设备间的互联互通,用于智能家居和智能城市等应用。
UIP协议栈是一种高效、灵活和易于移植的TCP/IP协议栈,适用于各种嵌入式系统。
它具有小代码量、可移植性、良好的性能和可靠性等特点,广泛应用于传感器网络、工业控制系统和物联网设备等领域。
uip协议栈源码详解UIP协议栈源码详解一、双方的基本信息本协议由以下双方达成:甲方:地址:联系人:电话:电子邮箱:乙方:地址:联系人:电话:电子邮箱:二、各方身份、权利、义务、履行方式、期限、违约责任甲方的身份为软件开发公司,提供UIP协议栈源码。
乙方的身份为客户,接受并使用UIP协议栈源码。
甲方的权利:1.拥有UIP协议栈源码的知识产权,并保留其一切权利。
2.未经乙方授权,不得向第三方提供UIP协议栈源码。
3.有权定期或不定期进行软件升级、修补、优化等操作。
甲方的义务:1.提供UIP协议栈源码,并确保其真实、准确、完整。
2.保证UIP协议栈源码的质量和稳定性。
3.协助乙方解决UIP协议栈源码相关的技术问题。
乙方的权利:1.使用UIP协议栈源码进行相关开发和生产。
2.在UIP协议栈源码使用期限内,享有后续升级、修补、优化等服务。
乙方的义务:1.支付相应的授权费用,并按照甲方的要求使用UIP协议栈源码。
2.在未获得甲方授权之前,不得将UIP协议栈源码提供给第三方。
3.遵守中国相关的法律法规,不得将UIP协议栈源码应用于违法、不良等活动。
期限:本协议的期限为一年,自签署之日起生效。
期满后,如有需要,可协商双方续签。
违约责任:1.如任何一方未能履行本协议的义务或条件,则视为违约,违约方需承担相应的违约责任。
2.如甲方未能提供UIP协议栈源码或提供的UIP协议栈源码存在严重质量问题,则乙方有权要求返还全部授权费用,并要求赔偿相关损失。
3.如乙方将UIP协议栈源码提供给第三方,或将UIP协议栈源码应用于违法、不良等活动,则视为违约,乙方需承担相应的违约责任。
三、需遵守中国的相关法律法规本协议各项条款均符合中国相关法律法规。
四、明确各方的权力和义务本协议明确了甲、乙双方在UIP协议栈源码授权使用方面的权力和义务。
五、明确法律效力和可执行性本协议是双方人民法院具有司法管辖权的有法律效力的法律文件,是双方在UIP协议栈源码授权使用方面的合法依据。
奋斗版 STM32 开发板例程文档———uIP1.0 ENC28J60 以太网例程uIP1.0 ENC28J60 以太网例程实验平台:奋斗版STM32开发板V2、V2.1、V3 实验内容:本例程演示了在奋斗STM32开发板上完成ARP,ICMP,TCP服务器、WEB 服务器以及UDP服务器,该实验学习了基于uIP1.0网络协议栈的程序编制。
预先需要掌握的知识1.ENC28J60ENC28J60是MICROCHIP公司的带SPI 接口的独立以太网控制器, 以太网控制器特性 • IEEE 802.3 兼容的以太网控制器 • 集成MAC 和10 BASE-T PHY • 接收器和冲突抑制电路 • 支持一个带自动极性检测和校正的10BASE-T 端口 • 支持全双工和半双工模式 • 可编程在发生冲突时自动重发 • 可编程填充和CRC 生成 • 可编程自动拒绝错误数据包 • 最高速度可达10 Mb/s 的SPI 接口 缓冲器 • 8 KB 发送/ 接收数据包双端口SRAM • 可配置发送/ 接收缓冲器大小 • 硬件管理的循环接收FIFO • 字节宽度的随机访问和顺序访问(地址自动递增) • 用于快速数据传送的内部DMA • 硬件支持的IP 校验和计算 介质访问控制器(MAC)特性 • 支持单播、组播和广播数据包 • 可编程数据包过滤,并在以下事件的逻辑“与” 和“或”结果为真时唤醒主机: - 单播目标地址 - 组播地址 广播地址 - Magic Packet - 由64 位哈希表定义的组目标地址 - 多达64 字节的可编程模式匹配(偏移量可由用户定义)淘宝店铺:1奋斗版 STM32 开发板例程文档———uIP1.0 ENC28J60 以太网例程• 环回模式 物理层(PHY)特性 • 整形输出滤波器 • 环回模式 工作特性 • 两个用来表示连接、发送、接收、冲突和全/ 半双工状态的可编程LED 输出 • 使用两个中断引脚的七个中断源 • 25 MHz 时钟 • 带可编程预分频器的时钟输出引脚 • 工作电压范围是3.14V 到3.45V • TTL 电平输入 • 温度范围:-40°C 到+85°C (工业级), 0°C 到 +70°C (商业级)(仅SSOP 封装) • 28 引脚SPDIP、SSOP、SOIC 和QFN 封装概述ENC28J60 是带有行业标准串行外设接口(SerialPeripheral Interface,SPI)的独立以太网控制器。
1、BSD TCP/IP协议栈BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的。
这是因为BSD栈在BSD许可协议下提供了这些专业栈的雏形,BSD许用证允许BSD栈以修改或未修改的形式结合这些专业栈的代码而无须向创建者付版税。
同时,BSD也是许多TCP/IP协议中的创新(如广域网中饿拥塞控制和避免)的开始点。
2、uC/IPuC/IP是由Guy Lancaster编写的一套基于uC/OS且开放源码的TCP/IP协议栈,亦可移植到其它操作系统,是一套完全免费的、可供研究的TCP/IP协议栈,uC/IP大部分源码是从公开源码BSD发布站点和KA9Q(一个基于DOS单任务环境运行的TCP/IP协议栈)移植过来。
uC/IP具有如下一些特点:带身份验证和报头压缩支持的PPP协议,优化的单一请求/回复交互过程,支持IP/TCP/UDP协议,可实现的网络功能较为强大,并可裁减。
UCIP协议栈被设计为一个带最小化用户接口及可应用串行链路网络模块。
根据采用CPU、编译器和系统所需实现协议的多少,协议栈需要的代码容量空间在30-60KB之间。
3、LwIPLwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。
LwIP的含义是Light Weight(轻型)IP协议,相对于uip。
LwIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。
LwIP TCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM 就可以运行,这使LwIP协议栈适合在低端嵌入式系统中使用。
LwIP的特性如下:支持多网络接口下的IP转发,支持ICMP协议 ,包括实验性扩展的的UDP(用户数据报协议),包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议),提供专门的内部回调接口(Raw API)用于提高应用程序性能,并提供了可选择的Berkeley接口API。
一直没空仔细研究下oSIP,最近看到其版本已经到了3.x版本,看到网上的许多帮助说明手册都过于陈旧,且很多文档内容有点误人子弟的嫌疑~~Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。
虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。
第一阶段:------------------------------------------------------先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。
同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:Project-AddToProject-Files将所有的源程序和头文件都加入到工程内,保存工程。
这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。
处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib之类的目录下,c源程序里直接写#include <xxx.h>时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的 osipparser2目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为 C:/Program Files/Microsoft Visual Studio/VC98/Include。
1. 要知道uip是TCP/IP协议族一种简化并实现的协议栈。
实现TCP/IP协议有uip还有lwip,这两种是比较常用的协议栈,在嵌入式应用中发挥了作用。
2. uip可以作为webclient向指定的网站提交数据,也可以作为一个webserver作为网页服务器,提供一个小型的动态页面访问功能。
3. uip用到的rom有6kb,而ram只有几百字节,相对于lwip更适合于非操作系统的单片机。
Uip的文件架构学习uip需要知道uip协议里到底都有那些东东?1 uip_app; uip_lib, uip本身核心代码,uip底层驱动与以太网控制器模块有关,Uip_app 是uip的一些应用示例程序smtp,rsolve,dhcp,telnetd,以及webclient。
Lib 里边是memb.c是分配内存的文件。
Uip 里边有uip.c timer.c 因为要为TCP和ARP提供定时器服务,比如心跳包,刷新老化程序需要有定时器的配置。
如果使用ENC28U60,还需要ENC28U60.HUip的数据通过网卡Enc28j60从物理层剥离,所以需要先配置Uip和Enc28j60的数据交互。
这个部分在tapdev.c文件中:tapdev_init():网卡初始化函数,初始化网卡的工作模式。
tapdev_read(void):读包函数。
将网卡收到的数据放入全局缓存区uip_buf 中,返回包的长度,赋给uip_len。
void tapdev_send(void):发包函数。
将全局缓存区uip_buf 里的数据(长度放在uip_len 中)发送出去。
在uip1.0中,clock_archo。
C是用来管理时钟的。
├─apps apps目录下为uip提供的一些应用示例│├─dhcpc│├─hello-world│├─resolv│├─smtp│├─telnetd│├─webclient│└─webserver| |___tcpclient| |___tcpcserver│└─httpd-fs├─doc doc下放置的为说明文档,程序中用不上│└─html├─lib lib下为内存块管理函数源码├─uip uip下为uip和核心实现源码└─unix unix环境里的uip应用例子,可以参照这个例子实现应用2 3 4 5 6 7 8 91011 #include "clock-arch.h"#include "stm32f10x.h"extern__IO int32_t g_RunTime;/*---------------------------------------------------------------------------*/ clock_time_tclock_time(void){returng_RunTime;}/*---------------------------------------------------------------------------*/使用stm32 滴答定时器中断代码:User/stm32f10x_it.c1 2 3 4 5 6 7 8 9101112131415 __IO int32_t g_RunTime = 0;voidSysTick_Handler(void){staticuint8_t s_count = 0;if(++s_count >= 10){s_count = 0;g_RunTime++; /* 全局运行时间每10ms增1 */ if(g_RunTime == 0x80000000){g_RunTime = 0;}}}3.uipopt.h/uip-conf.h 是配置文件,用来设置本地的IP 地址、网关地址、MAC 地址、全局缓冲区的大小、支持的最大连接数、侦听数、ARP 表大小等。
uIP嵌入式TCP/ IP协议栈uIP1.0参考手册2006年6月Adam Dunkelsadam@sics.se瑞典计算机科学研究所目录:1 uIP的TCP/ IP协议栈11.1 简介. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (1)1.2 TCP/IP通讯. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (2)1.3 主控制回路. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ............................................ . (2)1.4 结构的特定功能. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (3)1.5 内存管理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (3)1.6 应用程序接口(API). . . . . . . . . . . . . . . . . . . . . . . . . . . . . (4)1.7 例子. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .............................................. (7)1.8 协议实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (14)1.9 性能. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (16)2 uIP1.0模块文件172.1 Protothreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (17)第1章uIP的TCP / IP堆栈作者:亚当,Adam Dunkels/,http://www.sics.se/uIP的TCP / IP堆栈旨在使 TCP/ IP通信协议套件使用甚至有可能小型8位微控制器。
uip协议栈UIP协议栈。
UIP(Micro IP)协议栈是一个专门为嵌入式系统设计的轻量级TCP/IP协议栈,它是由Adam Dunkels在2001年设计并开发的。
UIP协议栈具有占用资源少、运行效率高的特点,非常适合于资源有限的嵌入式系统。
本文将对UIP协议栈的特点、结构和应用进行介绍。
首先,UIP协议栈的特点。
UIP协议栈的设计目标是在资源有限的嵌入式系统上提供TCP/IP通信功能,因此其特点主要包括占用资源少、运行效率高、适用于小型设备等。
UIP协议栈采用了一些精简的设计方案,如采用静态内存分配、使用事件驱动等,使得其占用的内存资源较少,适用于RAM较小的嵌入式系统。
同时,UIP协议栈在代码结构上也进行了精简,避免了一些复杂的功能,从而提高了运行效率。
这些特点使得UIP协议栈成为嵌入式系统中常用的TCP/IP协议栈之一。
其次,UIP协议栈的结构。
UIP协议栈主要包括网络层、传输层和应用层三部分。
在网络层,UIP协议栈支持IPv4和IPv6两种网络协议,可以根据实际需求选择使用。
在传输层,UIP协议栈支持TCP和UDP两种传输协议,可以满足不同的通信需求。
在应用层,UIP协议栈提供了一些常用的网络应用接口,如HTTP、DHCP、SNTP等,方便开发人员进行网络应用开发。
整个UIP协议栈的结构清晰,功能模块化,易于理解和使用。
最后,UIP协议栈的应用。
UIP协议栈广泛应用于各种嵌入式系统中,如传感器网络、智能家居、工业控制等领域。
以传感器网络为例,传感器节点通常具有资源有限的特点,需要使用轻量级的协议栈来实现与上层网络的通信。
UIP协议栈正是针对这一需求而设计的,其占用资源少、运行效率高的特点使得其在传感器网络中得到广泛应用。
另外,在智能家居和工业控制领域,UIP协议栈也可以为设备之间的通信提供可靠的网络支持。
总之,UIP协议栈是一款专门为嵌入式系统设计的轻量级TCP/IP协议栈,具有占用资源少、运行效率高的特点,适用于资源有限的嵌入式系统。
竭诚为您提供优质文档/双击可除uip协议栈下载篇一:uip之udp应用笔记千兆网项目中,移植了uip到mcu中,采用udp通信方式,主要用来做一些控制协议的处理。
刚开始接手的时候,并没有做过网络方面的应用,而且对tcp/ip及udp通信又不太熟悉。
好在网上有一些文档,加上仔细阅读uip_process 代码,一边用抓包软件一边调试,总算把uip很好的应用了起来,而且还针对项目某些应用的特殊性,对uip源码进行了一些修改。
本文前半部分对uip源码的一些重要函数进行介绍,后半部分将对修改的部分做个记录,以备往后查阅。
本次使用的是uip-1.0,抓包软件用的wireshark1.6.7,这个软件真的很不错,居然支持gigevision,这点真的很意外。
一、一个完整的udp数据报文格式其实uip就是将你要发送到网络上的数据加上报头,好让它被成功发送到目的主机。
所以我们要先搞清楚一个完整的数据报文,才能搞清楚uip到底在做些什么。
ethernetheader:由目标mac和本机mac及type组成,共14byte,当目标mac全为ff时,表示是udp广播。
type=0x0800表示是ip。
在uip中,ethernetheader结构体定义如下:ipheader:0x45表示version=4,headerlength=20byte;0028表示ipheader+udpheader+userdata长度为40byte;6c14为包的id,每发一个包,这个id会自加1。
80的意义是timetolive,表示这个包的存活时间,路由每转发一次,就会对它自减1。
17表示通信协议类型为udp,4a0a为ipheader的校验码。
再后面就是源ip和目的ip地址了。
udpheader:0aaa表示srcport为2730;0f74表示dstprot为3956;14表示udpheader+userdata长度为20byte,c477表示udpheader的校验码,在一般的情况下,这个可以为0。
uIP协议栈分析
uIP特性
uIP协议栈往掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保存了网络通讯必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。
由于uIP协议栈专门为嵌进式系统而设计,因此还具有如下优越功能:
(1)代码非常少,其协议栈代码不到6K,很方便阅读和移植。
(2)占用的内存数非常少,RAM占用仅几百字节。
(3)其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。
(4)支持多个主动连接和被动连接并发。
(5)其源代码中提供一套实例程序:web服务器,web客户端,电子邮件发送程序(SMTP 客户端),Telnet服务器,DNS主机名解析程序等。
通用性强,移植起来基本不用修改就可以通过。
(6)对数据的处理采用轮循机制,不需要操纵系统的支持。
由于uIP对资源的需求少和移植轻易,大部分的8位微控制器都使用过uIP协议栈, 而且很多的著名的嵌进式产品和项目(如卫星,Cisco路由器,无线传感器网络)中都在使用uIP协议栈。
uIP架构
uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序的通讯,对于整个系统来说它内部的协议组是透明的,从而增加了协议的通用性。
uIP协议栈与系统底层和高层应用之间的关系如图2-1所示。
从上图可以看出,uIP协议栈主要提供了三个函数供系统底层调用。
即uip_init(), uip_input() 和uip_periodic()。
其与应用程序的主要接口是UIP_APPCALL( )。
uip_init()是系统初始化时调用的,主要初始化协议栈的侦听端口和默认所有连接是封闭的。
当网卡驱动收到一个输进包时,将放进全局缓冲区uip_buf中,包的大小由全局变量uip_len
约束。
同时将调用uip_input()函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序。
当uip_input()返回时,一个输出包同样放在全局缓冲区uip_buf里,大小赋给uip_len。
假如uip_len是0,则说明没有包要发送。
否则调用底层系统的发包函数将包发送到网络上。
uIP周期计时是用于驱动所有的uIP内部时钟事件。
当周期计时激发,每一个TCP连接都会调用uIP函数uip_periodic()。
类似于uip_input()函数。
uip_periodic()函数返回时,输出的IP 包要放到uip_buf中,供底层系统查询uip_len的大小发送。
由于使用TCP/IP的应用场景很多,因此应用程序作为单独的模块由用户实现。
uIP协议栈提供一系列接口函数供用户程序调用,其中大部分函数是作为C的宏命令实现的,主要是为了速度、代码大小、效率和堆栈的使用。
用户需要将应用层进口程序作为接口提供给uIP 协议栈,并将这个函数定义为宏UIP_APPCALL()。
这样,uIP在接受到底层传来的数据包后,在需要送到上层应用程序处理的地方,调用UIP_APPCALL( )。
在不用修改协议栈的情况下可以适配不同的应用程序。
uIP在MCS-51单片机上的移植
1.为此项目建立一个keil C工程,建立src目录存放源文件。
2.通过阅读uip-1.0\unix\main.c,了解uIP的的主循环代码架构,并将main.c放到src目录下。
3.仿照uip-1.0\unix\tapdev.c写网卡驱动程序,与具体硬件相关。
这一步比较费点时间,不过好在大部分网卡芯片的驱动程序都有代码鉴戒或移植。
驱动需要提供三个函数,以RTL9019AS驱动为例。
etherdev_init():网卡初始化函数,初始化网卡的工作模式。
u16_t etherdev_read(void):读包函数。
将网卡收到的数据放进全局缓存区uip_buf中,返回包的长度,赋给uip_len。
void etherdev_send(void):发包函数。
将全局缓存区uip_buf里的数据(长度放在uip_len中)发送出往。
所以,收包和发包主要是操纵uip_buf和uip_len。
具体驱动分析可参考《第三章网络芯片的驱动》。
4.由于uIP协议栈需要使用时钟,为TCP和ARP的定时器服务。
因此使用单片机的定时器0用作时钟,每20ms让计数TIck_cnt加1,这样,25次计数(0.5S)满了后可以调用TCP 的定时处理程序。
10S后可以调用ARP老化程序。
对uIP1.0版本,增加了timer.c/timer.h,专门用来治理时钟,都放到src下。
5.uIP协议栈的主要内容在uip-1.0\uip\下的uip.c/uip.h中,放到src下。
假如需要ARP协议,需要将uip_arp.c和uip_arp.h也放到src下。
6.uipopt.h/uip-cONf.h是配置文件,用来设置本地的IP地址、网关地址、MAC地址、全局缓冲区的大小、支持的最大连接数、侦听数、ARP表大小等。
需要放在src下,并且根据需要配置。
在V1.00版本中对配置做了如下修改:
(1)配置IP地址,默认先关IP,在初始化中再设定。
#define UIP_FIXEDADDR 0
#define UIP_IPADDR0 192
#define UIP_IPADDR1 168
#define UIP_IPADDR2 1
#define UIP_IPADDR3 9
#define UIP_NETMASK0 255
#define UIP_NETMASK1 255
#define UIP_NETMASK2 255
#define UIP_NETMASK3 0
#define UIP_DRIPADDR0 192
#define UIP_DRIPADDR1 168
#define UIP_DRIPADDR2 1
#define UIP_DRIPADDR3 1
(2)使能MAC地址
#define UIP_FIXEDETHADDR 1
#define UIP_ETHADDR0 0x00
#define UIP_ETHADDR1 0x4f
#define UIP_ETHADDR2 0x49
#define UIP_ETHADDR3 0x12
#define UIP_ETHADDR4 0x12
#define UIP_ETHADDR5 0x13
(3)使能ping功能
#define UIP_PINGADDRCONF 1
(4)封闭主动请求连接的功能
#define UIP_ACTIVE_OPEN 0
(5)将uip_tcp_appstate_t定位u8_t类型。
(6)由于单片机是大端结构,因此宏定义需要修改
#define UIP_CONF_BYTE_ORDER UIP_BIG_ENDIAN
(7)暂时不移植打印信息,先封闭
#define UIP_CONF_LOGGING 0
(8)定义数据结构类型
typedef unsigned char u8_t;
typedef unsigned int u16_t;
typedef unsigned long u32_t;
7.假如使用keil C的小模式编译,需要在大部分的RAM的变量前增加xdata。
8.data为keil C的关键词,代码中所有出现data的地方(主要是参数、局部变量、结构体成员)改为pucdata或ucdata。
9.解决编译过程中的错误。
uIP协议栈为C语言编写,编译过程中的题目比较少,并且轻易解决。
uIP的主控制循环
通过实际的代码说明uIP协议栈的主控制循环。
void main(void)
{
/*省略部分代码*/
/*设置TCP超时处理时间和ARP老化时间*/
timer_set(&periodic_timer, CLOCK_CONF_SECOND / 2);
timer_set(&arp_timer, CLOCK_CONF_SECOND * 10);
/*定时器初始化*/
init_Timer();
/*协议栈初始化*/
uip_init();
uip_arp_init();
/*应用层初始化*/
example1_init();
/*驱动层初始化*/
etherdev_init();
/*IP地址、网关、掩码设置*/
uip_ipaddr(ipaddr, 192,168,1,9);
uip_sethostaddr(ipaddr);
uip_ipaddr(ipaddr, 192,168,1,16);
uip_setdraddr(ipaddr);
uip_ipaddr(ipaddr, 255,255,255,0);
uip_setnetmask(ipaddr); /*主循环*/
while(1)
{
/*从网卡读数据*/
uip_len = etherdev_read(); /*假如存在数据则按协。