打印
[微控制器/MCU]

转:uIP TCP/IP协议栈在51系列单片机上的应用 (2)

[复制链接]
2745|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
6019赵文|  楼主 | 2011-2-15 20:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • 非常有用个人感觉



    uIP TCP/IP协议栈在51系列单片机上的应用 (2) 2


      uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈,可以使用于由8位或16位微处理器构建的嵌入式系统。本文分析了uIP协议栈的结构和应用接口,并讨论了如何将其应用到51系列单片机上。 关键字:TCP/IP[6篇] 单片机[89篇] 嵌入式系统[110篇]        硬件平台结构如图(二)所示:其中单片机选用PHILIPS公司的P89C51RD2,64K字节的串行EEPROM可以用于存储WEB页面。采用ISA接口的以太网接口芯片RTL8019AS连接到以太网上。通过MAX232实现与PC机的串行连接,可以显示调试信息。    uIP协议栈是以函数库的形式提供的,本身不提供底层网络驱动和上层应用程序。因此为了完成指定的功能,开发者必须添加以下几个模块:底层RTL8019AS网卡芯片的驱动、应用层基于HTTP协议的WEBSERVER的实现、系统定时器。    RTL8019AS的驱动主要包括三部分:init_8019as()函数完成网卡芯片的上电初始化,包括设定网卡物理地址,设定收发缓冲区位置和大小等;eth_send()函数完成数据的发送;eth_rcve()函数完成以太网数据的接收。底层网络设备驱动程序与uIP协议栈通过两个全局变量进行接口:变量uip_buf为收发缓冲区的首地址;uip_len为收发的数据长度。eth_send()函数将uip_buf里的uip_len长度的数据发送到以太网上。eth_rcve()函数将接收到的数据存储到uip_buf指定的缓冲区中,同时修改uip_len的值。    uIP提供的源代码中包括一个基于HTTP协议的WEBSERVER示例,该WEBSERVER通过简单的文件系统在数据存储器中存储静态页面,同时具有CGI功能。用户可以参照该示例以及uIP提供给应用程序的接口函数说明实现自己的应用层功能。用户的应用程序中必须将UIP_APPCALL宏定义为该层的服务程序。例如:在示例程序中WEBSERVER的处理程序为httpd()函数,则要进行如下的宏定义#defineUIP_APPCALLhttpd。    51系列单片机上都有2到3个定时计数器,可以选择其中的一个来为TCP/IP协议中与时间有关的事件定时。需要由用户处理的定时事件包括:为uip_periodic()函数的执行提供基准,还要为ARP表项的更新定时。uip_periodic()函数每0.5秒执行一次,ARP表项每10秒更新一次。    uIP的设置单独包含在一个叫uipopt.h的头文件里,都是以宏的形式定义方便于修改。用户应根据自己的应用在uipopt.h文件里设置本地的物理地址、IP地址、网关地址、收发缓冲区的大小、支持的最大连接数、ARP表大小等等选项。    添加了必须的模块,对uIP进行了正确地配置后,需要编写主程序函数。针对基于以太网的WEBSERVER应用,主程序在完成初始化后将不停的进行查询,如果有新数据包到达则送uip_input()函数处理;如果没有新数据包到达则处理定时事件。框架代码如下所示:      void main(void) //主程序开始   { …… //省略部分代码   timer0_init(); //定时器初始化函数由开发者完成   serial_init(); //串口初始化函数由开发者完成   init_8019(); //网卡芯片初始化函数由开发者完成   uip_init(); //uIP协议栈初始化函数由uIP协议栈提供   httpd_init(); //HTTP应用程序初始化函数由WEB SERVER示例程序提供   uip_arp_init();//ARP协议初始化函数由ARP模块提供   while(1)   { uip_len = eth_rcve(); //查询网卡是否有数据到来   if(uip_len == 0) //如果没有数据到来则处理定时事件   { if(0.5秒定时时间到)   { for(i = 0; i < UIP_CONNS; i++) // UIP_CONNS为TCP连接数   { uip_periodic(i); //处理每一个TCP连接   if(uip_len > 0) //说明本连接有数据要发送或重发   { uip_arp_out(); //由ARP处理部分添加以太网帧头   eth_send(); //由网卡驱动程序发送   }   }//对应于:for()   }// 对应于:if(0.5秒定时时间到)   if(ARP表项更新时间到)   uip_arp_timer(); //进行ARP表项更新   }else if(uip_len > 0) //说明接收到新的数据包   { if(BUF->type == htons(UIP_ETHTYPE_IP))//如果收到IP数据包   { uip_arp_ipin(); //送ARP模块进行表项更新   uip_len -= sizeof(struct uip_eth_hdr); //去除以太网帧头   uip_input(); //送uip_input()进行处理   if(uip_len > 0) //若uip_input()返回后uip_len不为零说明有数据要回送   { uip_arp_out(); //由ARP部分添加以太网帧头   eth_send(); //送交网卡驱动发送   }//对应于:if()收到IP数据包   }else if(BUF->type == htons(UIP_ETHTYPE_ARP))//如果收到ARP包   { uip_arp_arpin(); //由uip_arp_arpin()处理,如果为应答包则进行表项   //更新   //如果为请求包,则构造应答数据包   if(uip_len > 0) //说明收到的是ARP请求包,需要回送ARP应答包   eth_send(); //送网卡驱动发送   }//对应于:else if()收到ARP数据包   }//对应于:else if() 说明接收到新的数据包   }}   以上实例在keilC51编译器下设置大模式,优化等级6(速度优先)进行编译,对uIP代码部分可以不做任何修改,对HTTP示例代码仅需针对类型表达进行极少量的修改即可编译通过。在硬件平台上运行良好。    五总结    uIP协议栈采用有效的方法和结构化的代码,使其存储器占用量很小并且可以很方便的应用到不同的工程项目中。同时它又是免费的可以自由使用于商业和非商业目的。uIP为低端嵌入式设备的网络接入提供了很好的解决方案,具有很高的应用价值。    参考文献    [1]DOUGLASE.COMER著,用TCP/IP进行网际互连(卷一、卷二)电子工业出版社,2000     [2]JEREMYBENTHAM著,嵌入式系统Web服务器——TCP/IPLean机械工业出版社,2003     [3]uIP协议栈网络站点http://dunkels.com/adam/uip/     [4]REALTEK公司.RTL8019ASDatasheet,2000   

相关帖子

沙发
老大的幸福| | 2011-2-16 11:38 | 只看该作者
8错8错,是个好东西,顶了

使用特权

评论回复
板凳
金鱼木鱼| | 2011-2-16 11:54 | 只看该作者
如果有排版就好了,给个链接呗!

使用特权

评论回复
地板
dianzirobot| | 2011-3-23 20:12 | 只看该作者
整齐点就更好了

使用特权

评论回复
5
小云001| | 2011-3-23 21:38 | 只看该作者
是啊,排一下版就更好了

使用特权

评论回复
6
即时生效| | 2011-3-24 17:38 | 只看该作者
不错的东西,就是有点乱

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

350

主题

1515

帖子

1

粉丝