基于ND K的DSP网络通信技术研究
2021-12-02郑佳晶高荣荣
郑佳晶,高荣荣
(中国电子科技集团公司第四十五研究所,北京100176)
网络通信作为一种有效的通信方式,在DSP应用开发中占据越来越重要的地位。从DSP设备实时获取监控或测量的数据、向DSP设备发送命令控制其采取适当的处理行为等,都需要网络通信的支持。随着嵌入式网络通信技术研究与应用越来越广泛,网络通信处理技术越来越成熟。TI公司推出了TCP/IP协议栈。此协议栈与TI网络开发工具包NDK(Network Developer's Kit)结合在一起使用。NDK是一个基于SYS/BIOS实时操作系统的网络协议栈,目前主要用于开发和验证TI C6000系列和ARM系列嵌入式处理器的网络应用功能。包含在NDK发布版中的代码是通用的C代码。NDK栈作为一个快速的原型平台为开发网络和包处理程序提供服务。它能用于向已经存在的应用程序中添加网络连接,以支持网络的通信、配置和控制。基于SYS/BIOS的网络开发组件,提供网络协议栈的支持,提供基本网络服务开发的接口,简化了DSP网络应用程序的开发[1]。
NDK仅用200~250K的程序空间和95K的数据空间即可支持常规的TCP/IP服务,包括应用层的TELNET、DHCP和HTTP等协议,可使基于数字信号处理技术的因特网终端的网络连接成本大大降低。因此,NDK很适合目前的嵌入式系统硬件环境,是实现DSP网络开发的重要支撑工具。
1 NDK的功能架构
如图1所示,NDK主要由5个库组成,分别是硬件抽象库(hal.lib)、网络控制库(netctrl.lib)、网络工具库(nettool.lib)、操作系统库(os.lib)和协议栈库(stack.lib)。
图1 协议栈控制流
(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)在退出时卸载系统配置和清理驱动。
2 NDK协议栈的配置和初始化
NDK协议栈初始化的基本过程:
(1)运行Stack Thread Begin(Global.stackBeginHook)挂钩函数。注意在这个挂钩函数中,任何与NDK相关的代码都不能运行,因为NC_SystemOpen()函数还没有运行。
(2)用初始化函数对操作系统环境进行初始化:NC_SystemOpen(Prio rity,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所示。
图2 NDK初始化流程图
3 NDK与PC通信测试的实现
PC与DSP的网络通信是经常使用的场景之一,采用C/S的网络开发架构,基于socket进行PC与DSP通信的程序设计,PC端作为server,DSP端作为client,在DSP端发送数据,PC端收到数据后不作任何处理,把接收到的数据回传给DSP,在DSP端统计往返时间及误码率。程序流程图如图3所示。
图3 PC与DSP通信流程图
这里采集100次往返时间进行统计分析,DSP端发送接收缓冲区默认设置8192字节。这里从PC操作系统的CPU负载情况进行测试分析,CPU占用率70%时的通信速率统计结果如图4、图5所示。
图5 CPU占用率70%时网络波动
为了测试PC操作系统CPU占用率比较低的情况下的网络通信速率,将与测试无关的进程关闭,减轻CPU的负载。PC操作系统CPU占用率为10%的通信速率统计情况如图6、图7所示。
图6 CPU使用率10%时数值统计
从图4到图7可以看出:在Windows系统占用率低的时候,通信时间的波动确实减小,往返时间也相应的减少了。通信往返时间受PC端影响较大,因为Windows是非实时系统,在消息处理上有其内在的机制。DSP端是实时系统,所以延迟小,响应快。另外,对数据进行校验误码率为零。
图4 CPU使用率70%时数值统计
图7 CPU使用率10%时数值统计与波动分析
另外在测试中关闭了Nagle算法与关闭前进行数据对比分析,发现关闭Nagle并不能减少太多时间。对于socket还有其他设置选项如发送缓冲区大小,接收缓冲区大小以及重传超时时间设置等,可以根据具体的应用进行相关的设置,提高网络通信效率。
4 结束语
通过NDK对TCP/IP协议栈进行初始化和配置,实现了PC与DSP的网络通信,完成了数据网络通信工作,测试研究表明NDK开发套件使用方便,性能优良可靠,可以最大限度地节省开发时间和成本,是嵌入式DSP网络开发的首选。