NDK的DSP网络通信技术探讨

NDK的DSP网络通信技术探讨

摘要:针对TMS320C6678DSP的嵌入式网络实现方案,对该DSP的网络控制模块和NDK进行了深入地研究与分析,实现了SYS/BIOS系统下NDK组件的初始化及配置。并以PC与DSP之间网络通信为例,介绍了PC端Winsock与DSP的NDK开发流程,通过PC与DSP的网络通信数据传输的测试,分析了影响网络通信速率的几个因素。实验结果表明,使用NDK提供的组件,可以方便快捷地实现网络应用开发。

关键词:嵌入式系统;TCP/IP协议;数字信号处理器(DSP);网络开发包(NDK)

网络通信作为一种有效的通信方式,在DSP应用开发中占据越来越重要的地位。从DSP设备实时获取监控或测量的数据、向DSP设备发送命令控制其采取适当的处理行为等,都需要网络通信的支持。随着嵌入式网络通信技术研究与应用越来越广泛,网络通信处理技术越来越成熟。TI公司推出了TCP/IP协议栈。此协议栈与TI网络开发工具包NDK(NetworkDeveloper'sKit)结合在一起使用。NDK是一个基于SYS/BIOS实时操作系统的网络协议栈,目前主要用于开发和验证TIC6000系列和ARM系列嵌入式处理器的网络应用功能。包含在NDK版中的代码是通用的C代码。NDK栈作为一个快速的原型平台为开发网络和包处理程序提供服务。它能用于向已经存在的应用程序中添加网络连接,以支持网络的通信、配置和控制。基于SYS/BIOS的网络开发组件,提供网络协议栈的支持,提供基本网络服务开发的接口,简化了DSP网络应用程序的开发[1]。NDK仅用200~250K的程序空间和95K的数据空间即可支持常规的TCP/IP服务,包括应用层的TELNET、DHCP和HTTP等协议,可使基于数字信号处理技术的因特网终端的网络连接成本大大降低。因此,NDK很适合目前的嵌入式系统硬件环境,是实现DSP网络开发的重要支撑工具。

1NDK的功能架构

如图1所示,NDK主要由5个库组成,分别是硬件抽象库(hal.lib)、网络控制库(netctrl.lib)、网络工具库(nettool.lib)、操作系统库(os.lib)和协议栈库(stack.lib)。(1)硬件抽象库HAL将具体的底层硬件抽象为一个硬件抽象层与NDK隔离,主要负责管理与网络相关的硬件资源,为NDK提供一组编程接口。包含硬件外设到NDK的接口,例如,计时器、LED指示灯、以太网设备和串口等。(2)网络工具库NETTOOL库中包含了NDK提供的所有基于网络服务的套接字,以及一些用于网络应用程序开发的工具。在网络工具库中最常用的组件是基于标签的配置系统,它几乎控制栈及其服务的每个方面[2]。(3)操作系统库将DSP/BIOS操作系统的功能抽象为一个操作系统适配层与NDK隔离,将某些抽象的操作系统调用映射到SYS/BIOS函数调用。这个适应层允许SYS/BIOS系统程序员将NDK系统调整到任何基于SYS/BIOS的操作系统中。(4)协议栈库主要是TCP/IP协议栈,它包含以太网和点到点协议顶层套接字层的所有内容。TCP/IP协议栈是主要的TCP/IP网络功能库,该库构建在SYS/BIOS操作系统之上,实现了从上层套接字到底层链路层的所有功能。STACK库是基于SYS/BIOS编译的,能充分利用SYS/BIOS操作系统,在平台间迁移时不需要移植。(5)网络控制库NETCTRL是协议栈配置、初始化和事件调度的核心,它控制TCP/IP与外部的交互。在所有的协议栈模块中,它对NDK的操作时最重要,其功能:a)负责NDK的初始化和底层设备驱动;b)通过配置服务回调函数启动和维护系统配置;c)向底层设备驱动提供接口,同时调度驱动事件;d)在退出时卸载系统配置和清理驱动。

2NDK协议栈的配置和初始化

