【TI DSP分享季】TI C6000DSP上TCP/IP协议栈的实现

2019-07-22 17:25发布

摘要:针对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网络开发工具在软件上可以快速地开发出网络应用程序,缩短产品开发周期,而且其性能不比一般的网络芯片逊 {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_**_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.
  本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。