张 旻,吴 芳
(1.中国航空计算技术研究所,西安710068;2.陕西省纺织科学研究所,西安710038)
机载软件属于嵌入式软件范畴,是航空电子系统的重要组成部分.主要包括飞机上的信息管理和指令控制系统及上述系统的依托平台(如嵌入式实时操作系统)等。随着应用领域的扩展,机载软件已经普及到了航空电子系统的各个子系统中。
调试是任何软件开发过程中的必要环节[1]。机载软件受其自身资源的限制,不具备在机载计算机上直接进行本地调试的能力。因此,机载软件开发环境的出现是机载软件发展的必然。一个好的机载软件开发环境可提供比较完备的开发工具,能够极大提高机载软件的开发效率,缩短开发周期,降低试飞风险。机载软件开发环境的引入对于整个航空电子系统产业具有非常重要的意义。机载软件开发环境在航空电子系统产业链中起着承上启下的作用:上游的硬件商、系统集成商要借助机载软件开发环境使他们的产品得以实际应用;下游的机载软件开发商要依靠机载软件开发环境快速、高效地开发机载软件。因此,机载软件开发环境在航空电子产业链中占有极其重要的地位。
在国外,对实时操作系统的研究起步较早,二十世纪70年代中期,针对实时语言PEARL(Process and Experiment Automation Real-Time Language)的特殊要求,德国支持开发了功能强大的实时操作系统;八十年代初,美国就出现了商业化的实时操作系统产品,如Ready公司1981年发布的实时操作系统产品VRTX。经过三十多年的发展,国际市场上出现了以 VRTX、VxWorks、pSOS、Windows CE、EPOC、PalmOS、Symbian、Android等为代表的几十种嵌入式操作系统,广泛应用于信息家电、数字通信、工业控制、航空航天、医疗设备、军事电子等领域。
实时操作系统应用程序的开发一般首先需要在主机平台(如LINUX或WINDOWS)上配备相应的嵌入式软件集成开发环境,完成编辑、交叉编译和交叉调试等编码阶段的任务,支持C、C++等高级语言的编程。这类集成开发环境最初主要由第三方工具公司提供,为不同操作系统的不同处理器版本专门定制,如美国 Metrowerks公司的产品 CodeWarrior。随着用户对嵌入式软件开发平台的需求大增,实时操作系统供应商也纷纷投入巨资发展本系列实时操作系统产品的集成开发环境,如WindRiver公司的产品 Tornado/Workbench、ISI公司的产品pRISM+、GreenHill公司的产品 Multi、QSSL 公司的Momentics等。其中Tornado/Workbench和Multi在机载领域中得到广泛应用。
国际上,嵌入式软件集成开发环境的另一支重要的研发队伍是自由软件协会(GNU),他们在Internet上免费提供有关研究和开发成果,如针对各种处理器的交叉编译器。上述所有嵌入式软件集成开发环境都是在GNU软件的基础上,经过集成、优化和测试而推出的更加成熟、稳定的商业化版本。
国内的实时操作系统,从上世纪90年代初开始经过一些单位多年的攻关,已经突破了主要关键技术,并开发出具有一定先进水平、自主版权的实时操作系统产品,如 AcoreOS/AcoreOS653、ReWorks等。为支持这些实时操作系统产品,诞生了LambdaAE、ReDe等嵌入式软件集成开发环境。其中AcoreOS/AcoreOS653及其配套开发环境LambdaAE主要面向机载软件领域。
机载软件开发环境一般由宿主层、基本层、应用层和驻留层组成。
宿主层指机载软件开发环境的基本宿主软/硬环境。硬件环境一般是采用PC机,软件环境一般包括PC机的桌面操作系统和基础软件平台。
对于桌面操作系统,一般采用Windows或Linux操作系统,这也对机载软件开发环境选择的基础软件平台提出了一定的可移植性要求。
Eclipse是IBM 2001年11月份提供给开源社区的插件式体系结构开发平台[2]。根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,而且Eclipse是一个开放源代码的、用Java来实现的项目,任何人都可以在此基础上开发自己的功能插件。换句话说,其功能可以无限扩展,而且有着统一的外观、操作和系统资源管理。
与其他开发工具不同的是,即使是不同种类的嵌入式操作系统,也可使用相同的开发工具,这正是基于Eclipse的嵌入式开发平台一个不可取代的优点。另外,由于Java语言跨平台的特性,Eclipse平台支持的主机环境操作系统可以是Windows,也可以是Linux,或者其他操作系统,这也是基于Eclipse的嵌入式开发平台的优点。与其他的嵌入式开发平台相比,基于Eclipse的嵌入式开发平台显示出众多优势,如工具集成,完美的界面整合,易学易用,大大缩短了软件的开发周期,节省了开发成本。另外,基于Eclipse的嵌入式开发平台还能够与基于Eclipse插件标准开发的第三方工具无缝集成。
综上所述,机载软件开发迫切需要一套功能全面且强大的集成开发环境。这个集成开发环境应该提供友好的用户界面,提供简单易用的操作,提供开发过程需要的各种功能的高度集成,能够支持嵌入式软件开发流程中的每个开发环节。而基于Eclipse的嵌入式开发平台则能够满足这样的需求,这也是各大厂商和研究机构选择Eclipse平台的原因。
基本层在宿主层的基础上集成一组用于支持机载软件开发的最基本的工具集,包括编辑工具、交叉编译/链接工具、加载/固化工具、交叉调试工具等。
编辑工具主要提供对各种软件资源的编辑能力,比如对源代码、工程文件、脚本文件、配置文件等的编辑、修改。
机载软件是典型的嵌入式软件。源代码在宿主机进行编译/链接,在目标机(一般与宿主机的处理器不同)端运行。因此机载软件开发环境必须提供交叉编译/链接工具。GNU工具链以其开源的性质和几乎对所有处理器的支持能力得到了各大机载软件开发环境厂商的青睐。目前,机载软件开发环境一般都采用GNU工具链作为交叉编译/链接工具。
机载软件作为嵌入式软件的一种,具有在宿主机构建,在目标机运行的特点。加载/固化工具的主要功能是将在宿主机上编译/链接好的二进制程序文件加载或固化到目标机系统中去以支持对程序的调试或最终的实际运行。加载/固化的过程一般与目标机载操作系统的启动方式和映像管理方式相关。因此,加载/固化工具根据所支持的目标机载操作系统的不同而有所区别,各大机载软件开发环境厂商都有自己的加载/固化工具。
调试是任何软件开发过程必不可少的一个环节。交叉调试工具提供在宿主机对目标机上运行的程序进行远程调试的能力,包括设置/删除断点、单步执行、继续运行、查看和修改变量/内存/寄存器等功能。目前机载软件开发环境通常采用与GNU工具链配套的GDB交叉调试器来支持机载软件的调试。
基本层为机载软件的开发提供了最基础的支持能力。为了更好地支持机载软件的开发,提高开发效率,还需要从用户层面提供一组图形化的高级开发工具。应用层就是在基本层的基础上,提供一些补充工具以更好地支持机载软件的研制。
目前的机载软件开发环境在应用层提供的工具主要有工程管理、编译系统、编辑系统、调试系统、目标机管理、系统浏览器等等。
工程管理是支持开发人员组织和管理机载软件开发项目中的主要组件,一般来说工程管理支持项目模板、组件配置、创建向导、导入、导出、共享、版本控制等功能。使用工程管理可以提高用户管理机载软件资源的效率,使各种常规操作更加简单。
编译系统作为交叉编译/链接工具的前端支持用户设定编译器、编译选项及参数。编译系统允许使用从简单的全局编译设置到针对单个文件的微观编译设置,及在这两个极端之间任何级别上的编译设置。一般来说编译系统支持自动生成编译/链接脚本、自动依赖关系分析、图形化的编译/链接参数设置、多目标机编译配置、命令行编译及团队编译等功能。
编辑系统在编辑工具的基础上提供一系列的增强功能,例如适用于源文件的代码自动完成、参数自动提示以及语法突出显示等,从而使用户加快了开发过程,并缩短了编辑、编译、调试周期,降低了开发难度和出错率。编辑器一般与工程管理、编译系统和调试系统协同使用,因此,用户可以充分利用它来执行所有面向源代码的工作。编辑系统一般支持代码自动补全、代码提示、代码导航、代码折叠、语法高亮显示等功能。
调试系统是交叉调试器的前端,主要功能是将交叉调试器的命令行界面或文本用户界面转换为图形化界面呈现给用户。调试系统一般支持多调试会话管理、图形化的调试控制管理、断点管理、变量管理、表达式管理、寄存器管理、堆栈管理、内存管理等功能。对于支持多种模式的目标操作系统,调试系统一般还针对目标操作系统的各种模式提供相应的调试模式,例如风河的vxWorks操作系统有任务和系统两种模式,Workbench的调试系统就相应地支持任务级调试和系统级调试。
目标机管理主要支持用户创建和维护开发环境与目标机直接的连接配置。机载软件开发环境作为一个嵌入式的交叉开发环境必须以某种方式与目标机建立连接以支持机载软件的加载和调试。一般来说目标机管理支持创建/删除目标机连接、配置目标机连接属性、连接/断开目标机等功能。所有与目标机相关的工具,如加载/固化、交叉调试工具等都要以目标机管理为基础。
机载软件作为典型的嵌入式软件,它与外部世界几乎没有什么接口,这就对开发人员提出了一个重大挑战:如何实时了解系统的运行状态及系统中的对象信息?系统浏览器正是解决这一矛盾的工具软件。系统浏览器可对系统事件提供详细的分析和图形化的可视效果,同时还可展示在目标机上执行的应用程序的相关任务、线程、中断和系统对象之间复杂的交互作用。它能够清楚地显示上下文变化以及诸如信号量、消息队列、信号、任务、用户事件和计时器一类的系统信息。当需要诊断系统时,系统浏览器是开发人员的最佳选择。
除了以上提到的工具外,各机载软件开发环境厂商还针对各自支持的目标操作系统和开发过程提出了很多有用的应用层工具,例如风河公司的ScopeTools系列监控分析工具、GreenHill公司的Run-Time Error Checking工具、QSSL公司的 Profiler和Memory Analysis工具等。
综上所述,应用层工具比较丰富,而且不同厂商提供的工具也都形形色色、不一而足。但应用层工具都有一个共同的目标:就是在基本层工具的基础上为用户提供更加简单、易用、可操作性更强的图形化工具以帮助用户在整个机载软件开发过程中提高效率、规避错误、丰富开发手段。
驻留层是指为支持宿主机端各种工具的运行而驻留在目标机系统中的各种程序。它们有的与目标系统绑定,有的则可以作为目标系统的组件进行剪裁。驻留层软件设计和实现的基本原则是尽可能避免对目标系统的正常运行造成干扰,如果这种干扰不可避免,则要求干扰是可以预计和计算的。对于驻留层,各种机载软件开发环境都有自成一套的体系架构,例如风河Workbench的开发环境将不同开发工具对驻留层的要求进行抽象形成WTX协议和Gopher语言,通过对它们所提供的一组服务的排列组合就能够满足所有开发工具对驻留层的功能需求。
机载软件开发环境的主要关键技术有多调试模式支持和综合化航电系统支撑两个方面。
机载嵌入式实时操作系统具有多任务的特点,符合ARINC653标准的机载嵌入式实时操作系统,还具有更为复杂的多分区、分区内多进程的特点。这在基本调试支持方面对机载软件开发环境提出了一定的要求:能否支持多种调试模式,使得断点仅对某个任务、分区或进程有效?目前主要的机载软件开发环境所使用的调试器多为GDB调试器,它本身并不支持多种调试模式。另外,调试模式切换后断点是否有效、在调试暂停和运行状态下进行调试模式切换的不同情况、调试模式切换时符号表的调整等等都是多调试模式支持需要考虑的问题。
对于调试级别切换的复杂情况,采用状态图分析法进行设计,达到各种情况的覆盖是一种有效的解决途径。
对于GDB调试器不支持多种调试模式的情况,可在上一层的调试会话和调试模式管理中对调试模式的切换以及不同调试模式的操作差异进行处理。
自20世纪40年代以来,电子技术在航空领域应用不断深入,航空电子系统已逐步成为飞机不可缺少的功能子系统之一。在七十多年的发展历程里,航空电子系统经历了独立式、联合式、综合化三个发展阶段。当前,航空电子系统普遍采用综合模块化结构(IMA)。该结构在硬件上使用由通用功能模块(CFM)构成的综合核心处理平台来提供综合处理能力;在软件上原来航空电子系统里的各任务子系统演变为一组以空间和时间上均安全隔离的以分区为单位的功能软件,各分区共享相同的硬件模块,分区之间通过分区间通信机制进行交互。随着综合化航空电子系统的发展,机载软件向着高度集成、资源共享、协作处理等方向发展,符合ARINC653标准的分区实时操作系统和分布式系统管理技术的出现正是这些发展方向的重要体现。进而,综合化航空电子系统逐步发展成为一种嵌入式的分布式实时计算系统,即综合化航电系统。
综合化航电系统在硬件上是一个多处理器系统,它由一组节点组成。每个节点是一个自足的计算单元,包含CPU、存储器、I/O、网络通讯等部件。每个节点在软件上划分为相互隔离的三层:模块支持层、操作系统层和应用层。操作系统层采用的是满足ARINC653标准的高安全性实时操作系统,系统支持多个分区应用的运行,分区之间在空间、时间上隔离,每个分区里可以运行多个并发进程。同一节点上的不同分区之间、不同节点上的分区之间均采用虚通道技术进行通讯。整个系统的管理由通用系统管理软件(GSM)来实现。
综合化航电系统具有嵌入式、综合性、复杂性、时序性、并行性和并发性等特点。系统的正常运行不仅依赖于单个节点的正常运转,而且依赖于分布在网络各处众多节点之间的通讯及协同工作。虽然人们在测试和调试分布式系统方面付出了巨大的努力,比如形式化验证和不断优化的调度策略,然而在实际应用中一旦系统真实部署后,又会暴露出很多在测试和调试中从未出现过的异常情况。因此,不论形式化验证的贡献有多大,不论实时调度策略有多好,对分布式实时系统运行时监控、调试和仿真的要求并没有降低。这是由分布式实时系统与生俱来的复杂性和在处理外部环境时的不确定性决定的。
综合化航电系统支撑环境主要由上述的机载软件开发环境以及分布式监控、分布式调试和分布式仿真等三个方面构成。
4.2.1 分布式监控
监控是任何软件开发和调试过程中必不可少的手段,尤其对于综合化航电系统这样的复杂嵌入式系统来说,了解系统运行时的行为和状态就显得尤为重要[3]。分布式监控工具能够对综合化航电系统进行监视并将监视数据图形化显示。
分布式监控工具主要对综合化航电系统的输入(应用分区所需的数据,取决于应用,比如飞控应用需要航向、高度、气压、航姿、俯仰角等数据)、输出(应用分区产生的输出,比如飞控应用输出的舵机等数据),辅助输出(如健康监控输出的故障信息等)、系统调用、上下文切换、中断、GSM事件、应用事件、存储器使用、CPU利用、网络利用、实时内核状态、共享资源等进行监控。根据监控到的数据,分布式监控工具可以定义出一致性的全局状态,这是进行分布式调试的重要基础。另外通过对监控日志进行可视化转换还可以使开发人员直观地了解系统运行的全貌和细节,以帮助诊断和定位系统故障。
4.2.2 分布式调试
综合化航电系统在完成平台综合之后,后续阶段主要围绕分区综合进行,保证分区之间正确的、协调的交互是综合过程的关键,而传统的调试手段只能为单个计算机系统的机载应用软件(即顺序程序)开发提供调试支持,对此却无能为力[4]。加之,综合化航电系统的软件功能复杂,规模庞大,子系统软件之间的数据耦合性高,表现为分区之间可能存在纷繁复杂的通信关系,极大地增加了机载软件的开发难度,尤其是调试难度。所以,传统的调试手段已经无法满足多分区综合阶段的调试需求。如何高效地进行多分区综合,尤其是跨平台的多分区综合已经对调试技术和调试手段提出了新的要求。因此,面向综合化航空电子系统,开发机载应用软件的调试方法及调试技术应运而生。
分布式调试的基础是分布式监控,对于综合化航电系统来说就是综合化航电系统分布式软件执行过程的确定性监控,即有效地、确定地监控综合化航电系统分布式软件执行过程以及不确定性执行的诱发因素,然后记录和有效管理所监控的信息。
分布式调试的主要功能是分布式软件执行过程的确定性重演和确定性重演调试。软件调试过程是一个在调试器控制下反复准确地再现被调试软件执行行为的过程。分布式调试借助于所记录的监控信息确定性地再现进程、分区的执行路径,支持用户反复观察程序的执行过程。分布式调试将确定性重演与基本调试技术进行有机结合,借助于基本调试手段高效地分析和定位故障。
4.2.3 分布式仿真
综合化航电系统是一个复杂的实时信息处理系统,为了降低开发成本和缩短软件开发周期,如何进行系统资源的有效共享、如何进行系统任务的合理调度、如何缩短系统的设计周期、如何准确地进行提前设计验证和性能预测,是设计人员面临的主要问题[5]。对综合化航电系统进行建模仿真,提供系统开发验证平台,是解决以上问题的有效途径。在现代机载航空电子系统的研制过程中,综合仿真系统已经成为必不可少的支持设施,利用它可以在地面对机载航空电子系统进行各种接口和功能检查试验,这种试验是可重复的,可控的以及安全的,从而大大减少试飞风险并缩短研制周期。因此,分布式仿真工具是综合化航电系统支撑环境的重要组成部分。
分布式仿真工具从分区应用、操作系统平台、运行时蓝图三方面对航空电子系统进行仿真,是一种全数字仿真。
在分区应用方面:分布式仿真工具可以在没有目标平台的前提下,利用IBM Rational Rhapsody的基于统一建模语言(UML)进行应用建模,然后根据目标平台选择生成源代码,再进行仿真运行,达到模型的提前验证。
操作系统平台方面:结构分析与建模语言(AADL)在对航空电子系统结构的描述方面具有很好的优势。但是它对操作系统以及平台的描述还具有很多局限性。比如具体实现细节以及软件算法等行为,只能通过用户自行扩展AADL行为附件进行功能添加。所以对于综合化航空电子系统的平台和操作系统仿真可以采用同步语言(例如Signal语言)对其进行建模和仿真。
运行时蓝图方面:运行时蓝图的产生和维护是系统设计过程的一部分,一系列相关工具可以集成到机载软件开发环境中达到这样的目的,最后的结果就是生成运行时蓝图,然后将运行时蓝图加载到目标系统上,这样对系统的管理就可以通过专用的接口对蓝图进行访问。
随着航空电子系统综合化程度的提高,机载软件承担更多的功能,航空电子系统也逐步由物理融合过渡到功能融合。机载软件变得越来越复杂,模块化的开发与集成是综合化机载软件的主要手段。
从开发的角度,首先,综合化系统软件规模庞大,需要采用“分而治之”的方法将大规模的软件进行模块化划分,并部署在不同的分区中运行;其次,不同的软件模块可能根据其特点采用不同的开发方法,或者这些方法的组合。机载软件设计方法将根据待开发的软件系统具体而定,不能机械地使用确定的方法。目前,结构化分析与设计方法、面向对象的分析与设计方法和模型驱动的软件开发方法在现代机载软件开发过程中都可能被采用。尽管结构化分析与设计方法已提出并应用了几十年,但其仍然是机载领域主要的软件开发方法之一,只是根据机载软件发展的需要,融入了新的元素和思想。面向对象思想和描述方法大量应用于机载应用软件的设计和开发过程中,现已成为机载软件设计和开发的重要方法。近年来,模型驱动的软件开发方法逐步在机载软件开发过程中得到应用,采用模型作为软件开发各个阶段的统一描述,可以通过自动化工具保证各个设计阶段的一致性,以提高软件开发的可信性及开发效率。模型驱动的软件开发方法以系统模型设计为中心,通过模型指导软件设计的需求分析、系统设计、代码实现、系统测试以及系统维护等各个阶段。与传统软件设计方法相比,模型驱动的软件设计方法消除了软件设计各个阶段之间的鸿沟,使它们相互之间能够很好的协调。
在综合化系统中,系统集成首先体现在综合化系统的配置上。综合化系统运行时,将根据这些配置完成系统功能的部署与重构。系统配置参数用于描述系统配置,这些配置参数都在系统配置数据文件中维护。系统配置数据文件使用配置编辑工具编写,并通过配置生成工具转换为可加载格式。系统根据系统配置数据文件进行配置和操作,系统配置数据文件已成为系统安全的关键。但在一个大型系统中,系统配置数据文件本身的配置项非常多,人工配置与数据检验是非常困难的事情,很容易导致系统故障。
在硬件方面,近年来处理器技术向多核方向发展,这对机载软件开发环境的基本层提出了新的挑战。新一代的机载软件开发环境必须支持多核、多分区并发调试功能和多级安全架构,这是机载软件开发环境最迫切需要解决的一个问题。另外综合化航电系统在开发和集成中的几个核心问题,包括综合化的开发方法、综合化系统配置及验证、配置数据的图形化管理、配置数据验证、配置生成等都对机载软件开发环境提出了新的要求。
[1]Thane H.Design for Deterministic Monitoring of Distributed Real- Time Systems[D].Mälardalen:Mälardalen Real- Time Research Centre,Dept.Computer Engineering,Mälardalen University,1999.
[2]刘亚滨.精通 Eclipse[M].北京:电子工业出版社,2004.
[3]张旻,吴芳,刘建军.分布式系统监视器的设计与实现[J].微处理机,2010(2):101 -104.
[4]张树兵,叶宏,戴小氐.面向IMA的机载分布式软件调试方法初探[A].中国航空学会.探索 创新 交流:第四届中国航空学会青年科技论坛文集(第4集)[C].北京:航空工业出版社,2010:406-413.
[5]齐晓斌.分布式系统仿真工具——仿真控制软件的设计与实现[D].西安:中国航空研究院,2010.