《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 嵌入式uIP TCP/IP协议栈在基于DSP系统中的应用
嵌入式uIP TCP/IP协议栈在基于DSP系统中的应用
来源:微型机与应用2013年第9期
谢文娣
(安徽新华学院,安徽 合肥 230088)
摘要: 搭建了一个基于DSP嵌入式系统的以太网接入硬件平台,给出了软件设计思路及具体实现方法,对开源的uIP协议栈进行裁剪和修改,完成了设备驱动程序的开发和嵌入式uIP协议栈的移植,最终实现了嵌入式系统接入以太网的功能,且其实现过程简单、成本较低。
Abstract:
Key words :

摘  要: 搭建了一个基于DSP嵌入式系统的以太网接入硬件平台,给出了软件设计思路及具体实现方法,对开源的uIP协议栈进行裁剪和修改,完成了设备驱动程序的开发和嵌入式uIP协议栈的移植,最终实现了嵌入式系统接入以太网的功能,且其实现过程简单、成本较低。
关键词: DSP;uIP协议栈;接入以太网

 近年来,嵌入式技术发展迅速并在许多电子产品(如手持式、便携式)中都有广泛的应用[1],而嵌入式产品网络化是当今社会一股不可抵挡的研究潮流。嵌入式系统必须具有网络互连功能才能快速地与设备通信,以太网是目前使用最广泛的局域网技术。由于有些嵌入式系统要求网络的实时性较高,因此本文使用精简TCP/IP协议栈——uIP协议栈来实现基于DSP的嵌入式系统以太网接入功能,下面详细阐述其设计与实现。
1 系统硬件平台
 TMS320C5000系列是16 bit定点DSP,通常被应用在如VoIP以及IP电话网关等通信领域中。基于DSP的嵌入式系统中选择的数字信号处理芯片是TI公司的TMS320VC5510芯片,网卡芯片选择的是由Cirrus Logic公司生产的CS8900AS芯片。系统硬件接口基本结构图如图1所示。

 TMS320VC5510芯片是由TI公司生产的第一个基于定点TMS320C55x核,具有低功耗、高性能的16 bit数字信号处理器[2]。Cirrus Logic公司专门设计了以太网控制器CS8900A,这款网卡芯片主要应用在对可靠性要求极高的工业控制领域中[3]。

 


2.1 底层驱动程序的设计
 本系统采用查询方式来完成CS8900A芯片的软件编程控制工作。这一工作主要分为以下3个过程:
 (1)首先是完成以太网控制芯片的初始化工作,由初始化函数ethernet_driver_init(void)来完成发送/接收配置寄存器的相关设置工作,如对CS8900A进行软件复位、设置以太网接口参数以及设置以太网的硬件地址。
 (2)若发送数据,则由数据发送函数ethernet_driver_write()先将发送命令写入CS8900A的TxCMD寄存器中,其次在CS8900A的Txlength寄存器中写入将要发送的数据帧长度,接着检查BusStatus寄存器的PPD,待PPD处于空闲状态时将要发送的数据帧写入CS8900A中,最后CS8900A将自动决定数据帧以相应的报文根据TxCMD寄存器的设置向以太网上发送。
 (3)若以太网接收到数据包,则由数据接收函数ethernet_driver_write()读取数据包,CS8900A将根据接收配置寄存器的设置自动对接收的报文进行预处理。
2.2 uIP协议栈的设计
 由瑞典计算机科学学院的Adam Dunkels开发的uIP协议栈是一种免费的、可实现的且非常小的TCP/IP协议栈,它是为8 bit和16 bit处理器专门设计的[5]。uIP协议栈是使用C语言编写的,它移植起来方便而且代码也相当简洁。uIP协议栈去掉了完整的TCP/IP中不常用的功能,简化了通信流程,占用的资源少,处理速度快。
 基于DSP的嵌入式系统uIP协议栈中,根据需要只实现了ARP、IP、ICMP、UDP协议。TCP提供面向连接的、可靠的、点对点的服务[6],但TCP开销大,传输速度慢;虽然UDP是面向无连接的,由于UDP没有可靠性的保证机制,因此能以较快的速度进行数据通信;UDP协议的开销很小,传输率比TCP高出很多,实时性更强,所以uIP协议中采用UDP协议作为运输层协议。该uIP协议栈的网络体系结构如图3所示。

2.3 uIP协议栈的实现
 uIP协议栈的实现主要集中在uip.c的源文件里,代码简洁。图4所示为uIP整个系统的主程序流程图。在这个主程序流程图中,初始化工作是由底层硬件完成的,主要是对物理层的一些接口进行配置和绑定。uIP协议栈接收数据包的过程实际上就是对数据包进行解析,当网络驱动设备发送数据包过来时,首先读取数据包判断是IP包还是ARP包,如果是ARP包,则进行ARP处理;若是IP包,则判断其上层协议是UDP协议还是ICMP协议,再分别对其进行处理。当有数据发送时,网络驱动设备的硬件将自行判别数据包并且完成数据包的封装工作。

