软件开发|编程技术|编程代码|编程入门先学什么—程序设计语言

嵌入式系统软件体系结构设计

摘 要:本文采用嵌入式实时系统软件设计方法对星载姿轨控计算机系统进行设计,软件系统采用层次模块化结构。采用嵌入式实时操作系统连接姿轨控应用程序和底层硬件,文中给出了姿轨控计算机软件系统设计流程图、软件应用层纵横结合型结构,以及任务模块调度管理的仿真结果。
引言
软件体系结构是对软件各高层抽象的理解,必须在较早阶段对软件进行体系结构层的分析,其中算法和数据结构的选择处在软件体系结构的较低层次上。系统结构的问题包括:用一系列组件来组织一个系统,全局控制结构,通信、同步和数据存取协议,设计元件之间功能的划分,物理的分布方式,系统运行状况的估计和测量,演化方向,设计模式的选择等,这些都是设计阶段的软件体系结构。
传统星载软件的设计方法、开发手段已不能适应日益复杂的需求,采用微内核的实时操作系统作为软件的系统结构是一种缩短开发周期、调试方便有效的快速解决方案。经过比较,在采用32位微处理器的前提下选用Vxworks嵌入式实时操作系统。

图1 纵横结合型体系结构设计

软件体系结构分析与总体设计
目前比较普遍的体系结构有:
管道和过滤器型
这种体系结构中每个组件有一系列输入和一系列输出,一个组件从它的入口读取数据流,在它的出口产生数据流。组件就是过滤器,在组件之间传送数据的接口即管道。
面向对象的组织方式
数据和它的原始操作是封装在对象内部,对象通过事件驱动来协同工作。对象要保证内部数据的正确性和对外实现方法的隐藏性。
共享存储体型
包含两种不同的组件,中心数据结构代表当前状态,一系列独立的组件来操纵中心数据存储,并通过中心存储体相互通讯。
解释机型
用软件产生的一个虚拟机,模仿其他机器,解释并执行特定的指令序列。
垂直型
包含一系列类,并将它们组织成层次和线索。层次是在相同抽象层次的一系列类。线索是一类子系统,它们之间存在调用与被调用的关系,在执行后,完成一个子系统的功能。
层次型
一个分层系统中,每一层向它的上一层提供服务,同时使用它的下一层提供的服务。这种结构支持基于抽象层次的设计、演化和重用。层次型又分为横向型、纵向型与纵横结合型。
横向体系结构,是指某一个软件系统可分为多个层次,层次之间的组件关系较为简单,只有上层组件调用下层组件的关系,而同一层次内部各组件之间的联系较为密切,相互之间传送消息比较频繁。在采用体系结构的基础上,按信息流来划分边界,信息流内部再划分子系统。
纵向体系结构中包含层次和线索两个概念。层次是指在相同的抽象层次上的一系列组件,而线索是子系统的特例,指所包含的一系列组件用于完成一个功能。纵向的软件结构具有可理解性、可适应性、可重用性。
纵横结合型体系结构中,一个组件不仅在垂直方向与其他组件发生关系,同时在水平方向也与其他组件发生作用。针对卫星姿轨控系统的需求,软件系统采用纵横结合型体系结构,如图1所示。
在姿轨控软件结构设计上要力求简单,模块化结构的软件易于单独开发而后集成,在按照共同的数据接口开发后,便于测试,若在轨运行过程中出现问题,易于查找错误和排除错误,从而到达提高可靠性的目的。在设计小卫星软件系统的过程中,可以借鉴“模块化公用舱”和“软件总线”思想,对星载嵌入式软件系统的开发采用模块化软构件来设计软件的功能模块,从而提高软件开发的效率、程序的质量,并改进维护方式。

图2 设计流程图

图3 仿真图

图4 仿真图


从软件角度,姿轨控软件主要完成以下功能:设置系统工作模式、部件工作状态;接收星务总线传来的轨道参数、在轨编程信息等;实时采集数据并进行处理;根据控制律,计算控制指令,对太阳或地球跟踪定向;在轨检测、系统重构等。可将星载控制计算机软件分为三部分:系统引导程序、系统软件、应用软件。

