8.3.4 操作系统功能应用

8.3.4 操作系统功能应用

8.3.4.1 应用软件的动态加载

动态加载技术可以让程序的设计者脱离复杂的导入表结构,在程序空间中构造类似于导入表的调用引入函数机制。该机制能够实现多个应用软件独立开发、分离编译,改变传统星载软件集中开发编译的模式。

1)ELF文件格式

ELF(executable and linking format)文件是由编译器和链接器生成,用于保存二进制程序和数据以方便处理器加载执行的文件格式。最初是由UNIX系统实验室(UNIX System Laboratories,USL)开发并发布作为应用程序二进制接口(application binary interface,ABI)的一部分。ELF文件格式分为三种:

(1)可重定位文件(relocatable file)。包含可以与其他目标文件链接来创建可执行文件,或者共享目标文件的代码和数据。

(2)可执行文件(executable file)。包含可以执行的一个程序,此文件规定了exec函数如何创建一个程序的进程映像。

(3)共享目标文件(shared object file)。包含可以在两种上下文中链接的代码和数据。首先链接器可以将它和其他可重定位文件一起处理,生成另外一个目标文件。其次动态链接器(dynamic linker)可以将它与某个可执行文件以及其他共享目标一起组合,创建进程映像。

2)AIC-OS中的ELF文件

AIC-OS中的ELF文件有以下几种:

(1)内核模块文件(.ko结尾)。由源文件编译得到的目标文件链接生成,属于“可重定位文件”。

(2)可执行文件。由编译得到的目标文件链接生成,是一种位置无关的“共享目标文件”,应用程序文件必须指定程序入口(通常为main函数)。

(3)动态链接库文件(.so结尾)。由编译得到的目标文件链接生成,是一种位置无关的“共享目标文件”,但是没有程序入口。

(4)静态链接库文件(.a结尾)。根据编译得到的目标文件使用归档命令(ar)生成,用于程序链接。

AIC-OS应用程序源码编写完成后,首先要使用gcc将源文件编译成中间目标文件,然后根据实际情况链接成内核模块、应用程序或库文件,其文件生成流程如图8- 14所示。

图8-14 AIC-OSELF文件生成流程

3)AIC-OS动态加载器功能

AIC-OS动态加载器具备以下功能:

(1)支持内核模块、位置无关的可执行程序以及动态库的加载。

(2)支持加载应用程序时自动加载应用程序所依赖的库文件并且自动解决依赖关系。

(3)支持程序运行过程中通过操作系统接口手动加载。

(4)支持C++全局对象自动构建、析构等操作并且支持C++异常处理。

8.3.4.2 多线程/多进程应用软件开发

基于操作系统的多线程、多进程机制能够最大限度地利用硬件平台资源。基于星载操作系统多进程、多线程开发,一般包括操作系统管理(OS)进程、数管(DM)进程、姿轨控(ZGK)进程三方面。星载操作系统首先启动OS进程,由OS进程在完成必要的初始化工作后,分别启动DM进程和ZGK进程,如图8- 15所示。

图8-15 星载软件启动流程

多进程/多线程开发模式中,需要利用操作系统内核提供的进程间通信或线程间通信服务保证数据的有效性和一致性。多个星载应用软件之间不可避免地需要交互信息,这些进程间通信方式有:命名消息队列(用于DM进程向OS进程和ZGK进程广播时间信息)、命名信号量(用于OS进程在收到遥控命令后分别通知DM进程和ZGK进程)、共享内存(用于三者共享各自心跳、遥控和遥测信息)。每个星载应用进程内涉及的线程间通信方式有信号量(用于实现线程间的同步)、互斥量(用于实现临界资源的保护)、消息队列(用于发送遥测)。星载应用进程之间的信息流交互如图8- 16所示。

图8-16 星载应用进程之间的信息流交互

星载操作系统的管理进程负责启动DM进程和ZGK进程,收集解析由地面发送的遥控命令(如果是在轨编程命令,那么接收动态链接库文件,并存储到文件系统的合适位置)并主动通知DM进程和ZGK进程,接收来自DM进程消息队列发来的时间广播信息并更新自己的时间等功能。OS进程软件设计如图8- 17所示。

图8-17 OS进程软件设计

数管进程负责时间的管理、遥测的收集组织和发送、遥控命令的获取解析和执行、热控管理、能源管理、程控管理、总线管理、安全管理和自主规划管理。其中的热控管理、能源管理、程控管理、总线管理和自主规划管理等线程仅仅是作为一个功能线程去执行,没有实际的具体任务。DM进程软件设计如图8- 18所示。

图8-18 DM进程软件设计

姿轨控进程结构相对较简单,主要是执行自身进程时间管理、遥测处理、遥控执行、主任务、次任务及软件看门狗工作等。其中,时间管理接收来自DM进程的时间广播,利用该广播的时间值更新自身时间。在遥测处理线程中更新自身计数,写入共享内存区。收到OS发来的遥控更新信号量时,读取共享内存区消息,执行遥控命令,ZGK进程软件设计如图8- 19所示。

