DSP

基于TI C6000的TCP/IP协议栈的研究与实现

2019-07-13 12:02发布

        本文来自:东北大学信息学院 李松  吴建华 《TI C6000DSP上TCP/IP协议栈的实现》 有适当删减。 摘要:针对TIC6000系列DSP网络开发工具NDK进行研究,结合TMS320DM642芯片详细描述了NDK的结构,讲述了利用NDK开发DSP网络应用程序的一般过程和实际应用中要注意的问题,并给出了NDK网络性能的测试析,对于开发基于DSP的网络程序具有一定的指导作用。
     
  1、引言 
   
  随着互联网不断发展,在嵌入式设备上进行网络通信成为热门研究对象。TI的C6000系列芯片是面向多媒体数据处理的高端芯片,在视频图像处理领域应用广泛,尤其是TMS320DM642处理器,主频高达600MHz,片上集成以太网接口,不仅在硬件上将嵌入式产品的网络应用成本减少50%,而且结合其推出的NDK网络开发工具在软件上可以快速地开发出网络应用程序,缩短产品开发周期,而且其性能不比一般的网络芯片逊 {MOD}。
   
  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_FLG_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系列芯片完全可以胜任大数据量的视频网络传输的要求,是开发嵌入式网络视频设备的首选。
        参考文献: 
  [1]Texas Instrument. TMS320C6000 Programmer's Guide (Rev. I). 
  [2]Texas Instrument. TMS320C6000 TCP/IP Network Developer's Kit. 
  [3]Texas Instrument. TMS320C6000 Platform Porting Guide. 
  [4]彭启琮, 管庆. DSP集成开发环境——CCS及DSP/BIOS的原理与应用[M]. 北京:电子工业出版社,2004.