基于VxWorks 的星务软件快速加载重构研究

2022-05-06 13:32王明亮徐元旭尤志坚
电子设计工程 2022年8期
关键词:进程代码重构

王明亮,王 永,常 亮,徐元旭,尤志坚

(1.中国科学院微小卫星创新研究院,上海 201203;2.上海微小卫星工程中心,上海 201203)

小卫星以其研制周期短、经费低、可多星发射等优点在国内外掀起了研制热潮,软件密集化是小卫星技术的重要特点之一。星务软件作为小卫星集中管理功能的核心中枢,包括星务管理、定姿、姿控、定轨、轨控、遥测、遥控、能源、热控、载荷管理等功能组件的大型复杂软件,一般通过引入嵌入式实时操作系统进行多任务并行控制和管理。任务模块间的耦合性高、数据接口复杂多样和时间同步需求不统一等特点,导致其可靠性和在轨可维护性等难以通过地面测试得到完全保证。软件开发工作也变得更加复杂,软件版本更迭频率也越来越快,以致在轨航天器的日常运维管理工作日益艰巨[1]。

传统的硬件可重构是指通过特定的指令集配置,使得该计算机结构可变为针对特定算法的专用计算机结构[2]。针对卫星单机,硬件整体功能通过软件定义重组基础功能来改进和重构卫星,提高卫星多功能处理任务能力[3],同时,卫星在轨服务是未来主要发展趋势之一,在轨软件重构和硬件重构技术也是其主要核心技术[4-5]。

为提高卫星在轨处置未预计软件异常的能力,星务软件在轨重构技术应运而生。通过任务级软件可配置,将模块分为通用模块和配置参数,实现了软件模块的可配置,完成了软件系统的可配置和重构[6]。上载软件在轨定义多功能、软件可控多功能、参数可重构也是未来智能卫星发展的国家重大战略需求[7]。另一方面,由于硬件设计的限制,星务计算机存储空间一般非常有限,一次无法加载所有复杂的任务程序,通过在线重构技术,可以在卫星在轨后进行程序上注,使卫星能完成更多的功能[8]。

卫星在轨运行期间,所搭载的软件组件、模块如果能够通过地面遥控上行信道注入的方式进行动态更新,以修复潜在缺陷、重构载荷任务等,或者通过最小安全模式软件中的串口加载功能,可以将星载应用软件以APP 的形式进行安装与卸载[9],则可以提高航天器的可靠性、可维护性、恢复性等。例如,猎鹰9 第一级9 台默林1C 发动机中的1 号发动机出现异常而被姿控系统提前关闭,这台发动机位于“井”字形布局的一个角上,之后姿控系统通过重构控制,重新生成一个上升轨迹并在轨注入,并利用其他8台发动机最终顺利完成发射[10]。

文中通过分析当前国内星务软件在轨重构技术,结合VxWorks 操作系统的模块装载功能,提出星务软件快速加载重构技术,提高星务软件在轨重构的可用性,增强卫星在轨可维护能力,通过在量子通信科学实验卫星超期服役期间新增载荷任务的上注验证测试,测试结果表明该方法可以在更大地址空间和更细粒度实现星务软件在轨动态加载重构。

1 国内星务软件重构技术

重配置技术的出现适应了现代卫星的发展需求,通过重配置手段,实现了对基础嵌入式系统的设计[11]。该技术对于卫星在轨维护和修复特别有益。另一方面,由于卫星载荷的工作需求会导致公用平台星载软件功能进行定制式修改,破坏卫星平台设备的一致性,需要将共性功能产品化并支持软件重构[12]。目前国内卫星在轨软件重构可归纳为模块间接调用、整体替换、进程重构3 类。

1.1 模块间接调用

这种模块间接调用的方式,是当系统改变任务时,将相应用途的配置程序从计算机文件系统加载到FPGA 中,调用相应用途的计算机处理软件,即完成整个系统的任务转换[13]。在调用新软件时,建立函数入口查找表、子程序地址表或模块重定向表,将可能进行替换的函数入口地址、子程序或模块的入口地址写在表内,在访问这些子程序或模块时,需要查阅该表获得地址,修改某子程序地址至新注入代码的首地址,即实现了对该子程序的替换或重构。该方法需要在星务软件设计时预先确定哪些模块设计可重构,若设计较多的可替换模块,可重构范围较大,但频繁的模块间接调用会增加软件系统自耗,将低函数执行效率,并增加软件设计师的工作量,若设计较少的可替换模块,则可重构范围较小。因此该重构方法不适于解决卫星在轨未知异常。

1.2 整体替换