NDK协议栈初始化的基本过程:(1)运行StackThreadBegin(Global.stackBe-ginHook)挂钩函数。注意在这个挂钩函数中,任何与NDK相关的代码都不能运行,因为NC_Syste-mOpen()函数还没有运行。(2)用初始化函数对操作系统环境进行初始化:NC_SystemOpen(Priority,OpMode),它的两个参数Priority和OpMode分别决定网络事件调度器在SYS/BIOS线程中的优先级和操作模式。这个函数必须在NDK相关的函数被调用之前调用。(3)通过CfgNew()创建一个新的配置。一旦创建了配置句柄,就可以将配置信息装载到句柄中,既可以整体装载,也可以采用一次一个条目的形式进行装载。(4)通过配置函数API的调用构建新配置或加载一个原来存在的配置:CfgLoad()/CfgAddEntry(),两者的区别在于整体装载还是逐一进行装载,装载的参数包括:网络主机名,IP地址和子网掩码,默认路由的IP地址,需要执行的服务(例如:DHCP、DNS和HTTP),命名服务器的IP地址,协议栈的属性(例如:IP路由、套接字缓存大小等)。(5)通过调用NC_NetStart()函数,用上面的配置启动协议栈。该函数由四个参数:配置句柄、指向开始函数的指针、指向结束函数的指针和指向IP地址时间的函数。开始函数和结束函数只被调用一次,开始函数在初始化结束后准备执行网络应用程序时调用,IP地址事件函数允许被多次调用,NC_NetStart()函数直到协议栈绘会话终止才返回。(6)在一些初步的初始化后,NC_NetStart()函数创建一个新的线程,这个新的线程会调用生成的NetworkOpen()函数。NetworkOpen()函数根据网络需求创建网络任务线程。(7)在正常操作下,协议栈直到函数NC_Net-Stop()被调用才会关闭。(8)当NC_NetStart()返回且会话结束后,调用Cfg_Free()释放配置句柄。(9)当所有资源释放后,调用NC_System-Close完成系统关闭操作[3]。NDK的初始化流程如图2所示。

3NDK与PC通信测试的实现

PC与DSP的网络通信是经常使用的场景之一,采用C/S的网络开发架构,基于socket进行PC与DSP通信的程序设计,PC端作为server,DSP端作为client,在DSP端发送数据,PC端收到数据后不作任何处理,把接收到的数据回传给DSP,在DSP端统计往返时间及误码率。程序流程图如图3所示。这里采集100次往返时间进行统计分析,DSP端发送接收缓冲区默认设置8192字节。这里从PC操作系统的CPU负载情况进行测试分析,CPU占用率70%时的通信速率统计结果如图4、图5所示。为了测试PC操作系统CPU占用率比较低的情况下的网络通信速率,将与测试无关的进程关闭,减轻CPU的负载。PC操作系统CPU占用率为10%的通信速率统计情况如图6、图7所示。从图4到图7可以看出:在Windows系统占用率低的时候,通信时间的波动确实减小,往返时间也相应的减少了。通信往返时间受PC端影响较大,因为Windows是非实时系统,在消息处理上有其内在的机制。DSP端是实时系统,所以延迟小,响应快。另外,对数据进行校验误码率为零。另外在测试中关闭了Nagle算法与关闭前进行数据对比分析,发现关闭Nagle并不能减少太多时间。对于socket还有其他设置选项如发送缓冲区大小,接收缓冲区大小以及重传超时时间设置等,可以根据具体的应用进行相关的设置,提高网络通信效率。

4结束语

通过NDK对TCP/IP协议栈进行初始化和配置,实现了PC与DSP的网络通信,完成了数据网络通信工作,测试研究表明NDK开发套件使用方便,性能优良可靠,可以最大限度地节省开发时间和成本,是嵌入式DSP网络开发的首选。

参考文献:

[1]张枫.基于NDK的DSP网络接口移植开发设计[J].网络与通信,2013(3):45-47.

[2]梁迅.基于NDK的DSP网络编程[J].计算技术与自动化,2005(3):79-82.

作者:郑佳晶 高荣荣 单位:中国电子科技集团公司第四十五研究所