孙慧敏 彭文秀 张开生 陈尹翔
(西安电子工程研究所 西安 710100)
由于雷达系统与雷达信号处理算法技术革新的速度不断加快[1],实际应用中的雷达系统对信号处理的实时性、功耗等性能要求也越来越高。要实现一个稳定、实时性高的雷达信号处理平台,需要在雷达信号处理算法的每一步验证中仔细、严谨的重复导入导出数据,并与Matlab算法程序的运行结果反复进行对比验证。这需要在调试过程中花费大量的时间、精力、人力和物力。
因此,为了满足上述功能需求,本文在国产FT_M6678的DSP芯片上,实现了一种基于SYS/BIOS操作系统线程间通信以及网络通信的雷达信号处理系统。
为了在国产FT_M6678的DSP芯片上,实现基于操作系统和网络通信雷达信号处理系统的功能要求,本文的硬件系统框架的具体架构如图1所示。
图1 硬件架构设计
国产FT_M6678芯片是对标TI公司的TMS320C6678的一款高性能军用多核浮点DSP芯片,与TI_C6678指令集兼容[2]。该DSP芯片含有8个M66x内核,拥有数据处理能力高,片上接口资源丰富等特点。FT_M6678在本系统中作为主控制器,主要负责接收、处理和传输FPGA通过SRIO发送过来的雷达数据,并通过网络接口实现与PC机上的数据交互。
FPGA芯片是一款高性能、可编程资源丰富的芯片,在本文设计的硬件架构方案中主要完成雷达信号的采集、模数转换、数字下变频和雷达信号的脉冲压缩等功能,最后,把处理完成的数据传输给DSP芯片。
SYS/BIOS作为强实时操作系统,用于为应用程序提供实时的任务调度、同步和处理功能[3],提供了基于优先级的多线程创建和执行模块、信号量同步模块、硬件驱动模块以及实时的分析配置工具,其分为32个中断等级,0最低,31最高。
SYS/BIOS操作系统是基于实时组件软件平台,即RTSC,创建的,其提供了一套非常重要的内部处理器通信机制IPC,用于多核处理器内部处理核之间的通知。
SYS/BIOS提供的包如表1所示。每个包提供了一个或多个模块,每个模块又提供了使用该模块的API。
表1 SYS/BIOS提供的包
表2 任务分配
当需要用到SYS/BIOS操作系统时,BIOS模块会为其创建分配一个HeapMem实例[4],作为当前SYS/BIOS操作系统的默认heap。当程序执行时,运行函数Memory_alloc()的里面heap是空时,此系统创建的默认heap将会被自动使用。在多核使用过程中,操作系统内部会使用几个中断向量,分别是网络的7 、8 、9、 10号中断,同时,IPC自动占用5号中断,系统时钟占用14号中断。
大部分实时应用程序必须同时实现某些与当前程序看起来没有任何关系的功能,实际上是在响应外部事件,比如收取数据或者外部同步控制信号。实现这些功能函数叫线程。
在SYS/BIOS操作系统中,这个定义被解释成由CPU处理器执行的单一独立的指令流。线程主要有四种类型:硬件中断(Hwi)线程、软件中断(Swi)线程、任务(Task)线程、空闲(Idle)线程[5]。
在优先级上,硬件中断优先于软件中断,软件中断优先于任务[6]。硬件中断一般用于外部异步事件的紧急处理;软中断一般用于定时器和线程控制,经常用于关联执行频率比较低的应用任务或者响应时间要求跟硬件中断相比不是很高的处理程序;任务可以一直等待直到某些必要资源能够被使用再继续执行。
中断调度:当其他中断打断了当前执行的任务,系统则会使用堆栈来保存相关寄存器。任务的调度如图2所示。每个任务线程都有自己独立的堆栈,这样能够保证在高优先级程序执行完成后,正确精准地进入和执行较低优先级的线程。同时,中断调度程序还允许启用用户观察程序。
图2 任务的调度
硬件中断和软件中断:较高优先级的硬件中断执行完之后[7],系统的中断调度程序会马上唤醒软件中断,响应软件中断的子程序将收集到的外设中断信息进行处理;但当下个硬件中断响应时,软件中断会立即被抢断。软件中断处理事务以ms来计时,硬件中断处理事务以μs来计时。
信号量:用于协调一些处于竞争关系的任务之间对共享资源的访问。当某个事件没有被执行完成或者被发布时,信号量可以让任务处于挂起状态。在实际应用中,函数Semaphore_pend()用于等待信号量和任务的挂起,而函数Semaphore_post()用于发布信号量[8]。如果信号量计数大于0,函数Semaphore_pend()会减少信号量计数继续执行任务;否则,其会挂起任务直到信号量计数大于0。
事件:事件提供了线程间通信和同步的方法。事件实例可被“挂起”和“发布,如同信号量一样。不同的是,调用Event_pend()函数需要另外指定等待哪些事件,Event_post()函数的使用则需要指定发布哪些事件。硬件中断、软件中断和其他任务都可以调用Event_post()函数,但只有任务能调用Event_pend()函数。
邮箱是先进先出的队列,邮箱实例可以被多个线程读取和写入。当对邮箱进行写入时,邮箱模块把要传递的缓冲区里的内容复制到固定大小的内部缓冲区中。邮箱内部的缓冲区个数和大小必须在被系统创建时指定,在实际应用中邮箱发送和接收的所有缓冲区的大小必须与被创建时的指定的大小相同。
其中,Mailbox_post()函数表示向邮箱队列写数据,如果队列已满,则其返回0,挂起任务直到其可以被写入数据;Mailbox_pend()函数表示从队列中读取数据[9],如果当前邮箱队列为空,则返回0,无限等待,挂起读取任务直到队列有数据。
网络通信可以实现不同操作系统和不同硬件体系结构的信息交互。而实现SYS/BIOS操作系统以太网通信模块需要三个步骤:首先,需要实现底层硬件驱动程序,打通底层通信链路;其次,需要在DSP/BIOS操作系统平台上配置和运行NDK的协议栈,添加包含必要的相关库文件;最后才可以在平台开发、定制、封装用户可以使用的网络应用程序。
NDK套件的核心是TCP/IP协议栈,它也是一个分层的体系结构[10]。NDK网络模型中的NDK/EMAC层实现沿用了之前TCP/IP模型中的传输层、网络层、数据链路层的功能。
在编写实现嵌入式网络应用程序时,与一般的TCP/IP的实现流程不同,首先要在主函数中创建一个实现网络调度的总线程,这个线程作为网络入口程序,实现对协议栈进的配置和初始化,以及实现和完成所有网络控制活动。
在实际应用中,软件中断和任务一般用来实现系统的主要程序代码,硬件中断用来响应和实现与外部设备关联性特别强和对实时性要求特别高的功能模块程序代码。
在本文设计的雷达信号处理系统中,将跟外部GPIO关联的中断子程序代码模块注册为硬件中断线程[11],将雷达信号处理系统中的动目标检测(MTD)、动目标显示(MTI)、恒虚警检测(CFAR)、目标凝聚、旁瓣匿影、测角、目标合并、目标上报等雷达信号处理过程注册为任务。
在网络通信功能模块中,任务的实现采用客户端和服务器的模式,硬件板卡作为网络通信的服务器端,PC机作为客户端,两者都采用的是套接字编程。本文网络通信程序的流程如下:
首先,在主线程中创建一个网络后台进程任务,配置流程为:
1)调用NC_SystemOpen()并创建一个新的配置;
2)创建配置,并为创建的配置添加本地IP地址、子网掩码、域名字符串等;
3)创建并添加主机名hostname;
4)添加默认路由和网关;
5)通过调用NC_NetStart()函数启动配置的网络;
6) 在NC_NetStart()返回时,通过NC_SystemClose()函数释放并关闭配置的网络。
所有学员中除1例因怀孕待产未完成开题报告外,其余学员都完成各项考核指标,顺利通过答辩,按时毕业。各年度学员对首次个案完成时间、开题报告首次交付时间及毕业后1年内学员学术成果统计如下(结果统计时因怀孕未完成开题报告的学员未列在统计内)。具体结果见下表1,成果增长趋势见图1。
其次,在主线程创建一个网络连接和通信线程,实现流程如下:
1)调用fdOpenSession()函数,为网络连接任务分配文件环境;
2)初始化套接字,监听用户UDP协议连接请求;
3)初始化客户端的IP地址和端口号;
4)等待发送使能;
5)发送完成。
本文采用Qt creator软件和C++语言实现网络通信的客户端程序。实时显示脉压数据的软件工作流程如下:开始执行软件,点击连接1,可将客户端绑定到指定端口号,初始化成功后,当DSP发送数据过来时,会激励readyRead信号,调用相应的槽函数,用来处理通过网络传输过来的数据,先解析帧头,获取相关参数,再按照格式解析数据,并将数据添加到QLineSeries类对象里,最后实时显示到界面上。
图3所示为实时显示软件的工作流程图。图4所示为实时显示脉压数据的UI界面。
图3 实时显示软件工作流程图
图4 实时显示软件UI界面
将雷达信号处理过程中的调试数据保存成文件的工作流程如下:首先,开始执行软件,设置保存文件的路径和文件名,点击连接2按钮,客户端初始化成功,当服务器发送数据过来时,会自动保存成文件,接收完成后,点击断开2按钮,即可保存成文件。
点迹分析软件的流程图和UI界面分别如图5和图6所示。其工作流程如下:开始执行程序,点击点迹处理按钮,点击浏览按钮选择文件,在方位帧号选择中可以指定要看的帧号,点击加载数据按钮,即可显示当前的所有点迹,当鼠标放到任意点可显示点目标相关的距离单元,方位角等信息。在界面左下方可以设置一次显示历史帧的数量,点击点迹播放按钮可显示指定数量的帧的所有点迹。
图5 点迹分析软件流程图
图6 点迹分析软件UI界面
图6所示为,点迹分析界面同时显示6帧数据,将鼠标放置在任意点上方会显示当前帧的帧号和点目标个数以及当前点目标的相关信息。
网络通信模块的工作流程如图7所示。系统软件的总处理流程框架如图8所示。系统的数据流如图9所示。
图7 网络模块工作流程
图8 软件系统总处理流程
图9 系统处理数据流
系统软件的工作流程如下:系统上电后先执行复位函数表实现系统复位,后执行c_int00函数,初始化C语言执行环境,调用用户自定义的第一个回调函数EVM_init(),此函数初始化了一些时钟、DDR3等外部设备,运行相关模块的初始化函数,运行main函数,对系统的硬件及参数进行初始化。在主函数运行之后,整个启动的过程由SYS/BIOS系统监管,SYS/BIOS通过在主函数中调用的BIOS_start函数,系统开始启动运行,在BIOS_start函数运行之后,SYS/BIOS操作系统内核根据用户配置好的任务类型和优先级调度执行定义的各种任务。主要的初始化工作有:
1)Startup Functions启动startup相关的函数,运行用户提供的“startup functions”函数;
2)使能硬件中断;
3)启动定时器模块,根据用户实现的相关配置文件配置定时器模块;如果系统支持定时器,在此阶段配置所有的定时器使用用户指定的配置,如果定时器被配置为“自动模式”,那么就在此启动;
4)使能软件中断,用户通过配置文件中BIOS.swiEnabled语句设置软件中断模块的使能;
5)任务线程启动,用户通过配置文件中BIOS.taskEnabled语句设置线程模块的启动使能;
6)线程模块启动后,系统中的任务调度开始运行。
在系统运行结束后,与其相关的资源和初始化阶段占用的空间需要进行释放。释放过程中执行流程如下:
1)调用标准C函数中的exit函数,进行C相关环境的释放;
2)调用System提供的rtsExit函数,以后进先出的方式调用各模块的atexit函数。
本系统中最大的亮点为:系统正常运行时,当A/D芯片采集数据传输到FPGA,FPGA对数据做完处理后,通过SRIO传输给DSP,每次传输前使能GPIO中断,硬件中断触发相应的中断子程序,中断子程序中实现对数据的解析、处理和存储。
每接收一个CPI的数据,启动一次雷达信号处理流程,在雷达信号处理的每一步,都可以通过网络将数据导出,而导出的数据可以在Matlab软件中进行分析,并与Matlab算法相应的实现结果进行对比,归一化求误差值,在合理范围内就可以对比证明DSP中的程序代码模块的实现效果。
本文将程序运行生成的.out文件烧写到国产飞腾DSP芯片中,并启动系统开始运行采集雷达数据,当脉压数据到达DSP,发布信号量,将数据发送给相关上位机软件,界面可正常实时显示。
将系统处理过程中的中间调试数据,如MTD平面和MTI平面数据,通过网络发送给相关上位机软件保存成文件;将数据通过仿真器从CCS软件中导出同样保存成文件;将上位机保存的文件与通过仿真器导出来的数据文件进行分析对比,由图10可知,两者数据完全相同。
图10 DSP导出与网络保存数据对比
图4和图6所示为本文设计的雷达系统中进行实时显示脉压数据和分析一次点数据的QT界面,由图可知,该软件运行和显示正常。
综上所述,本文基于FT6678_BIOS和网络通信设计和实现的雷达信号处理系统可正常运行,并达到了节省调试时间,调试方便和实时性高的预期结果。
本文给出了基于国产DSP芯片的SYS/BIOS操作系统和网络通信的雷达信号处理系统的设计方案和实现方法。在基于本文设计的硬件架构和软件架构的基础上,该系统实现了分层架构设计、多线程并发调度、网络通信交互、上位机软件界面、可靠的数据接收与分发。
与传统的“中断+主循环”实现方式相比而言,本文实现的雷达信号处理系统具有调试方便可靠,实时性高,节省开发时间以及通用性、实用性和可移植性较好,具有工程价值,可在其他工程项目中移植使用。