2.3.1 ARP协议
 ARP协议是由源文件Uip_arp.c实现的,其中包含uip_arp_init()、uip_arp_timer()、uip_arp_update()、uip_arp_arpin()和uip_arp_out()5个函数。uip_arp_init()完成ARP的初始化工作,初始化ARP首部、入口地址等。uip_arp_timer()完成动态映射表的老化功能,这个函数每10 s被调用一次,若动态映射表里的映射关系在连续20 min内没有发生变化,则其映射将失效。uip_arp_update()完成动态映射表的更新功能。void uip_arp_arpin()对接收到的ARP分组进行处理。uip_arp_out()完成ARP请求的自动发送功能,它是在即将发送一个IP分组前被调用。
2.3.2 IP协议
 IP协议由ip_recv和ip_send两个函数段来实现。ip_send函数段完成IP数据包的发送功能,接收上层协议传送过来的数据包加上IP首部进行封装,然后设置srcipaddr、destipaddr、proto及ipchksum,最后交给下层协议处理好发送;ip_recv函数段完成IP数据包的接收功能,当收到数据包时首先判断其vhl、length、destipaddr及ipchksum是否正确,然后根据IP报文首部的类型码将该数据包交给相应的上层协议处理。
2.3.3 ICMP协议
 ICMP协议主要由标志段icmp_input实现。ICMP协议在实现时比较简单,具体操作是将ICMP的报文字段从回送类型变成回送应答类型,再另外计算checksum并修改checksum字段。
2.3.4 UDP协议
 UDP协议主要由函数udpfound和udpsend两个标志段实现。udpfound函数段负责处理收到的UDP数据,包括取出源IP地址、目的地址和源端口,并判断它的端口号和校验和是否都正确,如果正确再获取目的端口,调用应用程序对接收到的数据包进行相应处理,否则丢弃。udpsend函数段完成UDP数据包的发送功能,如果接收到来自应用程序的数据,而这时又有数据要发送,那么首先分配空间给待发送的数据,然后拷贝数据到UDP数据包的数据部分,并对UDP首部各个字段对应的源端口号和目的端口号进行设置,最后再调用ip_send函数将欲发送的数据交给IP协议发送。
3 系统仿真
 利用计算机进行仿真时,在uIP协议栈中,将目标机(也就是开发板)的IP地址设置成129.27.137.103,区别于PC的129.27.137.104,即构成局域网使得它们能在同一个网段内进行通信。假设已经建立了一条成功的通信链路,这时应该出现当服务器发出命令,目标机立即会给出回应这样的结果。DOS操作系统下ICMP测试图如图5所示。从图5中可以得知,发送的4个ICMP数据包均得到了回应,其中最长的回应时间为18 ms,最短的回应时间不到1 ms,平均回应时间为10 ms。这时说明开发板与计算机建立了一条可靠的连接,ping通信成功,为系统各功能的实现,提供了可靠的基础。

 本文利用计算机进行了仿真测试,完成了DSP与PC的ping通信,实现了基于DSP的嵌入式系统接入以太网的功能。但仍需解决的问题是,由于UDP协议不可靠、面向无连接,难免会出现数据包乱序到达、数据包丢失的现象。因此针对这些现象可以对数据进行一些处理,如对每一组数据进行顺序标记,这样可以在应用层发现数据的丢失和乱序,从而予以更正;在数据包前后加一校验码保证接收数据正确等,这将在后续工作中讨论。
参考文献
[1] 王采莲,郭志强.嵌入式TCP/IP协议栈在指挥网络中的实现[C].AECC专题学术研讨会论文集,2007,20(5):162-163.
[2] TI.TMS320VC5510AI DataSheet[Z].2004.
[3] Cirrus Logic. CS8900A Product Data Sheet[EB/OL]. [2007-08-01]http://www.cirrus.corn.
[4] 岳世为,尹为民.uIP协议栈在基于DSP以太网通信系统中的应用[J].计算机与数字工程,2010,38(1):187.
[5] DUNKELS A. The uIP Embedded TCP/IP Stack[EB/OL]. [2006-06-01]http://www.Sics.se.
[6] [阿根廷]Scaglia Sergio.嵌入式Internet TCP/IP基础、实现及应用[M].潘琢金,徐蕾,拱长青,等,译.北京:北京航空航天大学出版社,2008.

此内容为AET网站原创,未经授权禁止转载。