uip协议栈
以太网及TCPIP通俗理解
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协议栈,下载篇一: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协议栈在基于DSP以太网通信系统中的应用
岳世 为 尹 为 民
武汉 403) 3 0 3 ( 海军工程大学 电气与信息工程学院
摘
要
文章通过对 uP协议的简单分析介 绍 , 出了以太 网通信 系统整体硬 件平 台、 I 给 设计思路和软件 工作流程 。完
成 了 以太 网 控 制 器 硬 件 驱 动 的 开 发 和 嵌 入 式 uP 协 议 栈 的 移 植 , 给 出 了 面 向 D P 的 优 化 编 程 方 法 。 实 现 了 以 I 并 S
TMS 2 F 8 2 3 0 2 1 数字信பைடு நூலகம்处理器和 C 8 0 A以太网控制器为核心的局 域网络 D P端 的以太 网通信 。 S 90 S
关键词 uP S ; S 90 I ;D P C 8 0 A;以太 网 T 33 P 9 中 图分 类 号
Ap lc to fuI o o o t c p i a i n o P Pr t c lS a k Bas d o e n D S Et r tN e wo k Co m u c to ys e P he ne t r m ni a i n S t m
Ab t a t Th s a tceb s d o h r fa ay i n r d c i n o f t c s rc i ril a e n t e b i n l ssi t o u t f P s a k,g v s t e Et e n t e wo k c mmu ia i n e o u ie h h r e t r o n nc t o s s e h r wa e p a f r ,d sg e s a d s fwa ewo k f w.Th u h r a o y t m a d r lto m e in i a n o t r r l d o e a t o s c mp e e h a d r r e e e o me t h lt d t eh r wa ed i rd v lp n v
【原创】Contiki介绍及参考资料
1
-专业的物联网|Contiki 6Lowpan|Zigbee|RFID|M2M|无线传感器网络开发论坛
统,可以提供对本地串口终端、基于 VNC 的网络化虚拟显示或者 Telnet 的图形 化支持。 Contiki 系统内部集成了两种类型的无线传感器网络协议栈:uIP 和 Rime。 uIP 是一个小型的符合 RFC 规范的 TCP/IP 协议栈,使得 contiki 可以直接和 Internet 通信。uIP 包含了 IPv4 和 IPv6 两种协议栈版本,支持 TCP、UDP、ICMP 等协议,但是编译时只能二选一,不可以同时使用。Rime 是一个轻量级为低功 耗无线传感器网络设计的协议栈,该协议栈提供了大量的通信原语,能够实现从 简单的一跳广播通信,到复杂的可靠多跳数据传输等通信功能。
参考资料 Contiki 官方网站: Contiki Wiki: www.sics.se/contiki/wiki Contiki 源代码文档: /contiki-doxygen Contiki 代码下载: /projects/contiki/files/Contiki/ 或者使用 Git 工具下载 contiki 代码: git clone git:///gitroot/contiki/contiki Instant Contiki 开发环境: /projects/contiki/files/Instant%20Contiki 物联网开发论坛:
Cooja/MSPsim、文件系统 Coffee File system(CFS) 、shell 命令工具等,指出了 Contiki 的应用领域。最后给出了 Contiki 相关网站、教程和绍
Contiki 是一个开源的、高度可移植的多任务操作系统,适用于联网嵌入式 系统和无线传感器网络,由瑞典计算机科学学院(Swedish Institute of Computer Science)的 Adam Dunkels 和他的团队开发。Contiki 完全采用 C 语言开发,可移 植性非常好,对硬件的要求极低,能够运行在各种类型的微处理器及电脑上,目 前已经移植到 8051 单片机、 MSP430、 AVR、 ARM、 PC 机等硬件平台上。 Contiki 适用于存储器资源十分受限的嵌入式单片机系统,典型的配置下 Contiki 只占用 约 2Kbytes 的 RAM 以及 40Kbytes 的 Flash 存储器。Contiki 是开源的操作系统, 适用于 BSD 协议,即可以任意修改和发布,无需任何版权费用,因此已经应用 在许多项目中。 Contiki 操作系统是基于事件驱动(Event-driven)内核的操作系统,在此内 核上,应用程序可以在运行时动态加载,非常灵活。在事件驱动内核基础上, Contiki 实现了一种轻量级的名为 protothread 的线程模型,来实现线性的、类似 于线程的编程风格。该模型类似于 Linux 和 windows 中线程的概念,多个线程共 享同一个任务栈, 从而减少 RAM 占用。 Contiki 还提供一种可选的任务抢占机制、 基于事件和消息传递的进程间通信机制。Contiki 中还包括一个可选的 GUI 子系
uip 协议栈代码
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协议栈源码。
乙方的身份为客户,接受并使用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 以太网例程讲解
奋斗版 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)的独立以太网控制器。
开源TCPIP协议概述--LwIP_uIP_TinyTcp_uCIP
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。
基于NTP的uIP协议栈改进与实现
Ke o d :uP S c ;lc y crnzt n Ne ok TmeP ooo( P o a ae e ok hg i n rcs n y w r s l t k cok sn ho ia o ; t r i rtc l a i w NT )lcl ran t r ;ih t gpei o w mi i
协议上 , 系结构如图 1 体 所示 。
I H T、T 、 应用协议) I T PFP…(
方 法是移植 u 、w P l L l 等协议栈 , 以太 网控制 芯片 与以太 P 通过 网接 口互连 , 现网络 数据通信 u1 中,l 实 。 。其 uP协议栈 由于它 的开放 、 简单 、 于理解 和稳定 等特 点 , 易 在诸 如卫 星 、 i o Cs 路 c 由器 、 传感 器网络 等很多著 名 的嵌入式产 品和 项 目中 已 无线 经得到 了广泛 的应 用n 。然而 , 传统 uP l 协议栈 的时钟信号 是 由系统 定时器 产生 , 与计算机 和嵌 入式 设备进行 同步控 制 在 时, 一般只有 1- 1~s每天可 能误差达十几 秒或更 多 。如 04 0 , 何减小系统定时器带来的时钟误差 , 改进uP l协议栈的时钟精 度 , 当前应 该解决 的问题 。 是
摘
要: 传统 uP协议栈使 用系统定 时器作 为时钟 信号 , l 在面 向同步控 制时容 易引起服 务器端设备 的循环读取 。针 对这一 问题 ,
引) NT  ̄ P网络授 时协议和 估计误差 系数 k, 并通 过测试确 定误 差 系数 k。通 过定制 uP协议栈 中的 U  ̄ 文格 式 , l DP K 实现 了N P T
gn eig a d Ap l a o s2 1 ,7 3 )7 -9 ier n pi t n ,0 14 (6 :67 . n ci
oSIP协议栈(及eXoSIP、Ortp等)使用入门
一直没空仔细研究下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。
嵌入式uIPTCP/IP协议栈在基于DSP系统中的应用
t h e e n d t h i s t h e s i s a c c o mp l i s h s t h e e mb e d d e d s y s t e m a c c e s s e d t o t h e Et h e r n e t .I t s r e a l i z a t i o n i s s i mp l e a n d t h e c o s t i s r a t h e r l o w. K e y wo r d s: DS P; u I P p r o t o c o l s t a c k; E t h e r n e t Ac c e s s
嵌 入 式 系统 中 选 择 的 数 字 信 号处 理 芯 片 是 T I公 司 的
存 器 ,从 而 实 现 嵌 入 式 系统 接入 以太 网的 U P
Net wor k a n d Commun i c a t i on
嵌入式 u l P T C P / I P协 议栈在基于 D S P系统 中的应 用
谢 文 娣
( 安徽新华学院 , 安徽 合 肥 2 3 0 0 8 8 )
摘 要 :搭 建 了一 个 基 于 D S P嵌 入 式 系统 的 以 太 网接 入 硬 件 平 台 .给 出 了软 件 设 计 思路 及 具体
协 议栈——u I P协 议 栈 来 实 现 基 于 D S P的 嵌 入 式 系 统 以
R 期 s 2 3 2 I M A x 口 T M S 3 2 0 4 b i t  ̄ ] C S 8 9 0 0 A S S T T 0 1 1 卜接 口
T X 1 V C 5 5 1 0
s t a c k ;b e s i d e s i t h a s c o mp l e t e d t h e d e v e l o p me n t o f d e v i c e d r i v e r p r o g r a m a n d t h e s o f t wa r e t r a n s p l a n t o f e mb e d d e d u l P p r o t o c o l s t a c k .I n
uip学习记录
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简介
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协议栈。
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协议栈下载篇一: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。
UIPV0.9中文参考手册
件中的:
#ifndef UIP_APPCALL
#define UIP_APPCALL telnetd_app
#endif
当接收到数据、成功将数据发送到连接的另一端、建立了一新连接亦或是重传了数据时,uIP 就会调用相应的应用程序
(uip_process->UIP_APPCALL();)。应用程序同时会周期的轮询以查看是否有新数据到达。由应用程序映射不同服务到不同
1.1 uIP 介绍
随着互联网的成功,TCP/IP 协议簇已成为全球通讯标准。TCP/IP 是底层协议用于通过进行网页传输, 电子邮件传送,文件 传输以及点对点网络互联。对于嵌入式系统,能够运行本地 TCP/IP 使得系统可以直连企业内部网甚至是全球互联网。嵌入式 设备有了全功能的 TCP/IP 支持,将可以与网络中的其他主机进行通信。 传统的 TCP/IP 实现,其代码体积大占用资源多,对于 8 位或者 16 位的系统来说显得有点吃力。对于仅能容纳小于 100k 的系 统,是不可能移植一个完整的 TCP/IP 协议栈的。 uIP 设计只实现了进行网络通信所需的必要的 TCP/IP 组件。提供基础的 UDP 服务,重点是 IP,ICMP(ping), TCP 服务。uIP 是用 C 语言编写的。 许多其他为小型系统设计的 TCP/IP 实现都假定嵌入式设备会和一个运行全尺寸 TCP/IP 协议栈的工作站级别的机器通信。在这 种情形下,去除 TCP/IP 协议簇中很少使用的功能模块成为可能。但是当和运行同样受限,比如是运行分布式点对点服务和协议 的的设备通信时,那些功能却又是必需的。uIP 被设计成 RFC 兼容以使嵌入式设备有相同的通信能力,同时,uIP TCP/IP 并不 是针对特定应用的,是通用的能进行网络通信所必需组件的合集。
第二章 uIP协议栈分析V1.00
2ቤተ መጻሕፍቲ ባይዱ 2
uIP 架构
uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序 的通讯, 对于整个系统来说它内部的协议组是透明的, 从而增加了协议的通用性。 uIP协议栈与系统底层和高层应用之间的关系如图2-1所示。
图2-1 uIP在系统中的位置 从上图可以看出, uIP 协议栈主要提供了三个函数供系统底层调用。即 uip_init(), uip_input() 和 uip_periodic() 。 其 与 应 用 程 序 的 主 要 接 口 是
本页已使用福昕阅读器进行编辑。 福昕软件(C)2005-2007,版权所有, 仅供试用。
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( )。在不用修改协议栈的情况下可以适 配不同的应用程序。
STM32毕业论文资料
精品文档本科毕业设计(20 届)基于stm32无线数据基站的设计和实现题目院电子信息学院学专业电子信息工程陈洁姓名级班09091813号学09918307指导教师周磊3月年20 完成日期精品文档.精品文档诚信承诺我谨在此承诺:本人所写的毕业论文《基于stm32无线数据基站的设计和实现》均系本人独立完成,没有抄袭行为,凡涉及其他作者的观点和材料,均作了注释,若有不实,后果由本人承担。
承诺人(签名):年月日精品文档.精品文档摘要随着人们的生活及其生产水平的不断提高,对生活中各种数据接收的速度和准确度的要求就显得尤为重要,无线数据收发控制就是一个典型的例子,因此无线数据基站就是现代生产生活中应运而生的一种智能、快捷、方便可靠的检测系统。
本设计通过STM32F107控制无线收发模块从无线网络节点接收数据,进行相关处理后通过以太网把数据发送至应用服务器。
系统的用户统用户通过Internet网络访问应用服务器,其中本设计起到网桥和防火墙的作用。
其中本设计中采用的以太网控制器为DM9161芯片。
本设计软件部分的主要工作是在硬件平台的基础上实现TCP/IP协议栈,由于TCP/IP协议栈较复杂,功能实现比较困难,一般选择成熟的TCP/IP协议栈进行移植,此次选择开源并且较成熟的LwIP以太网协议栈。
关键词:STM32F107 以太网DM9161 TCP/IP协议栈精品文档.精品文档ABSTRACTWith the continuous improvement of people's lives and their production levels, thethe life data reception speed and accuracy requirements is particularly important, wireless data transceiver control is a typical example, the wireless data base station is modern production lifecame into being a smart, fast, convenient and reliable detection system.This design STM32F107 control wireless transceiver module receives data fromthe wireless network nodes related via Ethernet transmits data to the application server.The system user system user access to the application server through the Internet, including the design play a role of bridge and firewall. DM9161 Ethernet controller chipused in the design.The software part of the design work is implemented in hardware platform based on the TCP / IP protocol stack, the TCP / IP protocol stack is more complex, and more difficult to achieve, usually selected mature TCP / IP protocol stack for transplantation,the choiceopen source and the more mature LwIP Ethernet protocol stack.Key words:STM32F107 Ethernet DM9161 TCP/IP Protocol stack精品文档.精品文档目录1 引言 (1)2 概述 (2)2.1 课题研究的背景 (2)2.2 国内外stm32控制以太网技术发展现状及趋势 (3)2.3 研发方向和技术关键 (4)2.4 主要技术指标 (4)3 总体设计 (5)3.1 系统方案选择与论证 (5)3.2 系统软件总体结构 (6)3.3 本章小结 (7)4 硬件设计 (9)4.1 主控芯片STM32F107 (9)4.2 STM32串口通讯 (12)4.3 DM9161用法介绍 (16)4.4 本章小结 (20)5 以太网协议...............................................................................................................215.1 TCP/IP协议 (21)5.2 嵌入式TCP/IP协议栈 (22)6 软件设计...................................................................................................................266.1 主程序设计 (26)6.2 系统初始化子程序 (27)6.3 RS232通讯子程序 (28)6.4 网口通讯子程序 (28)6.5 本章小结 (29)7 结论...........................................................................................................................30致谢.................................................................................................................................31参考文献.........................................................................................................................32附录.................................................................................................................................33精品文档.精品文档1 引言随着人们的生活及其生产水平的不断提高,对生活中各种数据接收的速度和准确度的要求就显得尤为重要,无线数据收发控制就是一个典型的例子,因此无线数据基站就是现代生产生活中应运而生的一种智能、快捷、方便可靠的检测系统。
uip简介
Uip协议栈初步分析5.1Uip协议栈架构uIP 的代码和这个文档的新版本可以在uIP的主页下载/adam/uip/。
Uip协议栈架构图Uip协议栈包含以下几层:1.硬件驱动程序:包含rtl8019as/ax88796/dm9000等的驱动程序由于uip是个免费的协议栈,在不同芯片合系统上,需要对原有的协议栈进行修改,这个过程就叫做移植,一般的uip协议栈没有提供网络芯片的驱动程序,所幸遇的是/projects/uipAVR.htm已经将uip移植到avr上,并提供了rtl8019as和ax88796的驱动程序,dm9000的驱动程序没有提供。
本开发板提供的软件也是从上述地址的软件移植而来,类似的charon ii 和ethernut软件也提供类似的驱动程序,有兴趣的也可以参考一下。
驱动程序完成,芯片的初始化,复位,溢出处理,读写函数和收发包等,主要函数如下另外对网络芯片的寻址也在此完成!!!!主要文件在rtl8019.h和rtl8019.c中2.nic网络层主要完成网络的初始化,网络芯片的选取,网络芯片的轮训poll等主要文件在nic.h和nic.c中3.uip协议栈层主要实现网络协议栈的具体实现,支持arp/icmp/udp/tcp/http/等为了实现在8位单片机上运行,系统设计时没有采用socket编程方式本层是uip协议栈的核心,所以得协议处理都在本层实现主要函数有:主要文件在uip.h和uip.c中4.uip_app层支持基于udp/tcp的上层应用函数的实现例如如果需要网页功能,需要支持http,那么在app.h/.c中实现具体的功能!!主要文件在app.h和app.c中编译文件其他介绍:Uipopt.h 这个是uip协议栈的配置函数,例如本机ip地址,本机网关,本机屏蔽码,本机mac 地址以及uip协议栈的一些常用设置等都在此修改!Uip_arp.h/.c定义了arp协议的处理函数Uip_arch.h/.c定义了协议栈需要的校验和函数5.2应用程序主要文件列表上图是一个项目的主要包含文件,其中html.h/.c是网页显示的文件!5.3. uip主要函数简介:5.4.uip main函数介绍:/******************************************************************** * Main Control Loop**********************************************************************/ int main(void){unsigned char i;unsigned char arptimer=0;////////////// MY CODE ADD//串口初始化USART_init();/////////////////////////// init NIC device driver//网络初始化函数nic_init();//uip协议栈初始化// init uIPuip_init();// init app 应用程序初始化,比如tcp或者udp ,http的应用!example1_init();// httpd_init();// init ARP cache 初始化arp协议的缓冲uip_arp_init();// init periodic timer 初始化周期函数定时器initTimer();//开放中断sei();//主循环while(1){// look for a packet查询网卡是否有数据包uip_len = nic_poll();if(uip_len == 0)//如果没有数据包{// if timed out, call periodic function for each connection if(timerCounter > TIMERCOUNTER_PERIODIC_TIMEOUT){timerCounter = 0;for(i = 0; i < UIP_CONNS; i++){uip_periodic(i);//周期性检查函数// transmit a packet, if one is readyif(uip_len > 0) //如果包长度大于0 发送包{//主动发送和重发数据包在此进行uip_arp_out();nic_send();}}/* Call the ARP timer function every 10 seconds. */if(++arptimer == 20)//更新arp表{uip_arp_timer();arptimer = 0;}}}else // packet received 接收到网络数据包{// process an IP packet 处理ip数据包if(BUF->type == htons(UIP_ETHTYPE_IP)){// add the source to the ARP cache// also correctly set the ethernet packet length before processinguip_arp_ipin();uip_input();// transmit a packet, if one is readyif(uip_len > 0){uip_arp_out();nic_send();}}// process an ARP packet 处理arp包else if(BUF->type == htons(UIP_ETHTYPE_ARP)){uip_arp_arpin();// transmit a packet, if one is readyif(uip_len > 0)nic_send();}}}return 1;}串口转TCP程序初步本范例主要实现串口数据发送到远程ip的对应端口,串口数据包含帧头和帧尾,主要有串口中断函数,和串口处理函数2个函数构成,分析如下:volatile unsigned int UartTxCount,UartRxCount,UartRxCount1;volatile unsigned char TxSendReady,RxOK,RS232Enable;//串口1通讯程序//没有增加超时处理20060822//SIGNAL(SIG_USART_RECV)#pragma interrupt_handler RS485COM:31//atmega32l @14void RS485COM(void){Rs485_Data=UDR1;//Rs485_Data=UDR;#ifdef MCUA TMEGA32//printf("=%x\n",Rs485_Data);////if(RxOK==1)printf("RxOK==1!\n");#if RS485HEADER//如果是帧头if(Rs485_Data==RSStart ) //接收到开始标志{RsStart=1; //开始接受串口1的数据Rs485Counter=0; //接收计数器清零RxBuf[Rs485Counter]=Rs485_Data; //把数据送入接收缓冲区RXBUFRSCRC=0; //RSCRC清零RxOK=0; //没有接收完成//加上0X55//#if CRC0//RSCRC+=Rs485_Data;//#endifRs485Counter++; //接收计数器加一}else if(Rs485_Data==RSEnd) //接收到结束标志{//检查CRC// if(RSCRC==RxBuf[Rs485Counter-1])// {RxBuf[Rs485Counter]=Rs485_Data; //将结束的数据送入接收缓冲区// UartRxCount=++Rs485Counter;RSLEN=++Rs485Counter; //把接收计数器的值送入RSLENRxOK=1; //接收完成RsStart=0; //清除RSSTARTRS485process();//Rs485Counter=0;// }/*RxBUF[Rs485Counter]=Rs485_Data;//加上0XAARSCRC+=Rs485_Data;//加上0XAA的字节长度Rs485Counter++;*//*else{//清除RxBuffor(j=0;j<TxBufLen;j++)RxBuf[j]='';//置位标志//3.初始化串口变量和标志// UartTxCount=0;UartRxCount=0;TxSendReady=0;RxOK=0;RS232Enable=1;}*/}else{#endif //RS485HEADER//开始接收数据帧中除了头和尾的中间数据//首先检查状态if(RxOK!=1)//如果没有结束{//检查计数器的值是否溢出//将接收的数据送入接收缓冲区RXBUF,同时计算CRC,计数器自动加一if(RsStart==1||Rs485Counter!=0){RxBuf[Rs485Counter]=Rs485_Data;//RSCRC+=Rs485_Data;Rs485Counter++;}#if RS485HEADER}#endif //RS485HEADER}}/*1. 串口及程序初始化;{TxSendReady=0;RxOK=0;RS232Enable=1;}2. 首先从串口接收数据,由于数据以0X55开始,0XAA结束,接收时数据写入RxBuf[];3. 接收完成,置接收标志RxOK=1;4. 判断RS232Enable=1,=1则复制到TxBuf, RxOK=0;TxSendReady=1;5. TCPAPP中判断if(TxSengReady==1),=1启动发送,发送完成清除TxSendReady=1;置位RS232Enable=1,允许数据装载到TxBuf*/void RS485process(void){unsigned char i;//if(UartRxCount!=0){//printf("UartRxCount=%x\n",UartRxCount);//for(i=0;i<UartRxCount;i++)printf("%x",RxBuf[i]);//printf("\n");//}//printf("RxOK=%x ",RxOK);//printf("TCP_SEND_OK=%x " ,TCP_SEND_OK);//printf("RS232Enable=%x ",RS232Enable);//printf("TCP_SEND_READY=%x \n",TCP_SEND_READY);if(TCP_SEND_OK==0){printf("TCP_SEND_OK==0\n");return;//如果发送没有完成则返回}//printf("RS232Enable=%x\n",RS232Enable);//printf("TCP_SEND_READY=%x\n",TCP_SEND_READY);//接收完成if(RSLEN!=0||RS232Enable==1)//如果不是空包和串口更新允许RS232ENABLE=1 {//如果缓冲中已经有数据包,需要把缓冲重的数据保存起来if(TCP_SEND_READY==1){//接受成功//UDR0 = j++;RxOK=0;//清接收成功标志UartRxCount1=RSLEN;//Rs485Counter;//包含包头和包尾的//把数据放入上一个数据包的TCP发送缓冲区的后面for(i=0;i<UartRxCount1;i++){TxBuf[i+UartRxCount]=RxBuf[i];}UartRxCount+=UartRxCount1;RSLEN=0;return;}if(TCP_SEND_OK)TCP_SEND_READY=1;//TCP准备发送else {UartRxCount=0;printf("TCP_SEND_OK=0\n");return;}//接受成功//printf("RxOK=1\n");RxOK=0;//清接收成功标志UartRxCount=RSLEN;//Rs485Counter;//包含包头和包尾的//把数据放入TCP发送缓冲区for(i=0;i<UartRxCount;i++){TxBuf[i]=RxBuf[i];//printf("TxBuf[%x]=%x\n",i,TxBuf[i]);}RSLEN=0;//for(i=0;i<TxBufLen;i++)RxBuf[i]='';//printf("\nTCP_SEND_READY=0\n");//RS232Enable=0;}else{printf("wait");}return;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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(); /*假如存在数据则按协。