吕 敏,张国柱,董晋芳,陈晓强,曹 斌
(1.上海航天控制技术研究所,上海 201109;2.上海市空间智能控制技术重点实验室,上海 201109;3.上海航天电子技术研究所,上海 201109)
飞行器控制系统嵌入式软件一般由内核软件(BIOS软件)和载荷软件两部分组成。BIOS软件作为嵌入式系统底层的专用内核软件,与系统硬件资源紧密相关,主要实现上电自检、系统初始化、载荷软件引导等功能;载荷软件实现各种用户应用功能,如空间自主飞行器控制系统复杂的姿态、轨道控制。一方面,单粒子效应等空间环境的影响会对飞行器软件存储器中的代码和数据造成瞬时或永久性的损坏,甚至导致系统瘫痪,因此系统必须具备对载荷软件的远程修复能力;另一方面,通过对载荷软件的远程重载,可在轨实现对软件缺陷的修改、系统功能的完善和扩充。内核软件对载荷软件的远程重载成为提高航天器软件的可靠性、可维护性和系统功能可扩充性的一项重要技术途径。
目前,多数星载计算机软件以模块为基本替换单位进行在轨编程,需在原始载荷软件中建立子函数地址映射表或在函数入口预留后门,通过修改映射表或后门函数实现模块替换,只能对预先指定的模块实现替换,不能实现任意模块的在轨修改[1-2]。文献[1]设计的方案仅能实现70个指定模块的在轨编程。文献[3]设计了一种通过内核引导程序选择加载PROM中的基本系统或Flash中的用户程序,预先指定可在轨编程的模块需在链接命令文件中分配固定的装载地址和运行地址,且考虑模块更新后大小发生会变化,需在函数后面人为预留一定的空间余量,多重的约束导致实际操作性不强且对空间资源造成了不必要的浪费。本文基于安全内核的高可靠嵌入式软件架构,对一种载荷软件可重构的空间自主飞行器内核软件设计进行了研究。
BIOS是指基本输入输出系统,通常固化在只读存储器ROM中,直接对计算机系统中的输入、输出设备进行设备级/硬件级的控制,是连接应用程序与硬件设备的枢纽。BIOS软件在嵌入式软件系统中的层次关系如图1所示[4]。
图1 软件层次结构Fig.1 Software Frame
一般系统BIOS中基本内核软件的功能有开机自检(POST)过程、内存初始化、绑定异常处理、硬件初始化、软件初始化、载荷软件引导和调试功能[4]。空间飞行控制系统对BIOS程序提出了高可靠性和可重载性的更高要求。
随着空间自主飞行器控制系统组成及功能的日益复杂,先进控制理论不断用于在轨应用,控制系统载荷软件规模越来越庞大,传统PROM存储介质加SRAM运行介质的模式受器件规模的约束,已无法满足用户的需求。空间飞行器在轨运行期间,恶劣的空间环境会造成内存空间频繁发生瞬时或永久性的故障。因此需要一种既能满足日趋庞大的载荷程序存储,又能保证存储、运行高可靠性的嵌入式系统软、硬件架构,以满足空间应用的需求。
空间计算机采用PROM+EEPROM+SRAM的配置,在高可靠PROM中固化BIOS软件,扩展大容量的EEPROM或FLASH存储器作为载荷软件的存储介质,SRAM作为程序运行空间。
为提高载荷软件存储的可靠性,EEPROM中的应用软件备份3份,采用标识字+应用软件的存储方式,标识字由应用软件长度和8位CRC校验值组成。软件存储空间分配如图2所示。
图2 软件存储空间分配Fig.2 Memory resource configure
BIOS程序除基本内核软件的功能外,还具备系统安全模式和调试功能,与应用软件共同构成了独立的多源载荷软件。内核软件可根据系统运行的不同情况,从多源载荷软件中选择所需的软件加载至SRAM中运行。
内核软件判断不同复位原因进入不同的工作模式,流程如图3所示。
系统上电或冷复位运行后,内核软件优先按3取2方式将应用软件搬到SRAM载荷软件装载区1中并进行CRC校验,搬场成功并校验正确后跳转PC指针执行载荷软件;否则,依次对第1份、第2份、第3份载荷软件进行搬场和校验。
内核软件判断计算机系统0.5h内非上电冷复位次数大于3次时,则判定为不可恢复故障。内核软件将最小安全模式载荷软件装载到SRAM中有效载荷数据区2中,进入安全模式运行。安全模式下,系统除完成飞行器对日定向功能外,还可接收地面注入的新载荷软件,将载荷软件写入SRAM中,选择执行注入的新载荷软件或将其固化于EEPROM中,实现软件在轨版本固化升级。
地面软件调试及测试阶段,需实现计算机软件在线加载、调试、固化,内核软件判断复位原因为调试口复位时,将调试程序装载到SRAM中有效载荷数据区2中。在调试模式下,终端控制台提供人机交互界面,通过调试串口通信信息,实现软件加载、调试和固化等功能。
图3 内核软件对多源载荷软件的配置和运行管理流程Fig.3 Payload software flowchart and management of Kernel with running flow
系统载荷软件搬场失败或0.5h内出现3次冷复位,BIOS程序启动安全模式软件搬场,将安全模式软件装载到载荷软件装载区2运行。安全模式软件采用主任务+背景任务的工作方式,主任务完成系统太阳定向功能,采用陀螺+太敏+磁强计+磁力矩器测控方式,保障软件重载过程中飞行器基本的姿态、能源安全。主任务太阳定向软件运行环境如图4所示。背景任务进行计算机系统安全自检、载荷软件在轨重载处理。
软件嵌入是将实现某种功能的代码嵌入已有的软件中,通过对宿主文件的修改实现病毒入侵或bug修复,软件嵌入的方法包括源码级和机器码级的修改。本文采用源码+目标码的软件嵌入技术和函数地址重映射的方式,实现对完整载荷软件、任意软件模块或任意地址目标码的多级灵活修改。
图4 太阳定向软件运行环境Fig.4 Running environment of energy software
内核软件对重载后载荷软件可选择直接在SRAM中运行或固化至EEPROM两种模式。载荷软件重载流程如图5所示。
图5 载荷软件重载流程Fig.5 Over loading flowchart of payload software
首先系统运行于最小安全模式下,将接收的上注数据存入载荷软件装载区1,内核软件根据上注信息中的标识字选择重载模式。若选择直接运行模式,采用函数地址重映射在轨编程技术,在安全模式软件预留的“后门”函数中嵌入跳转指令目标码,使PC指针跳转执行载荷软件装载区1中重载后的载荷软件。若选择EEPROM固化模式,则先进行在轨编程数据CRC校验,校验正确后通过对EEPROM存储芯片进行开锁、写入操作,依次完成3份载荷程序的烧写。最后通过遥控指令对计算机进行断电、上电操作,内核程序将EEPROM中已更新的载荷程序加载至SRAM中后自主运行。
当部分软件功能需在轨修改时,需对个别软件模块或目标码进行重载。为解决传统模块级在轨编程方案需预先指定模块、固定地址或预留空间余量的限制,采用函数地址重映射在轨编程技术,实现任意模块灵活在轨编程。将新程序模块和跳转地址表上注到在轨编程区,再通过地址表新旧模块映射关系,将旧函数入口的目标码修改为跳转指令,将程序执行路径映射到在轨编程区的新模块入口处,实现了模块替换。模块级在轨编程原理如图6所示。
图6 软件模块在轨编程Fig.6 Over loading flow of software module
进一步将函数地址重映射技术推广到目标码级,当某修改仅涉及到个别语句时,对任意内存地址目标码进行直接替换,实现以目标码为最小单位的灵活修改。
以SPARC TSC695F处理器星载计算机C语言内核软件为例,讨论其实现方法。
上电或复位后,入口引导程序通过对复位原因status的判断,选择装载应用程序、安全模式程序或调试程序运行。
包括地面编程数据包生成和飞行器内核软件重载实现两部分。
3.2.1 地面编程数据包生成
根据上述的在载荷软件重载原理,先要由地面工具软件生成所需的在轨编程数据包。该工具软件通过导入载荷软件编译生成的可执行程序,根据通信帧格式生成编程数据包、CRC校验信息。编程数据包由编程信息包和跳转指令包构成,包含编程模式、嵌入点地址、CRC校验值等关键信息。
3.2.2 内核软件重载实现
当系统运行于最小安全模式时,通过测控通信接口接收地面上注的在轨编程数据,并对数据包信息进行解析。
上注数据内容包括:新的载荷软件数据包、编程信息包、跳转指令包。其中:编程信息包结构体,用于背景任务中判断编程模式、CRC校验值等信息;跳转指令包结构体,包含了嵌入指令嵌入地址、嵌入指令等信息。
在背景任务中判断重载模式,并判断校验正确性。
在直接运行模式下,RemapProgramTable函数将后门函数onlineProgramEx中的3句Nop指令替换成跳转至新注入载荷软件入口地址的目标码,实现SRAM中完整载荷程序的重载,或将原始载荷程序中某模块起始地址替换为跳转至上注新模块的机器码,实现模块级替换,或直接对某一地址的机器码进行替换。
在固化模式下,将新上注的载荷程序依次烧写3份至EEPROM中,实现载荷程序在轨升级固化。
本文提出了一种基于安全内核的高可靠嵌入式软件架构,通过内核软件实现用户程序的可靠加载,并且在用户程序完全失效的极端情况下,内核引导程序自动加载PROM中的最小安全系统,保证飞行器的姿态、能源安全,通过软件嵌入技术,突破了预先指定模块、固定模块地址或预留空间余量等诸多限制,采用函数地址重映射技术,实现完整载荷程序、任意模块或任意地址机器码的多级灵活替换,并可选择将重载后的载荷软件在EEPROM中固化,实现载荷软件在轨升级固化[5]。文中基于SPARC处理器的星载计算机设计已经实现,也可用于其他架构的嵌入式计算机中[6]。该设计方法已成功应用于某航天器的控制系统并经过了在轨验证。
[1] 朱 虹,王海燕.一种星载软件在轨编程功能的设计和实现技术[J].上海航天,2004,21(1):26-31.
[2] 郭 勇,朱宏明,贺彦博.基于ADA语言的星载软件在轨编程技术研究[J].电脑知识与技术,2008(34):1641-1644.
[3] 李彦斌,吉 峰,黄 勇.一种星载DSP软件的在轨编程方法[J].制导与引信,2011,32(4):37-41.
[4] 卢俊玲.嵌入式系统内核软件研究[D].西安:西北工业大学,2003.
[5] 王 静.软件智能嵌入技术的研究及其安全应用[D].广州:广东工业大学,2007.
[6] WEI Xu,PIAO Yong-jie.Bootstrap loader design of aerospace payload controller based on TSC695F[C]//2010Second International Conference on Computational Intelligence and Natural Computing (CINC).Wuhan:ISEC,2010:60-64.