机载SDR系统SCA核心框架优化技术*
2021-08-30许富龙
许富龙,张 强,李 鹏,罗 玲
(1.中国民用航空飞行学院 空中交通管理学院,四川 广汉 618307;2.中国西南电子技术研究所,成都 610036)
0 引 言
软件无线电(Software Defined Radio,SDR)[1]是一种新型的无线电体系结构,它通过硬件和软件的结合使无线电系统或设备具有可重配置能力[2],使相同的硬件可以通过软件定义来获得不同的功能。硬件通用化、功能软件化是SDR系统的主要特点。在开放、可扩展、结构精简的硬件通用平台上,如何实现标准化的波形软件建模、开发和部署,缩短系统开发时间,是SDR系统研发中需要解决的关键问题之一。在此背景下,软件通信架构(Software Communication Architecture,SCA)应运而生。
SCA起源于2000年,作为一个开放的软件架构标准,它规定一组与波形功能无关的通用接口和规则,使基于此开发的波形应用软件具有良好的可移植性、可重用性和互操作性。2015年,SCA4.1版本发布,该版本对旧版进行了大量变革,例如支持功能裁剪等。
尽管SCA围绕SDR普适性的目标不断发展,但其通用的定位导致其接口功能臃肿,运行效率较低[3-4]。在注重效益的SDR工业领域,尤其是机载SDR领域,基于SCA规范的研发常常遭遇困难。为此,本文将根据机载SDR的实际特点,分析机载领域对SCA架构的实际需求,并从功能裁剪和加载流程优化两方面提出SCA核心框架的优化技术,解决SCA架构在机载SDR中的应用问题。
1 机载SDR系统介绍
1.1 机载SDR系统硬件平台
图1是典型的机载SDR硬件平台[5],由通用射频收发模块和信号信息处理模块通过数字交换网络互连而成。通用射频收发模块用于射频信号的上下变频、滤波和射频信号与数字信号的相互转换。信号信息处理模块完成数字信号处理和信息协议处理[5-6],其处理实际由模块上的波形软件完成。
图1 机载SDR系统典型硬件结构
信号信息处理模块主要包括通用处理器(General Purpose Processors,GPP)、数字信号处理(Digital Signal Processing,DSP)、现场可编程门阵列(Field Programmable Gate Array,FPGA)等多种类型的处理器和Flash器件。当系统运行时,各处理器从文件系统中加载所需的波形应用软件,执行相应的信号和信息处理程序,实现无线电功能。
1.2 机载SDR系统软件结构
机载SDR系统采用图2所示的SCA软件结构。其中,底层驱动之上、波形应用之下的软件统称为运行环境(Operating Environment,OE)。OE为波形应用软件提供完善的运行平台环境,并负责软件平台管理和组件执行。OE主要包括嵌入式操作系统、传输机制、核心框架、平台设备组件和服务组件。
图2 SCA软件结构
SCA核心框架是OE的核心管理单元。SCA核心框架软件实现SCA规范要求的API接口,管理平台软硬件资源,并负责波形软件在系统中的加载、创建、执行、配置和销毁。SCA核心框架包含一套标准接口定义,使按照该接口开发的波形组件可以直接被核心框架调用和管理。因此,SCA核心框架使波形应用与平台的集成变得简单,增强了波形软件的可移植性。
1.3 机载环境下SCA架构的实际需求
虽然SCA能提升SDR系统的软件开发和集成效率,但其接口冗余、资源浪费、性能较低等缺点难以满足机载需求。
实际上,机载SDR系统的体积、功耗等要求制约了硬件系统的资源规模[7];同时,为了满足DO-178C标准[8],SCA核心框架必须具备轻量、高效的特点。因此,必须对臃肿冗余的核心框架进行优化改进。
2 功能单元裁剪
功能单元裁剪既符合SCA 4.1规范优化思路,也与机载软件精简紧凑的要求相一致。
2.1 波形安装/卸载能力裁剪
SCA规范包含波形应用的安装和卸载能力。波形必须被“安装”到系统中,才能获得该波形应用的工厂对象,当不再需要一个波形时,可通过“卸载”将其移除。
机载SDR系统不需要波形安装和卸载能力。虽然安装行为会对波形的软件装配描述文件(Software Assembly Descriptor,SAD)及其依赖的关联文件进行校验,但该能力裁剪后仍然可以通过优化保证安全,简化运行流程,有利于减小软件规模提高和运行效率。
2.2 系统组件的动态注销能力裁剪
为支持设备热插拔,SCA规范提供了系统组件(设备组件和服务组件)的运行时动态注册/注销能力。机载SDR系统在运行时不会插拔硬件模块,所以不需要此能力。虽然在研发阶段,该能力支持在不重启系统的条件下多次加卸载系统组件,为测试工作提供便利,但加卸载系统组件的行为常常是由软件运行错误引起的,此时为排查软件错误,重启是更为常用的方法。此外,裁剪此能力一定程度上简化了核心框架的复杂性,所以兼具瘦身和可靠性提升的优点。
3 加载流程优化
SCA系统中存在两种组件:系统组件和波形组件。系统组件通常在启动阶段由设备管理器根据设备配置描述文件(Device Configuration Descriptor,DCD)依次加载,而波形组件则在功能创建时由应用工厂根据其SAD描述文件进行加载。虽然两种组件的加载时机不同、实施加载行为的主体不同,但其加载过程实质上是类似的,都可以采用本文的加载流程优化方法。为便于描述,后面主要针对波形组件来阐述加载流程优化设计。
3.1 问题分析
波形创建的步骤包括组件加载、组件执行、端口连接和波形配置。其中,组件加载因为需要搬移数据而较为耗时。在分布式环境下,组件的加载需要先从文件系统中读取数据,再通过总线传输到目的处理器。因此,波形组件的加载速度主要取决于文件系统性能、总线传输速率。显然,当系统设计完成时,这两个参数就已经确定。
可以从更高层面来分析波形加载时间问题。通常,一个波形应用包括多个组件,而这些组件一般部署在不同处理器上。因此,一个波形应用的“总”加载时间,还取决于各组件是串行加载还是并行加载。
3.1.1 SCA规范对波形加载的限制
SCA规范定义LoadableInterface接口用于组件加载,并要求可加载设备(LoadableDevice)实现该接口。该接口的load函数定义如下:
void load(in FileSystem fs,in string fileName,in LoadType loadKind);
raises(InvalidState,InvalidLoadKind,InvalidFileName,LoadFail)。
其中,参数fs指定被加载文件所在的文件系统,filename是被加载文件名,loadKind指定加载类型。
当创建一个波形应用时,首先为其每一个组件分配合适的处理器,而每一个处理器对应一个可加载设备组件。随后,SCA核心框架调用相应的可加载设备组件的load函数,完成组件加载。因为load是同步函数,所以核心框架的波形创建进程在调用load时会被阻塞,直到组件加载结束后才从load返回。因此,SCA规范的组件加载实际是串行执行的。例如波形Wave1有三个组件Comp1~3,分别要部署在处理器A、B和C,核心框架的加载行为类似于图3(a)的伪代码,其时间特性如图3(b)所示。
图3 SCA规范的波形加载示意图
波形加载的总时长约为各组件加载时长之和,即
(1)
式中:ti是第i个组件的加载耗时,n是组件数量,t′是分布式环境下的命令传输耗时。可见,波形加载耗时较长,限制了系统性能。
3.1.2 SDR硬件架构对波形加载的影响
出于对成本、性能等方面的考虑,不同的SDR系统在硬件设计上差异较大。SCA规范不对SDR的硬件做过多约束,使得硬件架构设计具有很大的灵活性。
图4列举了两种SDR硬件架构。图4(a)有三个文件系统,采用交换总线与处理器相连;图4(b)为控制成本,通过共享总线将一个文件系统(File System,FS)与处理器相连。这里仍以前面的波形加载为例,讨论两种硬件架构对加载的影响。
图4 影响加载的两种硬件架构
对于图4(a)的硬件结构,多文件系统提升了文件服务能力。如果三个波形组件分别存储在三个FS,并行加载不会使单个FS的负荷增大。同时,交换总线也使点到点的带宽不会因为同时传输而下降。因此,并行加载的性能如图5所示,此时加载总时间约为单个组件加载时间中的最大值:
图5 波形组件并行加载的时间特性
(2)
对于图4(b)的硬件结构,单文件系统和共享总线下的并行加载不能显著提升时间性能,甚至可能因形成瓶颈而使性能恶化。一方面,单文件系统在提供多个大文件的并行读操作时,工作负荷增大,调度开销增加,其性能相对于串行读取可能更低;另一方面,总线链路共享使多个数据流的同时传输相互影响。此时采用串行加载更为合适。
3.1.3 优化原则
通过上述分析可知,“改串为并”,即采用并行方式加载波形组件是优化加载时间性能的一个有效方法,但前提是硬件系统能够为并行加载提供支持。对不适合并行加载的情形,例如上述共享式硬件架构、从单文件系统中加载多个组件、组件间存在依赖关系导致无法并行加载等,仍适宜采用串行加载。实际上,很多SDR系统往往同时存在适合并行加载和适合串行加载的情形。因此,“串并共存”,即根据实际系统的具体情况来灵活配置和指定波形的加载方式,才是最符合实际需要的,这正是本文加载流程优化设计的基本原则。该原则能够根据实际系统的特点,充分发挥硬件系统的并行加载潜力,既提升了时间性能,同时也能很好地兼容SCA规范。
3.2 加载流程优化设计
3.2.1 接口设计
SCA规范的load函数是同步函数。为支持并行加载,本文设计了如图6所示的异步加载接口。
图6 异步加载接口及调用关系
(1)增加asynLoad函数
在SCA规范的标准接口LoadableInterface中增加asynLoad函数。该函数由loadableDevice组件实现,供核心框架调用。
void asynLoad(in FileSystem fs,in string fileName,in LoadType loadKind,in loadResultCallbackObj resultCallbackObj);
raises(InvalidState,InvalidLoadKind,InvalidFileName)。
asynLoad函数是异步(非阻塞)函数,它在启动波形加载过程后立即返回,不等待波形加载行为结束。因此,该函数执行时间极短,不会使调用的进程睡眠。波形创建进程可以连续调用多个LoadableDevice的asynLoad函数,使多个组件并行加载。
相比load函数,asynload多了一个参数resultCallbackObj,该参数是一个loadResultCallbackObj类型的对象引用(指针),供loadableDevice组件在波形组件加载结束时通过回调将加载结果返回。该参数的细节见下一小节。
(2)新增LoadResultCallbackInterface接口
异步函数asynLoad无法向调用者返回加载结果,必须采用回调方式让LoadableDevice在加载结束时上报加载结果。为此,增加LoadResultCallbackInterface接口,该接口只有一个resultCallback函数。
void resultCallback(in string fileName,in LoadResultType loadResult)。
其中,参数fileName指明被加载的波形组件,loadResult指出加载结果,LoadableDevice组件在完成加载后调用该函数将结果告知波形创建进程。
在核心框架内部,LoadResultCallbackObj对象应实现LoadResultCallbackInterface接口。应用工厂组件根据需要创建多个LoadResultCallbackObj对象。一个LoadResultCallbackObj对象对应一个LoadableDevice组件。该对象将作为asynload函数的最后一个参数传递给LoadableDevice组件。
3.2.2 建模设计
为支持灵活的并/串行加载,需要设计一种标准的建模方法。SAD描述文件用于描述一个波形应用的组件列表、装配方法和内部连接等特性。因此,本文选择在SAD存储组件的加载配置信息。该配置信息只包含一个加载批次(LoadBatch)属性,具体设计如下:
(1)LoadBatch属性是1~255的整型值,用于表示一个组件被加载的批次。
(2)LoadBatch属性的具体位置是在SAD partitioning:componentplacement:componentinstantiation:componentproperties。每一个波形组件(实例)都对应一个componentproperties元素,用于存储该组件(实例)在创建及初始配置过程中所需使用的属性值。因此,每一个组件(实例)都对应一个LoadBatch属性。
当创建一个波形应用时,核心框架读取其SAD文件获知每一个组件的LoadBatch。如果未设置LoadBatch,核心框架将采用SCA规范的标准加载流程,从而实现对SCA规范的兼容。
3.2.3 算法设计
对一个波形应用的多组件加载,采用“多批次的并行加载”设计:同一批次内采用并行加载,而不同批次之间是串行加载。组件的加载次序由其LoadBatch决定:先加载LoadBatch为1的组件,再加载LoadBatch为2的组件……直到所有组件都被加载。若多个组件的LoadBatch同为i,则它们将在第i批次中并行加载。
一个波形应用的加载流程算法伪代码如下:
1 fori=1;i<=255;i++ do
2 将批次号(LoadBatch)为i的所有组件,构成集合Ф;//Ф内的组件将并行加载
3 if(Ф不为空) then
4 forn=1;n<=|Ф|;n++ do //|Ф|代表Ф中组件个数,Фn指Ф集合中第n个组件
5 获取组件Фn的部署设备loadDev,回调对象cbObj,文件系统fs,文件名fn;
6 loadDev->asynload(fs,fn,EXECUTABLE,cbObj);//asynload调用后立即返回
7 end for
8
9 while(1) do
10 waitForLoadResult();//进程将睡眠,直到收到Ф中某组件的加载结果后才唤醒
11 if(Ф中所有组件的加载结果已收齐)
12 break;//跳出while循环,本批次组件加载完毕;
13 end if
14 end while
15
16 if(此波形的所有组件都已执行加载动作)
17 break;//跳出for循环,此波形加载结束!
18 end if
19 end if
20 end for
4~7行的for语句循环调用asynLoad函数,使第i批次的所有n个组件并行加载。9~14行的while语句用于等待第i批次n个组件的加载结果。每当执行到10行时,波形创建进程将睡眠等待,直到LoadDevice组件调用resultCallback函数上报加载结果时,该进程才被唤醒,此时采用11行if语句检查n个组件的加载结果是否已收齐:若是,本批次加载结束;否则将回到10行继续等待其他组件的加载结果。当程序执行到16行时,本批次的加载已完成,此时若该波形的所有组件都已加载,则流程结束;否则将启动下一批次加载。
上述算法可以灵活地使波形的多个组件以任意期望的顺序和串/并方式被加载,满足任意系统对波形加载流程的优化需要。
4 实验验证
实验采用信号处理测试平台。该平台集成通用信号处理模块,包含PPC、DSP和FPGA等高性能处理单元。为便于测试,编写了相关测试设备组件和测试波形组件。
4.1 功能验证
结果表明,采用本文优化技术的核心框架能够正常启动和运行,当设置了各个组件LoadBatch值时,核心框架能够读取LoadBatch值并按模型意图正确地实施组件加载。
4.2 实验分析
实验结果表明,采用本文优化技术,核心框架的启动时间有所缩短。表1是波形加载时间的优化结果,可以看出,并行加载可有效缩短波形加载时间。组件数量为2的数据表明,各组件尺寸的差异越小,并行加载的时间优化效果越好。此外,当组件数量为4时,优化效果有所下降,这是因为4个组件被分成了两个批次进行加载。
表1 波形加载时间优化结果
上述结果表明,本文的优化技术可有效降低核心架构的自身开销,提升架构性能。
5 结 论
本文分析了SCA架构在机载SDR系统中的不足,并从功能裁剪和加载流程优化两方面提出了核心框架优化方法。实验结果表明,该方法不仅使架构更精简,而且能充分地发挥硬件系统的并行加载潜力,有效提升机载系统中SCA架构的可用性,对面向机载SDR系统的SCA核心框架优化具有一定指导意义。