星务软件代码通常固化在非易失性存储器(NVM),如ROM 或Flash 存储器,星务软件启动时,直接执行或拷贝ROM 中的代码至RAM,然后再运行。NVM 另预留了新代码存储空间,遥控注入新的代码主体,写入NVM 新代码存储区,再通过地面指令或软件自主启动新代码执行。采用全系统可重构卫星架构软件设计,在不降低卫星性能、功能指标的同时,可有效减少卫星内部通用部件数量,降低卫星复杂程度。该方法虽简洁易行,可重构的范围可覆盖整个星务软件系统,但无论重构的变化大小,每次都需替换整体代码,所需遥控上注数据量大,不利于在轨软件快速重构以及时解决问题。

1.3 进程重构

目前,国内星务软件已普遍采用嵌入式实时操作系统,基于实时操作系统的星务软件以进程为单位调度运行,因此形成了以进程为单位的重构颗粒,包括进程的增加、删除或屏蔽、调整优先级及运行调度周期等,软件在轨重构方式的多样性和灵活性显著提高,所需上注的数据量较整体替换方法有较大下降。进程重构较其他重构方法,软件运行灵活性大大增加,增强了软件重构解决在轨未知异常的能力。实际在轨应用中大多是部分软件代码需要变更,不需要进行整体替换。通过在空白区注入新的指令代码,将旧代码区的函数调用引向新代码的方式,实现程序区的局部代码更新[14]。利用嵌入式系统中已广泛应用的模块动态加载技术,将结构化软件分为多个模块。软件重构以模块为单位进行,合理设计模块,可大大减小遥控上注数据量。

2 嵌入式动态加载技术

文中提出的星务软件重构技术是基于VxWorks操作系统,将进程重构和模块动态加载紧密结合,极大限度实现星务软件在轨重构的能力,并减少重构规模。

2.1 静态链接和动态链接

传统软件编程是把程序分割成若干个独立的模块,然后逐块编程和独立编译,形成独立的待链接模块,模块在被链接前保持本身的独立性。一个应用软件是由多个独立模块通过链接形成的,链接方法有两种:静态链接和动态链接。

静态链接是将各模块解决了所有的外部引用之后,编译生成一个可执行代码,必须装入指定内存并执行。程序中的代码段和数据段的位置必须是链接时指定的,不能改变。

而动态链接是系统在运行过程中根据需要把外部某模块的待加载文件链接到系统中,使之成为运行系统的一部分的过程。动态链接在执行过程中,允许软件系统发生变化,某时刻可加入新的模块、清除旧的或当期不需要运行的模块,重新构成一个新的程序。动态加载机制是操作系统中广泛采用的一种软件加载方式,它强调将应用和软件代码库分离,只有当需要时才加载指定代码模块,强调需要时再加载,不需要时可以卸载模块或转移至外部存储区。

星务软件系统动态加载需要扫描系统符号表,完成待加载模块的代码段和数据段进行重定向,并更新系统符号表,通常需要耗费较长时间。因此,直接的动态模块加载比静态链接运行方式,增加了软件系统建立时间,对于实时性要求很高的星载嵌入式系统,必须考虑在轨软件建立时间过程的卫星系统安全性。嵌入式系统动态可加载模块的格式类型主要有A、OUT、ELF、COFF、OMF、OBJ 文件等,文中以A、OUT 文件格式为例说明动态加载。

2.2 星务软件动态加载重构技术

目前,国内星务软件可执行代码较常见的是以静态地址链接方式形成。静态地址方式下实现软件重构,需要人工去管理各进程模块的地址,需要比对新旧代码确定模块是否需要更新。同时,软件各模块地址分配时,需要有冗余空间以应对可能的模块扩张。静态地址重构不利于下层或底层代码的调整。若要修改底层代码,需同时重构所有与该底层模块有调用关系的其他模块,会增加上传数据量。

文中提出基于VxWorks 操作系统的星务软件可配置动态加载重构技术,是进程重构方法的深入,将动态链接技术与星务软件重构需求相结合,通过动态加载的方式构建星务软件系统并运行,成功克服了模块间接调用和整体替换方法的不足。该技术采用动态加载重构方法,克服了静态链接方式不利于底层或下层代码重构的不足。

星务软件采样基于RTOS 的动态加载重构技术后,将具有以下3 方面优点:

1)有利于软件系统升级或重构。通过动态加载机制,实现以模块为单元的软件重构,由于模块的独立性,只需要上注和更新需要变更的模块。解决静态地址重构不利于底层或下层代码变更的不足;

2)使星务软件功能更具多样性。软件实现模块级重构,软件系统可存有多种任务备用模块,如试验算法模块、新技术任务模块等,通过组合加载不同的模块,灵活实现在轨应用任务;

3)更便于软件开发及配置管理。复杂星务软件通常需要多人协同开发,分别负责不同的模块研制。动态加载方式下,各个模块配置输出独立,即便于各自调试,又便于软件配置管理。

3 星务软件快速加载重构技术

3.1 多项目工程环境

要实现软件系统定制模块的快速加载,首先必须建立相应的软件开发环境。星务软件在Tornado开发环境下,将工程设计为多项目工程,如图1 所示。项目输出包括一个VxWorks 镜像文件和9 个模块的待装载文件(A.out格式文件)。

