欢迎来到天天文库
浏览记录
ID:45763517
大小:50.81 KB
页数:6页
时间:2019-11-17
《一种uIPTCP_IP协议栈在51系列单片机上的实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一种ulPTCP/IP协议栈在51系列单片机上的实现一引言随着信息技术的不断发展,以及人们对口常生活舒适度、方便度耍求的提高,信息家屯、智能仪表等产品越來越频繁的出现在我们的牛活当中;人们也越來越热衷丁•把家电、仪农等设备连接到Internet中,从而可以方便、及时的对它们进行远程察看、远程控制。把这些设备接入Internet,就需要考虑TCP/IP网络协议的实现。51单片机是对目前所有兼容Intel8031指令系统的单片机的统称。该系列单片机的始祖是IntelW8031单片札后來随着Flashrom技术的发展,8031单片机取得了长足的进展,成为目前应用
2、最广泛的8位单片机Z—,其代表型号是ATMEL公司的AT89系列,它广泛应用丁•工业测控系统Z中。11前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。本文将简要描述ulP的实现方法,分析ulP协议栈的应用接口,并讨论如何将其应用到51系列单片机上。二ulP协议栈的实现方法简述ulP协议栈主耍提供了三个函数供系统底层调用。即uipjnit(),uipjnput()和uip_periodic()。其与应用程序的主要接口是
3、UIP_APPCALL()。ipjnit()是系统初始化时调川的,主要初始化协议栈的侦听端口和默认所有连接是封闭的。当网卡驱动收到一个输进包时,将放进全局缓冲区uip_buf中,包的大小由全局变量uipjen约束。同时将调用uipjnput()函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序。当uipjnput()返回时,一个输出包同样放在全局缓冲区uip.buf里,大小赋给uip」en.假如uipjen是0,则说明没有包耍发送。否则调用底层系统的发包两数将包发送到网络上。ulP周期计时是用于驱动所有的ulP内部时钟事件。当周期计时激发,毎
4、一个TCP连接都会调用ulP函数uip_periodic()。类似于uipjnput()函数。uip_periodic()函数返冋时,输出的IP包要放到uip_buf中,供底层系统查询uipjen的大小发送。ulP实现了TCP/IP协议集的四个基本协议:ARP地址解析协议,IP网际互联协议,ICMP网络控制报文协议和TCP传输控制协议。为了在8位16位处理器上应用,ulP协议栈在各层协议实现时采用有针对性的方法,保持代码大小和存储器使用量最小。1实现ARP地址解析协议时为了节省存储器,ARP应答包直接覆盖ARP请求包。2实现IP网络协议时对原协议进行了极大
5、的简化,它没冇实现分片和重组。3实现ICMP网络控制报文协议时,只实现echo(回响)服务。ulP在生成回响报文时并不重新分配存储器空间,而是直接修改echo请求报文來生成回响报文。将ICMP类型字段从"echo”类型改变成"echoreply”类型,重新计算校验和修改校验和字段。4ulP里的TCP没有实现发送和接收数据的滑动窗口。毎个TCP连接的状态山uip_conn结构保存,uip_conn结构包括当地和远端的TCP端口编号,远程主机的IP地址,重发时间值,上一段重发的编号,和连接的段的最人尺寸等信息。一个uip_conn结构数纽•用于保存所冇的连接,
6、数组的人小为支持的同时连接的放人数量。为了减少储存器的使用虽:,在处理重发时ulP并不缓存发送的数据包,而是由应用程序在需要重发时重新生成发送的数据。三ulP协议栈的接口ulP协议栈为了具冇最大的通用性,在实现时将底层硕件驱动和顶层应用层Z外的所冇协议集”打包"在一个”库“里。协议栈通过接口与底层硕件和顶层应用”通信”.通过这种方式,ulP具冇极高的通用性和独立性,移植到不同系统和实现不同的应用都很方便,很好的体现了TCP/IP协议平台无关性的特点。ulP协议栈与系统底层和应用程序之间的接U关系如图(一)所示:系统底层网络设备驱动系统定时器1UIP协议栈与
7、系统底层的接口UIP与系统底层的接II包括与设备驱动的接口和与系统定时器的接口两类。1.1UIP与设备驱动接口ulP通过函数uipjnput()和全局变量uip_buf>uipJen來实现弓设备驱动的接口。uip_buf用丁•存放接收到的和要发送的数据包,为了减少存储器的使用,接收数据包和发送数据包使用相同的缓冲区。uipjen表明接收发送缓冲区里的数据t度,通过判断uipjen的值是否为0來判断是否接收到新的数据,是否有数据要发送。当设备驱动接收到一个IP包并放到输入包缓存里(uip_buf)后,应该调Wuipjnput()函数。uipjnput()函数
8、是ulP协议栈的底层入口,由它处理收到的IP包。当uipjnput
此文档下载收益归作者所有