设计流程与任务调度方式
实时操作系统为应用软件和其它模块提供运行环境和多任务管理。应用软件通过设备驱动模块采集敏感部件的姿态信息和GPS接收机的轨道信息,进行控制规律的解算,并通过设备驱动模块控制执行机构和太阳帆板。程序和数据注入模块通过数据总线获得地面的程序或者数据注入到应用软件;遥测遥控数据管理模块通过数据总线与地面测控系统进行数据和指令的传输。软件结构设计流程如图2所示。
姿轨控应用程序在实现上由多个任务协同工作完成,在结构上分为多任务调度管理任务(或称为Schedule任务)、遥测遥控任务、故障诊断及系统重构任务、程序和数据注入任务、系统工作模式管理任务、姿态确定与控制、轨道控制等应用任务模块。
作为多任务操作系统,为了突出实时性,降低系统调度的开销,它的任务并不是真正的任务而是线程。姿轨控系统各个任务可以工作在系统级或者应用级,而且有许多不同的运行方式,这些都可以在使用中自由选择,软件设计人员有很大的灵活性。因此在姿轨控软件的设计中,要充分考虑到嵌入式软件的设计特点,合理利用它的特性。
在整个姿轨控系统中多任务管理任务工作于系统级,其他的任务均工作于应用级。工作于系统级的任务有更高的权限且受到操作系统的保护,这样可以防止应用程序对系统程序的误操作,Schedule任务负责对其他任务的管理,工作于系统级。在其他的任务中与硬件相关的底层任务优先级较高,其中故障检测与恢复任务级别最高,其次是遥测遥控管理任务,最后是姿态系统I/O任务。
在姿轨控软件系统中,所有的任务都被设置成可以被中断的工作方式,以充分发挥硬件中断的作用,在一定程度上提高了程序运行的并行度。在任务调度上,所有任务都工作在可剥夺的调度方式下,即在任何时刻,只要有一个任务进入就绪状态而且优先级高于正在运行的任务,则立即挂起当前的任务,转而执行新的任务,直到这个任务执行完成后,再唤醒原来被挂起的低优先级任务。

多任务调度管理的仿真实现
采用开发工具Tornado,运用系统集成仿真器VXSIM来进行任务模块调度的仿真。仿真时考虑一种特殊情况:遥测遥控任务taskTelemetry打断模式管理任务taskManager的执行,但在遥测遥控任务执行的过程中,系统发生了故障,则遥测遥控任务也被故障检测及系统重构任务taskFaultdeal中断,待系统故障处理完后恢复执行taskTelemetry任务,完成后再恢复执行工作模式管理任务。其仿真结果如图3所示。
针对卫星姿轨控系统的需求,应用软件系统采用纵横结合型层次体系结构。通过姿轨控系统工作模式管理模块对各应用软件任务模块的调用来完成姿轨控应用软件系统的功能。在每执行完一个任务后,自动读取任务模块调度表中的下一个任务,通过计算,确定下次任务开始执行的时间,并开始计时,时间到达后,据飞行任务模式字等内容创建并运行相应的姿轨控应用任务模块。对于需要再次调用的任务在运行完后挂起,等下次用时激活运行即可;对于不会再次调用的任务则在运行完后删除,以免占用空间。
根据卫星的工作模式,采用二维结构体数组Table[][]来定义任务模块调度表。作为数组元素的构体变量包括任务名taskname、任务优先级taskpri、任务标志位taskflag等,其中任务名、任务标志位定义为字符串数组,如下所示:
struct scheduleTable
{char taskname[12];
int taskpri;
char taskflag[8];
}Table[][];
采用双重循环语句来读写任务模块调度表,调用相应任务模块,从而实现系统工作模式的管理,完成姿态轨道控制任务。模块调度表定义为modenum×tablenum维数组,modenum为系统工作模式数,tablenum为当前工作模式下需调用的最大任务模块数,程序语句如下:
for (I=1;I<=modenum;I++)
for(J=1;J<=tablenum;J++)
{ /*据任务标志位进行判断;*/
taskspawn()/taskRestart(taskIdmodule);/*创建或直接启动任务Table[][].name;*/
........
taskDelay();
taskSuspend()/taskDelete(taskIdmodule); /*据需求挂起或删除运行完毕的当前任务;*/
}
仿真程序演示了卫星工作模式1调用module1、module2完成相应姿轨控任务,工作模式2调用module3、module4、module1来实现姿态轨道控制。module2运行完后释放表明工作模式1结束的信号量,再运行taskJudger任务进行工作模式切换,经判断进入模式2,调用module3、module4、module1,模式2结束再进行模式切换。依次类推,循环完成姿轨控任务。仿真结果如图4所示。
任务模块运行顺序:工作模式管理模块→module1→module2→工作模式管理模块→module3→module4→module1→工作模式管理模块→module4→.......

结语
本文设计的姿轨控计算机软件系统采用层次模块化设计和适合星载计算机系统需求的嵌入式实时操作系统,能达到星载软件易调试、移植性强、易维护的目的,可适应有限的星载嵌入式控制计算机的计算能力和存储空间,缩短开发周期、保证可靠性,模块结构保证了星载软件的可靠性和可重构性,对卫星型号系列化和软件工程化有重要意义。