摘要:搭建了一个基于DSP嵌入式系统的以太网接入硬件平台,给出了软件设计思路及具体实现方式,对开源的uIP合同栈进行剪裁和更改,完成了设备驱动程序的开发和嵌入式uIP合同栈的移植,最终实现了嵌入式系统接入以太网的功能,且其实现过程简单、成本较低。
关键词:DSP;uIP合同栈;接入以太网
近些年来,嵌入式技术发展迅速并在许多电子产品(如手持式、便携式)中都有广泛的应用[1],而嵌入式产品网路化是现今社会一股不可阻挡的研究新潮。嵌入式系统必须具有网路互连功能能够快速地与设备通讯,以太网是目前使用最广泛的局域网技术。因为有些嵌入式系统要求网路的实时性较高,因而本文使用精简TCP/IP合同栈——uIP合同栈来实现基于DSP的嵌入式系统以太网接入功能,下边详尽论述其设计与实现。
1系统硬件平台
TMS320C5000系列是16bit定点DSP,一般被应用在如VoIP以及IP电话网段等通讯领域中。基于DSP的嵌入式系统中选择的数字讯号处理芯片是TI公司的TMS320VC5510芯片,网卡芯片选择的是由CirrusLogic公司生产的CS8900AS芯片。系统硬件插口基本结布光如图1所示。
TMS320VC5510芯片是由TI公司生产的第一个基于定点TMS320320CC555555x核,具有低帧率、高性能的16bit数字讯号处理器[2]。CirrusLogic公司专门设计了以太网控制器CS89008900Alinux中文乱码,这款网卡芯片主要应用在对可靠性要求极高的工业控制领域中[3]。
2.1底层驱动程序的设计
本系统采用查询方法来完成CS89008900A芯片的软件编程控制工作。这一工作主要分为以下3个过程:
(1)首先是完成以太网控制芯片的初始化工作,由初始化函数ethernet_driver_init(void)来完成发送/接收配置寄存器的相关设置工作,如对CS89008900A进行软件复位、设置以太网插口参数以及设置以太网的硬件地址。
(2)若发送数据,则由数据发送函数ethernet_driver_write()先将发送命令写入CS89008900A的TxCMD寄存器中,其次在CS89008900A的Txlength寄存器中写入即将发送的数据帧宽度,接着检测BusStatus寄存器的PPD,待PPD处于空闲状态时即将发送的数据帧写入CS89008900A中,最后CS89008900A将手动决定数据帧以相应的报文按照TxCMD寄存器的设置向以太网上发送。
(3)若以太网接收到数据包,则由数据接收函数ethernet_driver_write()读取数据包,CS89008900A将按照接收配置寄存器的设置手动对接收的报文进行预处理。
2.2uIP合同栈的设计
由美国计算机科学大学的AdamDunkels开发的uIP合同栈是一种免费的、可实现的且十分小的TCP/IP合同栈,它是为8bit和16bit处理器专门设计的[5]。uIP合同栈是使用C语言编撰的,它移植上去便捷并且代码也相当简练。uIP合同栈除去了完整的TCP/IP中不常用的功能linux中tcp/ip协议实现及嵌入式应用,简化了通讯流程,占用的资源少linux中tcp/ip协议实现及嵌入式应用,处理速率快。
基于DSP的嵌入式系统uIP合同栈中,按照须要只实现了ARP、IP、ICMP、UDP合同。TCP提供面向联接的、可靠的、点对点的服务[6],但TCP开支大,传输速率慢;其实UDP是面向无联接的,因为UDP没有可靠性的保证机制,因而能以较快的速率进行数据通讯;UDP合同的开支很小,传输率比TCP高出好多,实时性更强,所以uIP合同中采用UDP合同作为运输层合同。该uIP合同栈的网路体系结构如图3所示。
2.3uIP合同栈的实现
uIP合同栈的实现主要集中在uip.c的源文件里,代码简约。图4所示为uIP整个系统的主程序流程图。在这个主程序流程图中,初始化工作是由底层硬件完成的,主要是对化学层的一些插口进行配置和绑定。uIP合同栈接收数据包的过程实际上就是对数据包进行解析,当网路驱动设备发送数据包过来时,首先读取数据包判定是IP包还是ARP包,倘若是ARP包,则进行ARP处理;若是IP包,则判定其下层合同是UDP合同还是ICMP合同,再分别对其进行处理。当有数据发送时linux启动盘制作工具,网路驱动设备的硬件将自行判断数据包而且完成数据包的封装工作。
2.3.1ARP合同
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()完成动态映射表的老化功能,这个函数每10s被调用一次,若动态映射表里的映射关系在连续20min内没有发生变化,则其映射将失效。uip_arp_update()完成动态映射表的更新功能。voiduip_arp_arpin()对接收到的ARP分组进行处理。uip_arp_out()完成ARP恳求的手动发送功能,它是在正式发送一个IP分组前被调用。
2.3.2IP合同
IP合同由ip_recv和ip_send两个函数段来实现。ip_send函数段完成IP数据包的发送功能,接收下层合同传送过来的数据包加上IP首部进行封装,之后设置srcipaddr、destipaddr、proto及ipchksum,最后交给上层合同处理好发送;ip_recv函数段完成IP数据包的接收功能,当收到数据包时首先判定其vhl、length、destipaddr及ipchksum是否正确,之后按照IP报文首部的类型码将该数据包交给相应的下层合同处理。
2.3.3ICMP合同
ICMP合同主要由标志段icmp_input实现。ICMP合同在实现时比较简单,具体操作是将ICMP的报文数组从回送类型弄成回送应答类型,再另外估算checksum并更改checksum数组。
2.3.4UDP合同
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数据包均得到了回应,其中最长的回应时间为18ms,最短的回应时间不到1ms,平均回应时间为10ms。这时说明开发板与计算机构建了一条可靠的联接,ping通讯成功,为系统各功能的实现,提供了可靠的基础。
本文借助计算机进行了仿真测试,完成了DSP与PC的ping通讯,实现了基于DSP的嵌入式系统接入以太网的功能。但仍需解决的问题是,因为UDP合同不可靠、面向无联接,难免会出现数据包正序抵达、数据包遗失的现象。因而针对那些现象可以对数据进行一些处理,如对每一组数据进行次序标记,这样可以在应用层发觉数据的遗失和正序,因而给以更正;在数据包前后加一校准码保证接收数据正确等,这将在后续工作中讨论。
参考文献
[1]王采菱,郭志强.嵌入式TCP/IP合同栈在指挥网路中的实现[C].AECC专题学术研讨会论文集,2007,20(5):162-163.
[2]TI.TMS320VC5510AIDataSheet[Z].2004.
[3]CirrusLogic.CS89008900AProductDataSheet[EB/OL].[2007-08-01]http://www.cirrus.corn.
[4]岳世为,尹为民.uIP合同栈在基于DSP以太网通讯系统中的应用[J].计算机与数字工程,2010,38(1):187.
[5]DUNKELSA.TheuIPEmbeddedTCP/IPStack[EB/OL].[2006-06-01]http://www.Sics.se.
[6][俄罗斯]ScagliaSergio.嵌入式InternetTCP/IP基础、实现及应用[M].潘琢金,徐蕾,拱长青,等,译.上海:上海民航航天学院出版社,2008.