8.3.4.3 软件在轨升级技术

基于星载操作系统的软件在轨升级支持数据包的断点续传能力,针对在轨无法上注完成的大规模的软件能够实现多轨分段上注,最终重新组装完成大规模软件在轨更新换代;利用星载嵌入式操作系统的分离编译和动态加载的特性,采用动态链接的方式实现星载软件自主链接到升级后的可执行模块,无须操心待替换模块地址信息;另外,基于动态链接实现软件在轨升级后,无须重启整个星载软件,只需针对性地重启对应的线程,保证整个星载软件系统功能不中断的执行。

图8-19 ZGK进程软件设计

1)基于动态链接库的任务级更新

动态链接库为软件开发过程中提高复用率和降低软件模块耦合性提供了可能,即将公共的模块提取出来,做成动态链接库以供应用程序中直接调用。

动态链接库在使用过程中有以下两种方式:

(1)载入时动态链接。指在编译链接应用程序时,通过“1”参数方式指定,即在编译链接时已经将该动态链接库的信息添加到该应用进程中。但是该种方式有不足之处,即当应用程序在运行过程中,需要更新动态链接库,并在完成后,还需要重新启动应用程序一次。因为在应用程序第一次启动时,已经将动态链接库的信息都读到该进程的内存空间中,更新的是文件系统中的动态链接库,要想使用被更新过的动态链接库中的信息,必须重新启动相应的应用程序。

(2)运行时动态链接。指在编译链接时不指定使用的动态链接库文件,而在程序中利用dlopen()系统调用打开动态链接库文件,利用dlsym()系统调用,将需要使用的动态链接库中函数进行映射一次,即可使用返回的函数指针进行函数调用。这样的使用方式有个好处:即使将该动态链接库文件进行更新替换,再次dlopen()和dlsym()进行映射对应的函数,操作的动态链接库包含一个函数,影响范围小,且运行中的进程不需要重新启动。而且,对动态链接库的关闭和函数映射时间极短,通过相应的机制可以保证函数调用的正确性。

2)系统级动态更新升级

系统级重构主要通过嵌入式操作系统镜像文件数据上传,接收完整数包后,进行镜像文件数据完整性的校验,当完整性校验通过后,将本次接收到的镜像数据存入外部存储介质——Flash中。为保证写入数据过程的正确性,针对内存缓冲区中的数据计算CRC和MD5校验码,在完成对Flash存储介质的写入后,进行读取校验一遍,同前述计算得到的CRC和MD5校验码进行比较。如果两者一致,那么表明本次的写操作有效,发送嵌入式操作系统重启信号;否则,放弃本次的更新升级过程。

更新升级过程同任务级更新过程相同。通过上注工具,选择需要更新的嵌入式操作系统镜像文件,格式为elf或lzo文件。系统运行过程中,动态更新模块在阻塞监听发送的数据包,对接收过程和接收数据进行监视判断,完成系统级动态更新升级。

8.3.4.4 星载服务中间件技术

航天器电子系统应用软件领域的特殊性决定了其与普通嵌入式应用软件的独特性。航天器专用服务组件用于支撑航天器电子系统软件常用功能,将专用功能模块化后集成至操作系统中。星载服务中间件技术包括如下:

(1)航天器时间维护服务。提供星上系统时钟服务,支持主、备时钟切换,对外提供时钟授时、拨快/拨慢校时接口。另外,时间服务中间件还支持遥测中断时间和GPS时间锁存功能,并对外提供锁存时间的接口操作。

(2)在轨编程服务。提供星载计算机平台中软件在轨编程功能,对外提供在轨编程包接收缓存池,文件加压缩、MD5校验操作,支持对内存、非易失存储器等不同位置应用软件和库文件的在轨编程功能。

(3)遥控数据服务。提供整星上行遥控数据的接收缓存功能。遥控数据服务中间件,作为一个高优先级的线程运行在后台中,实时接收BSP层传送的遥控数据包。星载软件在应用层通过遥控接收队列的出口,一个一个处理遥控数据包。

(4)遥测服务。提供符合CCSDS标准的遥测组帧和发送遥测数据帧的服务。遥测服务中间件通过信号量定时唤醒应用层软件,获取最新的遥测数据,然后按照CCSDS格式组帧,下传给信道关口模块。

(5)数据缓冲服务。提供中小数据量的数据缓存服务,为应用层软件提供可靠的数据缓存功能和便捷的调用接口,提高应用软件的开发效率。

(6)飞行事件管理服务。飞行时间管理服务中间件技术提供一种飞行事件服务的管理框架,用户向该服务框架注册具体的飞行事件和飞行参数,利用成熟的飞行事件服务框架管理注册的具体飞行事件,提供服务的可靠性。

(7)总线服务。提供包括RS-422总线、CAN总线和1553B总线等的接收和发送服务,对于CAN总线和1553B总线实现了整星控制总线通信协议栈,应用软件只需关心具体的数据内容,对于数据组帧,解析全部由总线服务中间件完成。