一种改进的基于NDK的DSP服务器端程序设计与实现
2016-11-17王星宇丁兴军
王星宇,丁兴军
(中国船舶重工集团公司第723研究所,扬州225001)
一种改进的基于NDK的DSP服务器端程序设计与实现
王星宇,丁兴军
(中国船舶重工集团公司第723研究所,扬州225001)
随着网络开发工具包(NDK)广泛地应用于TMS320 C6000系列数字信号处理(DSP)平台的网络,基于NDK的DSP程序编程越来越重要,传统DSP服务器端程序已不能很好地适应多客户端、大数据量的网络交互平台。提出了一种改进的程序设计来解决这一问题,先介绍了NDK的结构以及构成和相应的DSP/BIOS配置,然后阐述了基于NDK平台DSP服务器端程序传统方法设计与实现及其不足,提出了其改进型的程序设计与实现,最后给出了在TMS320C6455 DSP下2种方法的实验结果,证明改进型的程序设计是合理有效的。
数字信号处理;传输控制协议/互连网协议;网络开发工具包
0 引 言
随着网络化、信息化的高速发展和应用,在嵌入式设备上进行组网,应用网络通信成为热门研究对象[1]。TI的C6000系列芯片是面向大规模数据处理的高端数字信号处理(DSP)芯片,结合其推出的网络开发包(NDK),开发出相应的网络端程序,可以进行多个嵌入式平台之间的网络数据交互。基于NDK下传统的DSP服务器端程序,在多客户端任务环境系统中,会出现运行不稳定,甚至堆栈溢出、程序崩溃等问题,本文提出了一种改进型的程序设计,更能适应多客户端、多任务系统环境下的网络数据交互应用。
1 NDK介绍
NDK是TI公司为了配合其推出的TMS320C6000系列DSP的传输控制协议/互连网协议(TCP/IP)栈[2-3]而开发的新型网络开发工具包, 其设计目的是要提供一个完整的TCP/IP。NDK采用紧凑的设计方法, 实现了用较少的资源耗费支持TCP/IP, 且仅用200~250 kB的程序空间和95 kB的数据空间即可支持常规的TCP/IP服务,被广泛地应用于DSP网络开发。正确使用NDK,需要了解3个方面:结构组成、TCP/IP下的配置和DSP/BIOS配置。
1.1 NDK结构
NDK结构主要由5个功能模块组成[1],对应的函数库分别为OS.LIB,HAL.LIB,STACK.LIB,NETTOOL.LIB 和NETCTRL.LIB。其详细结构示意如图1所示。
图1 NDK TCP/IP协议栈结构
NDK通过编程接口与本地操作系统(DSP/BIOS)和底层硬件相互隔离。其中本地操作系统(DSP/BIOS)被抽象成一个操作系统适应层(OS Adaptation Layer),也就是OS.LIB;底层硬件被抽象为一个硬件抽象层(Hardware Abstraction Layer),也就是HAL.LIB。网络工具库(Network Tools Library)也就是NETTOOL.LIB,主要包含了NDK提供的所有套接字的网络功能和开发工具。TCP/IP协议库所对应的是STACK.LIB,TCP/IP网络功能库,包含所有有关TCP/IP协议下的套接字接口层到链路层的功能。网络调度控制(Network Scheduler)对应的是NETCTRL.LIB,从示意图看,它是整个结构的核心,在整个协议栈中起关键作用,协调操作系统,管理硬件驱动和整个网络事件。网络应用程序(Network Application),也就是基于NDK架构下,顶层的网络应用端程序层,通过API函数库开发工程所需的应用程序。下面介绍的2种服务器端程序就是属于这一类网络应用程序。
1.2 NDK下的TCP/IP协议栈的配置和使用
在编写一个网络任务程序之前,TCP/IP协议栈必须正确地配置和初始化。图2是典型的配置TCP/IP协议栈的一个流程。
图2 典型的NDK下TCP/IPX协议栈配置流程
图2中的基本步骤为:首先调用NETCTRL.LIB下的NC_SystemOpen库函数[2],配置一个新的操作系统,建立配置项hCfg,并将要设置的网络IP地址、子网掩码、域名、网关信息等导入新建的配置项中。接下来调用NC_NetStart(hCfg, NetworkOpen, NetworkClose, NetworkIPAddr )来启动开发的网络端应用程序,NetworkOpen就是网络端应用开发程序入口函数名,NC_NetStart启动后,网络程序任务的创建都在此函数下被调用。NetworkClose 函数是在网络结束的时候被调用。NetworkIPAddr 函数是IP地址事件函数,当本地IP地址被系统调用或被删除时都会被调用。最后当网络结束时,调用CfgFree和NC_SystemClose来删除网络配置,并关闭操作系统。
1.3 NDK下的DSP/BIOS配置
DSP/BIOS是TI开发的实时操作系统。支持实时分析、线程管理、调度软件中断和外部硬件中断,用户编写的开发程序都由DSP/BIOS调度。而DSP/BIOS本身并没有包括和支持NDK,NDK如果要运行在操作系统上,必须得到DSP/BIOS操作系统的支持,需要调整DSP/BIOS的2个基本配置[3]:
(1) 定时器设置
NDK需要DSP/BIOS提供一个时钟驱动模块,产生100 ms的定时驱动,提供给NDK硬件抽象层作为定时中断器和时间驱动。而这个时钟驱动模块PRD,对应的时间驱动函数llTimerTick(),需要在DSP/BIOS下的tcf文件里设置,具体如图3所示,在PRD模块下面建立一个prdNdk的任务,函数名为llTimerTick,将其属性里定时周期period设为100 ms。
图3 DSP/BIOS 定时器设置
(2) HOOK环境变量设置
HOOK为TCP/IP协议栈设置保存的空间。OS层的任务调度模块需要调用HOOK来保存和调用TCP/IP协议栈的环境变量指针,需要在DSP/BIOS下的tcf文件里设置,具体如图4所示,在System下面的HOOK模块里建立hookNdk任务,在其属性里创建2个钩子函数NDK_hookInit()和NDK_hookCreate()。
图4 DSP/BIOS HOOK环境变量设置
2 传统方法下的服务器端程序设计流程及不足
传统的服务器端程序设计是在NDK结构顶层(图1)Network Application下进行编程,流程如下:
(1) 在NetworkOpen下建立一个dtask_TcpServer服务器程序任务;
(2) 调用fdOpenSession(),初始化文件向量;
(3) 建立socket套接字;
(4) 设置与客户端的通信端口;
(5) 绑定并监听端口;
(6) 启用阻塞式函数accept(),来创建针对客户端的任务,一个客户端对应一个任务;
(7) 服务器端和客户端网络信息的交互都在对应的客户端任务中编程实现;
(8) 当网络异常或连接中断,则需要调用fdclose(),关闭服务器端socket,执行fdCloseSession(),关闭文件变量系统,释放内存,最后退出dtask_TcpServer()服务器端程序任务。
图5 传统服务器端设计流程
传统服务器端程序的不足在于,当使用accept()阻塞式函数开启对客户端的连接任务时(图5),对于单个网络客户端系统,能够稳定运行,但对于多网络客户端系统或者多任务、多线程系统时,再进行大数据量交互或者多任务切换时,频繁地调用阻塞式函数带来了各个任务的空间分配单元错误和堆栈溢出,导致程序崩溃。
3 改进型的服务器端程序设计
传统服务器端程序设计对堆栈的设置需求非常高,一旦有多客户端连接服务器或者大数据量信号处理的多线程任务处理,就会造成网络性能下降、堆栈溢出、服务器端程序崩溃现象。面对目前日益增长的互联网需求以及复杂和大数据量信号处理的网络数据量增加,NDK下传统服务器端的程序设计已越来越不满足要求,对其改进的需求也越来越多。下面介绍一种改进的服务器端设计方法(见图6)。相对于传统服务器端编程设计,其利用fdselect()来创建与客户端的连接:
图6 改进型服务器端程序设计流程
(1) 改进型的服务器端程序任务和传统服务器程序设置任务一样在NetworkOpen下建立,但是当建立与多客户端连接的服务器端程序系统时,多客户端的网络数据交互任务也直接在NetworkOpen下建立。
(2) 多客户端任务里,每一个程序任务的设计除了客户端IP地址和端口号不一样,其他的网络编程顺序是一样的。首先调用fdOpenSession(),初始化文件向量。
(3) 建立socket套接字。
(4) 设置与客户端的通信端口,即IP地址和端口号。
(5) 绑定并监听端口。
和传统设计不一样,使用NDK下的fdselect()函数,来检测由fdOpenSession创建的文件向量描述符。它也是阻塞式函数,将任务暂时挂起,监听文件向量描述符里出现的任何活动,fdselect()只是检测文件向量描述符,确定连接后,直接使用accept()建立与客户端连接,消耗很少的CPU资源;而不像直接调用accept()需要消耗任务进程所需要的系统资源去实现,这样能更好地节省堆栈空间。具体实现如下:
(1) 在调用fdselect()前,需要用FD_ZERO函数对文件向量描述符初始化,分别调用FD_ZERO(&ibits),FD_ZERO(obits) FD_ZERO(&xbits)来清除文件向量描述符里的读记录标志、写记录标志和特殊条件的记录标志。
(2) 使用FD_SET,将socket文件向量描述符添加到文件读记录里。
(3) 使用阻塞式fdselect(),来判断文件向量描述符里有没有新的事件或者读写数据发生。
(4) 当fdSelect()返回的值Value大于0,判断客户端有数据量产生时,使用FD_ISSET()再次确认这个数据是否来自要连接的客户端。确认之后,调用accept()与客户端建立连接,开始收发客户端的数据。
(7) 上一步骤中,如果出现网络异常或网络中断,则需要调用fdclose(),关闭socket套接字,执行fdCloseSession(),关闭文件变量系统,释放内存,最后运行TSK_exit(),退出dtask_Server_ClientN()服务器端程序任务。
4 实验结果分析
为了对比测试传统方法和改进后的方法针对单客户端和多客户端的运行效果,测试选用TI的TMSC6455DSP[4]信号处理评估模块(EVM)和3台PC机组成网络,作为系统收发仿真环境,首先在EVM上建立服务器,并用1台PC机模拟客户端,与之建立连接形成服务器对单客户端任务系统。服务器端IP地址设为192.9.200.29,端口号为5 000;PC机客户端IP地址设为192.9.200.101,端口号为5 000,用PC端网络调试助手进行大数据量的网络收发测试。在传统型和改进型的2种方法下,收发数据包都很稳定,客户端断网重新连接测试也很正常。图7是在CCS3.3环境下的测试结果图。
图7 单客户端任务系统下测试结果图
然后,利用EVM板和3台PC机组成服务器对多客户端任务系统做网络收发测试。服务器IP端地址依旧设为192.9.200.29,端口号为5 000,对应的3台PC机客户端IP地址为192.9.200.101、192.9.200.102、192.9.200.103,端口号也为5 000。用PC端网络调试助手进行大数据量的网络数据收发测试。
使用改进型设计的服务端程序在对多客户端任务系统下,运行正常,进行大量的收发数据和重连测试也一切正常,测试图如图8所示。
图8 多客户端环境下改进型设计运行测试图
使用传统型设计的服务端程序在对多客户端任务系统下,经过大量收发数据和断网重连测试,运行一段时间后,出现了错误,见图9。程序出现Buffer OOM错误,OOM SBNEW 是一个分配内存函数,在stack.lib的sb.c文件里实现,SBNew:Buffer OOM 意味着分配内存不成功,也就是堆栈溢出,程序跑飞。
图9 多客户端环境下传统型设计运行测试图
通过对比测试,可以明显看出传统服务器端程序在多客户端任务环境系统里运行不太稳定,对系统stack和heap资源设置要求比较高,当有其他更高优先级的任务时,需要消耗的系统资源就更多,不太适应高密度数据量、多任务系统环境下的网络数据交互,而改进型的服务器程序设计通过NDK下检测文件向量描述符里的活动事件,有活动事件产生才去响应网络数据量的交互,极大地节省了堆栈资源和heap空间,更好地满足了现代实际工程中的网络应用。
5 结束语
随着DSP芯片在现代工程中被广泛应用,DSP下的网络技术就显得尤为重要。现在越来越多的实际工程应用都需要多节点、多任务、多客户端、大数据量连接,以往传统服务器端的程序设计已不满足这种复杂的环境。本文利用改进的程序设计很好地解决了这一问题,为DSP设备在更多的场景下更好地利用网络提供了广阔的前景。
[1] 甘泉.基于DSP/BIOS的千兆以太网研究与实现[J].军事通信技术,2011,32(1):82-85.
[2] 刘海峰.基于DSP的TCP/IP协议的应用研究[J].微电子学与计算机,2006(2):78-79.
[3] 李明,康静秋,贾志平.嵌入式TCP/IP协议栈的研究与开发[J].计算机工程与应用,2002,38(16):118- 121.
An Improved Program Design and Realization of DSP Server-side Based on NDK
WANG Xing-yu,DING Xing-jun
(The 723 Institute of CSIC,Yangzhou 225001,China)
With the network developer's kit (NDK) is widely used for the network of TMS320 C6000 series digital signal processing (DSP) platform,the DSP programming based on NDK is more and more important.The traditional DSP server-side program is unable to adapt to the multi-client and large data volume interactive network platform.This paper proposes an improved program design method to solve this problem.This paper firstly introduces the structure & composition of NDK and corresponding DSP/BIOS configuration,then expatiates the design and realization shortages of traditional DSP server-side program method based on NDK platform,puts forward the program design and realization of the improved method,finally gives the experimental results of two methods under the condition of TMS320C6455 DSP,which proves that the improved program design is reasonable and effective.
digital signal processing;transmission control protocol/internet protocol;network developer's kit
2016-02-27
TP311.1
B
CN32-1413(2016)04-0099-06
10.16426/j.cnki.jcdzdk.2016.04.022