图1 Tornado软件工程多项目架构

将VxWorks 镜像及各装载文件存放在星载目标机的NVM 中,如图2 所示。为提高软件系统的可靠性,实际在NVM 中存放多份VxWorks 镜像及各待装载文件,每个镜像或模块都设置校验。

图2 星务软件数据存储规划

3.2 可配置设计和模块加载表

为了实现快速加载,该设计的重构数据块通过定制配置化的模块加载表保存在NVM 的前部,配置化主要包括以下3 方面:

1)可配置自动加载模块;

2)可配置自动进程创建;

3)可配置进程运行方式。

模块装载表中由多个模块装载单元组成,具体数据结构如下:

通过模块装载表实现模块自主加载及进程运行参数设置。TaskStatus 用于区分模块是否仅装载,是否装载后需要创建任务并运行。通过调整进程优先级、进程调度策略可灵活地实现软件运行方式的重构。

3.3 软件系统启动流程

星务软件动态加载的启动流程如图3 所示。

图3 星务软件动态加载启动流程

上电或复位后,在完成寄存器及内存初始化后,将VxWorks 镜像(预存在NVM)拷贝并跳转执行,在完成VxWorks 初始化后,程序进入用户程序入口,即usrAppInit()。在usrAppInit()中,从NVM 读取并遍历模块装载表,将装载单元bAutoLoad 为TRUE 的模块加载至软件系统,当TaskStatus 为TRUE 时,创建进程并设置参数。若模块装载过程出现异常,即无法建立应用软件系统,则自主跳转至ROM 中的安全模式代码并执行,等待地面遥控修改模块装载表、新增或修改模块文件,即重构应用软件系统。

3.4 运行中重构

星务软件系统建立后,可以随时根据地面指令和注入数据实现在轨软件重构。在轨软件运行中的重构步骤如下:

1)接收地面注入数据(模块信息),并按要求写入NVM;

2)接收地面注入数据,更新模块装载表;

3)接收并执行重构指令,包括指定模块装载、指定模块卸载、增加或删除进程、修改进程优先级和调用周期等。

对于时序关联性强或特定情况的任务重构,需在模块装载表更新后,进行操作系统初始化,重新读取模块装载表,进行软件系统重建。

3.5 加载器优化

VxWorks 作为嵌入式高可靠实时操作系统,在航空航天领域被广泛应用,其具有可裁剪的模块动态加载功能,用户可通过直接添加VxWorks 的loader components 组件来获得模块加载器。

基于VxWorks 模块动态加载功能的星务软件重构方法,是将通用嵌入式系统动态加载可执行文件或目标文件的方法直接用于星务软件系统。但星务软件直接采用VxWorks模块加载功能存在两方面不足:

1)功能组件自身开销较大。VxWorks 的模块加载组件是基于文件系统IO 驱动,直接选用该组件将明显增加VxWorks 的规模,不利于在资源昂贵的星载计算机应用;

2)不利于软件调试。各模块通过动态方式装载至内存,因此,装载后代码和数据的位置用户无法获得,研制过程中,难以进行软件调试和问题分析。

在VxWorks 加载模块原代码基础上,进行如下4方面的改写,以减少加载器自身资源的要求。

1)自定义模块创建时文件名输入规则,取消对模块文件名的读取过程,取消文件名与模块名的关联;

2)直接内存地址访问模块数据代替文件索引及读写操作,即脱离文件系统;

3)简化模块创建时的动态内存分配逻辑;

4)删除C++模块装载过程中构建函数的映射和调用,析构函数的映射。

4 测试验证

如果载荷功能节点所有的软件版本都不能满足使用要求,或者有新增任务需求时,则可以利用地面上注软件及更新技术来实现[15-16]。在量子通信科学实验卫星超期轨服役期间,卫星用户方新增了部分载荷实验任务,为此相匹配的进行了部分地面站计算代码的函数级细粒度动态重构,在卫星入境的弧段,按照前一节的方法成功进行了地面站计算的代码position.out 上注重构。在卫星后一轨入境后,通过指令遥测下传相关上注代码的校验、帧头等信息,通过遥测参数发现,星上软件平滑切换使用上注的地面站计算模块代码,圆满完成量子科学实验卫星超期服役期间的新增载荷任务。

5 结论

文中根据星务软件的实际需求和发展趋势,提出了基于快速动态加载的星务软件重构技术,包括模块快速加载、进程创建、可配置进程运行等,使在轨软件重构更灵活,极大方便了在轨软件的升级维护以及在轨延寿升级等,从而提升星务软件在轨运行的可靠性和可维护性。

猜你喜欢
进程代码重构
视频压缩感知采样率自适应的帧间片匹配重构
长城叙事的重构
高盐肥胖心肌重构防治有新策略
债券市场对外开放的进程与展望
改革开放进程中的国际收支统计
创世代码
创世代码
创世代码
创世代码
北京的重构与再造