TI C6000DSP上TCP/IP协议栈的实现
摘要:针对TIC6000系列DSP网络开发工具NDK进行研究,结合TMS320DM642芯片详细描述了NDK的结构,讲述了利用NDK开发DSP网络应用程序的一般过程和实际应用中要注意的问题,并给出了NDK网络性能的测试分析,对于开发基于DSP的网络程序具有一定的指导作用。
关键词:DSP;TMS320DM642;NDK;TCP/IP
中图分类号:TP393文献标识码:A**编号:1009-3044(2007)03-10688-02
1 引言
随着互联网不断发展,在嵌入式设备上进行网络通信成为热门研究对象。TI的C6000系列芯片是面向多媒体数据处理的高端芯片,在视频图像处理领域应用广泛,尤其是TMS320DM642处理器,主频高达600MHz,片上集成以太网接口,不仅在硬件上将嵌入式产品的网络应用成本减少50%,而且结合其推出的NDK网络开发工具在软件上可以快速地开发出网络应用程序,缩短产品开发周期,而且其性能不比一般的网络芯片逊色。
2 NDK的结构
TI公司结合C6000芯片推出了TCP/IP NDK(Network Developer's Kit)开发套件,其主要组件包括:(1)支持TCP/IP协议栈程序库。其中主要包含的库有:支持TCP/IP网络工具的库,支持TCP/IP协议栈与DSP/BIOS平台的库,网络控制以及线程调度的库。(2)示范程序。其中主要包括DHCP/Telnet客户端,HTTP数据服务器示范。(3)支持文档。包括用户手册、程序员手册和平台适应手册。NDK采用紧凑的设计方法,实现了用较少的资源耗费来支持TCP/IP。从实用效果来看,NDK仅用200-250K程序空间和95K数据空间即可支持常规的TCP/IP服务。
使用NDK相对于操作系统和底层硬件是透明的,这主要是由OS.LIB提供与操作系统DSP/BIOS的接口和HAL.LIB提供对硬件的支持来完成的。在NDK的TCP/IP协议栈中STACK.LIB包括了顶层套接字到底层链路层的所有功能,NETCTRL.LIB 在整个协议栈中起关键作用,协调操作系统和底层硬件驱动,管理所有网络事件,NETTOOL.LIB提供配置网络的各种服务。
3 NDK在DSP/BIOS下的使用
DSP/BIOS是TI开发的实时微型操作系统,支持实时分析、线程管理、调度软件中断、周期函数以及外部硬件中断与各种外设的管理。使用DSP/BIOS所有与硬件有关的操作都必须借助操作系统本身提供的函数完成,应避免直接控制硬件资源。基于DSP/BIOS的程序与传统开发过程是不同的,用户编写的程序由DSP/BIOS调度,不再按标写的次序顺序执行。同样开发基于DSP/BIOS的网络应用程序也必须要遵循一些原则。
在DSP/BIOS下使用NDK必须注意以下几点: (1)必须在CDB文件中为HAL创建一个周期为100ms的PRD函数,用来驱动llTimerTick()系统函数;(2)OS需要钩子函数为TCP/IP堆栈加载和保存私人变量指针,所以必须在CDB文件中创建两个钩子函数NDK_hookInit()和NDK_hookCreate();(3)必须把工程项目的Include Searching Path指向NDK安装目录下的inc文件夹;(4)为了保证使用NDK的工程项目能正确编译,在CCS的Link Order要按一定的顺序添加库文件,推荐的顺序是:NETCTRL.LIB、HAL_xxxLIB、STACK.LIB、OS.LIB;(5)在使用NDK的过程当中,OS和HAL会创建三个内存段,分别是PACKETMEM、MMBUFFER、OBJMEM,必须在CMD文件中为这三个段在内存中分配存储空间;(6)至少要使用32K的cache,否则应用程序会产生不可预料的错误。
4 TCP/IP堆栈的初始化和配置
在任何SOCKET应用程序建立之前,TCP/IP堆栈必须被正确的配置然后初始化。通常可以动态创建或者在DSP/BIOS中静态创建一个堆栈初始化任务,不管应用程序当中建立了多少SOCKET,在整个系统中只能有一个堆栈初始化任务,并且该任务会成为整个网络任务的唯一调度者,因此该任务在应用程序结束前不会返回。
堆栈初始化过程:(1)使用NC_SystemOpen()。该函数为所有网络应用程序建立堆栈和内存环境;(2)使用CfgNew()。该函数会创建一个配置句柄,利用该句柄使用CfgAddEntry()函数可以添加DHCP、DNS、HTTP等服务和配置SOCKET缓冲区大小与ARP超时参数;(3)使用NC_NetStart()。该函数根据前面的配置参数启动网络,并创建三个回调函数,分别是网络启动时只运行一次的函数、网络被关闭时只运行一次的函数、当IP地址改变时运行的函数。通常会在启动函数里面创建自己的应用程序线程,在关闭函数里面删除创建的应用程序线程。
5 网络应用程序的开发
如果编程人员熟悉Windows平台的SOCKET的使用,那么在DSP平台上一样可以很容易的开发网络应用程序,甚至可以完全不需要了解硬件结构,因为NDK的API和Windows SOCKET API函数名和功能都是十分相近的。下面的程序采用DHCP协议动态获得IP,UDP协议传输数据,如下:
- //网络初始化
- NC_SystemOpen();
- hCfg = CfgNew();
- CfgAddEntry( hCfg,CFGTAG_SYSINFO,CFGITEM_DHCP_HOS
- TNAME,0,strlen(HostName),(UINT8 *)HostName,0);
- ……
- //配置DHCP协议动态获得IP
- CI_SERVICE_DHCPC dhcpc;
- bzero(&dhcpc, sizeof(dhcpc));
- dhcpc.cisargs.Mode = CIS_**_IFIDXVALID;
- dhcpc.cisargs.IfIdx = 1;
- dhcpc.cisargs.pCbSrv = &ServiceReport;
- CfgAddEntry(hCfg,CFGTAG_SERVICE,CFGITEM_SERVICE_D
- HCPCLIENT,0,sizeof(dhcpc),(UINT8 *)&dhcpc,0);
- ……
- //配置SOCKET缓冲区大小
- rc = 8704;
- CfgAddEntry(hCfg,CFGTAG_IP,CFGITEM_IP_SOCKBUFMAX,
- CFG_ADDMODE_UNIQUE,sizeof(uint),(UINT8 *)&rc,0);
- //启动网络服务
- do
- {rc = NC_NetStart(hCfg,NetworkOpen,NetworkClose,NetworkIPA
- ddr);
- } while(rc > 0);
- ……
- //配置应用层协议,本程序采用UDP
- SOCKET s;
- struct sockaddr_in sin1;
- s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if(bind(s,(PSA) &sin1, sizeof(sin1)) < 0)
复制代码
本文原文
- {ConPrintf("failed bind (%d)/n",fdError());
- goto leave;}
- ……
- //向PC机传送码流
- sendto(s,pBuf,test,0,&sin1,sizeof(sin1))
- //防止发送过快,任务暂停8ms
- TaskSleep(8);
- ……
复制代码
根据实验每次向PC机传送码流最好不要超过1500字节,这是由网络最大传输单元决定的,对于1500字节以上的码流可以采取分割的方法分批传送,并且在每次传送之后调用任务暂停函数TaskSleep()可以有效防止丢帧。在DSP发送和接收数据的时候不要用printf()语句,该语句耗费太多的CPU时钟周期,容易引起系统死机的发生,可以用LOG_printf()代替。
6 NDK性能测试
测试NDK性能既有客观性又有主观性。客观性是因为使用标准的工具,并且结果可重现。主观性适应为实际测试要受到很多环境因素的影响,所以只能是性能的估计性测试。
影响NDK性能的主要因素有:
socket API:NDK既支持基于缓冲区的典型socket,也支持非拷贝的数据包socket,甚至非拷贝的直接接收的TCP数据流。性能随着所采用的策略而变化。
socket缓冲区:socket 缓冲区影响TCP发送和接收的窗口大小,并且决定每次发送数据流大小,这对网络性能有很大的影响。
CPU速度:在cache大小一定的情况下,网络性能随着CPU速度增加而线性提高。
CPU cache:cache的大小对网络性能有巨大的影响。
网络硬件设备:以太网硬件设计的好换直接影响DSP和网络接口的速度。
外部存储器(EMIF)接口:对于和DSP外部存储器接口相连的以太网设备,EMIF的速度对外部解码逻辑有额外的影响。
下面的测试由TI提供,测试既兼顾最佳的性能又考虑到应用的实际情况,比如socket缓冲区大小为8K,而不是32K或64K,因为这在嵌入式设备中是不切实际的。测试的过程是DSP执行低优先级的网络任务,PC机执行客户基准测试程序,然后与DSP不执行网络任务时CPU的负载情况做对比。
不同的cache大小对DM642网络性能有一定影响,实验中随着cache的减少,多余的片上RAM并没有被利用,socket缓冲大小是8760字节。
7 结束语
TI推出的NDK网络开发工具不仅可以使技术人员快速开发基于DSP的网络应用程序,而且具有十分可靠的性能,这使得C6000系列芯片完全可以胜任大数据量的视频网络传输的要求,是开发嵌入式网络视频设备的首选。
|