uIP tcp/ip协议分析及其在嵌入式系统中的应用
网络技术的发展使越来越多的工业控制设备将网络接入功能作为其必备的特性之一。同样,嵌入式系统的发展,要求其应用能够支持网络功能,为用户提供一个简易方便的可视化图形界面。当前WEB浏览器已经成为用户的合理选择,因此,为了可以通过因特网通讯,实现WEB SERVER的功能,一个可实现的TCP/IP协议是必须的。对于一个32位的嵌入式处理器组成的系统运行一个集成有TCP/IP协议栈的操作系统就可以方便的接入现有的网络中。但是对于8/16位的低端微处理器组成的系统,由于其处理能力和资源的有限,为保持代码大小和储存器使用量最小,节约硬件成本等因素的考虑通常不运行操作系统,这就要求系统设计者根据需要选择合理的协议栈。uIP是一个可实现的TCP/IP协议组件的一个重要部分,它能够保持代码大小和储存器使用量最小,能够方便的使用于8/16位低端微处理器构建的系统中。本文主要描述了uIP的特性,分析了uIP协议栈的应用接口,通过RTL8019AS以太网控制器芯片实现了单片机在Internet上的web server。
1. 网络接口控制模块的实现;
1.1 系统结构:
整个系统的设计是利用网卡控制器(RTL8019AS)将单片机接入网络,具体结构图如图1所示:
1.2 以太网控制器选择及其驱动的实现:
1.2.1 网卡芯片概述及选择:
网络接口芯片选用RTL8019AS(台湾REALTEK公司)它能够简单的解答即插即用NE2000兼容适配器.全二重功能能够模拟传播和接收在双绞线到全二重以太网交换机,避免了由于以太网频道争夺特性导致的读出多路存取协议的问题。该控制器的主要特点有:
(1) 支持以太网和IEEE802.3(10Base5,10Base2,10BaseT),软件支持8位/16位的NE2000:
(2) 全双工,收发同时达到10Mbps的速度;
(3) 内置16KB的SRAM,用于收发缓冲,降低对主处理器的速度要求,支持8/16位数据总线,8个中断申请线以及16个I/O基地址选择为大资源提供了宽松的环境:
(4) 可以使用8位ISA总线,与51系列单片机的接口简单,不用转换芯片;
(5) 性价比高.
1.2.2 RTL8019AS驱动的实现
网卡的驱动程序屏蔽了底层硬件的处理细节,为上层软件提供了一个与硬件无关的接口。RTL8019AS的驱动程序将要发送的数据包按指定的格式写入芯片输入输出缓冲区中并启动发送命令,这时RTL8019AS自动把数据包转换成物理桢格式在物理信道上传输,反之RTL8019AS收到物理信号之后将其还原成数据,按指定的格式输入输出缓冲区中供应用程序来取用.其驱动程序主要包括:网卡的初始化,数据的发送和接受函数.具体的实现由如下函数来完成相应的功能:
(1) void initRTL8019(void) //RTL8019AS的初始化函数
(2) unsigned char RTL8019dev_poll(void) //网卡的接受函数
{
unsigned int packetLength;
packetLength = RTL8019beginPacketRetreive();
if( !packetLength ) //判断是否有数据
return 0;
if( packetLength > UIP_BUFSIZE )
{
RTL8019endPacketRetreive();
return 0;
}
RTL8019retreivePacketData( uip_buf, packetLength );
RTL8019endPacketRetreive();
return packetLength;
}
(3) void RTL8019dev_send(void) //网卡发送函数
{
RTL8019beginPacketSend(uip_len);
if( uip_len <= TOTAL_HEADER_LENGTH )
{
RTL8019sendPacketData(uip_buf, uip_len);
}
else
{
uip_len -= TOTAL_HEADER_LENGTH;
RTL8019sendPacketData(uip_buf, TOTAL_HEADER_LENGTH);
RTL8019sendPacketData((unsigned char *)uip_appdata, uip_len);
}
RTL8019endPacketSend();
}
2. Uip tcp/ip协议分析;
目前,市面上几乎所有的嵌入式TCP/IP协议栈都是根据BSD版的TCP/IP协议改写的。TCP/IP协议在全球互联网上取得了巨大的成功,已成为全球网络通讯的标准。但是对于嵌入式系统由于其资源的有限,功能单一,针对性强,没有必要支持一个完整的TCP/IP协议组件,只需要实现与需求相关的部分协议。由瑞典计算机科学研究所AdamDunkels开发的uIP,去掉了全功能的TCP/IP协议栈中不常使用的功能,保留了网络通讯所必要的协议机制,减少了协议代码量,降低了协议对系统资源的要求。uIP是适用于8/16位微处理器嵌入式系统的一个可实现的极小的TCP/IP协议栈,它实现了TCP/IP协议集的四个基本的协议:ARP地址解析、IP网际互联协议、ICMP网络控制报文协议和TCP传输协议。而且该协议由公开源代码的C语言编写,任何人都可以在网络上下载其源代码并对其进行修改,以适应于具体的系统。
2.1 Uip 0.6体系结构
uIP0.6的体系结构如图2所示:uIP处于网络通信的中间层,其上层协议称之为应用程序,下层硬件和其它固件称之为网络设备驱动。这样就屏蔽了下层硬件的处理细节,为上层应用提供一个统一的接口。在实际的应用中用户只要根据自己的需要编写相应的应用程序来实现具体的应用要求而不必过多的考虑硬件接口问题。为程序员提供了更多方便使其将主要精力集中在高层应用程序的开发上。
2.2 协议栈接口
uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序的通讯,对于整个系统来说它内部的协议组是透明的,从而增加了协议的通用性。uIP协议栈与系统底层和高层应用之间的关系如图3所示:
uIP提供了三个函数到系统底层,既uip init(), uip input() 和uip periodic(),同时还提供了许多函数与堆栈交互。需要注意的是uIP提供的大部分函数是作为C的宏命令实现的,主要是为了速度,代码大小,效率和堆栈的使用。表一列出了uIP提供的所有函数:
2.2.1 uIP设备驱动接口
当设备驱动放一个输入包到包缓存里(uip buf),系统将调用uip input()函数.函数将会处理这个包和需要时调用应用程序。当uip input()返回,一个输出包放在包缓存里。包的大小由全局变量uip len约束。如果uip len是0,则说明没有包要发送。
2.2.2 uIP周期计时接口
周期计时是用于驱动所有的uIP内部时钟事件。当周期计时激发,每一个TCP连接应该调用uIP函数uip periodic()。连接编号传递的是作为自变量给uip periodic()函数的。类似于uip input()函数,当uip periodic()函数返回,输出的IP包要放到包缓存里。下面的代码为调用uip periodic()函数和监视输出包的代码实现:
for(i=0;i
Uip periodic(i);
If(uip len >0)
RTL8019dev_send(); //网络驱动,将uip buf数组的目录发出到网上.
}
2.2.3 uIP协议栈与应用程序的接口
应用程序作为单独的模块由用户实现,uIP协议栈提供一系列接口函数供用户程序调用。用户需要将应用层入口程序作为接口提供给uIP协议栈,定义为宏UIP_APPCALL()。uIP在接受到底层传来的数据包后,若需要送到上层应用程序处理,它就调用UIP_APPCALL()。uIP提供给应用程序的接口函数如表一中的描述。
2.3 uIP的配置
uIP的设置在uipopt.h头文件中.在该文件中,用户根据具体的实际条件设置UIP_IPADDR:The ip address of this uip node;UIP_NETMASK:The netmask;UIP_DRIPADDR:Ip address of the default router; UIP_ETHADDR:The Ethernet address等以及同时发生连接的最大值(UIP_CONNS),在具体的应用中可以参考相应的文档。
3. uIP协议栈的应用
uIP协议栈是以函数库的形式提供的,本身不提供底层网络驱动和上层应用程序。为了实现web server,在具体实现过程中应用软件必须完成基于Http协议的服务器,服务器首先监听80端口,一旦有客户请求连接,uIP内部将给它分配一个连接项,接着等收到客户机浏览器发出的”GET”请求后,将客户所需要的信息等生成新的网页发送给客户机。如果用户关闭了浏览器,uIP也会自动检测这一事件,释放此连接。同时数据是按HTTP协议进行传送的,当客户端发出请求服务器响应请求,把指定的页面送出来,用户就可以看到页面。为了适应客户端标准IE浏览器的要求,web页面采用HTML格式。网络客户端只要输入相应的网址或IP就可以进入服务器提供的网页,软件的具体实现框图如图四所示:
4. 结束
采用uIP嵌入式TCP/IP协议栈实现单片机上的Web server功能,有着广泛的应用前景,可以用于实现远程水位,温度等的控制系统中。为用户提供方便,同时该协议由公开源码的C语言编写,任何人都可以在网络上下载其源码,是将嵌入式系统接入网络的有效途径。
参考文献:
1. Adam Dunkels uIP - A Free Small TCP/IP Stack adam@dunkels.com January 15, 2002
2. 温阳东,何瑄,邓箐 基于RTL8019AS的以太网接口单元研究 仪器仪表用户 2006¬-01-23
3. 孙林,钱峰,将青 TCP/IP协议在嵌入式操作系统UCOS-II中的实现 山西电子技术2006年第3期
4. 张懿慧,陈泉林 源码公开的TCP/IP协议在远程监测中的应用 应用天地 2004年第11期
5. TCP/IP网络原理与技术 周明天 汪文勇 清华大学出版社
trackback:http://blog.csdn.net/fangbing007/article/details/2581827