一种卫星综合电子应用软件遥控解耦设计方法

2022-08-02 14:08李光旭万丽景钟睿明周中泽陈志华
空间控制技术与应用 2022年1期
关键词:遥控子系统指令

李光旭, 万丽景, 钟睿明, 王 裙, 周中泽, 陈志华

北京控制工程研究所, 北京 100094

0 引 言

随着对卫星集成度、成本、体积、功耗、研制周期的要求越来越高,卫星计算机的集成度、计算能力都大幅提高,原来采用数管计算机完成星务管理功能,采用姿轨控计算机完成姿轨控功能的模式,逐步被一台卫星综合电子计算机完成星务管理功能和姿轨控功能的模式所取代,从而满足卫星对成本、体积、功耗和研制成本的要求[1-4].

卫星综合电子计算机要实现总线管理、热控、能源、遥控、遥测、FDIR、GNC、轨道等功能,卫星综合电子计算机应用软件的规模和复杂度较以往大大提高,软件架构设计的功能解耦、可扩展性、可维护性变得尤为重要[5-7].

本文对卫星综合电子计算机应用软件必备的遥控功能,运用HASH表和链表技术使软件遥控机制与子系统之间解耦,同时提高了软件遥控的时间性能和时间均匀性,提高了软件的可扩展性和可维护性[8-16].

1 遥控软件的主要功能及遇到的问题

卫星综合电子应用软件的遥控功能,即接收遥控指令,修改或者注入星上的变量或者任务场景的值,完成预期任务.遥控功能的主要过程:

1)接收测控系统的遥控指令;

2)按照遥控协议(如CCSDS)进行协议解包(遥控机制功能);

3)根据协议的内容修改相应的变量或者任务场景的值(指令执行功能).

由于航天嵌入式软件的高可靠性要求,需要对每条指令的指令命令字、长度及指令的具体内容进行验证.一般的设计方法,在遥控机制中定义一个含有全部指令命令字(KEY)、长度及挂接函数的遥控指令参数表,遥控参数表的命令字(KEY)按照从小到大的顺序排列,在遥控机制部分通过对遥控指令参数表的命令字(KEY)进行折半查找的方法,找到命令字(KEY)的位置,对遥控指令的命令字和长度进行匹配验证,通过挂接的指令执行函数进行指令内容的验证和执行,对指令具体内容进行验证和执行的子函数放在子系统的软件遥控功能中.

这种设计方法将具体指令的验证和执行函数放到各个子系统软件功能中,减少了子系统遥控功能和遥控机制功能的变量耦合,但遥控机制功能中需要知道所有指令命令字、长度和执行函数的地址(遥控指令装订参数表),通过装订参数表的方式造成了遥控机制功能和子系统的指令执行功能没有完全隔离.

遥控机制功能中查找命令字(KEY)的折半查找法,指令的最大查找速度依赖于所有命令字(KEY)的个数,并且要求指令必须按照从小到大的顺利排列.这种实现方法要求程序设计人员对程序的实现原理必须清楚,否则,如指令参数表初始化不完全,命令字插入的位置错误,都会造成遥控错误.在实际的过程中,多次出现过指令的命令字排序错误造成指令验证不通过的情况.

综上所述,现在的设计方法存在如下问题:

1)在遥控机制中定义的遥控指令参数表,破坏了遥控机制与子系统之间的独立性,遥控机制触及了子系统的具体内容;

2)遥控指令参数表的折半查找方法查询效率低,查找次数离散度大,且容易维护出错;

3)扩展性、维护性差,如果在轨注入一个新的功能有新的遥控需求,必须对原来的程序和指令参数表进行修改,更改影响域难以分析.

2 解决方法

1)HASH表

HASH是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.HASH根据关键码值(key value)而直接进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做HASH.散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位.

2)双向链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.

卫星综合电子应用软件遥控指令的HASH函数构造采用简单实用的除留余数法,遥控指令的KEY值对数N求模,得到HASH表的下标位置.这样会出现一个问题,不同的遥控KEY值通过求模后可能对用同一个 HASH表的下标位置,这就是HASH冲突,在本文中通过链地址法来解决HASH冲突的问题.HASH数组的每一个元素不仅是一个进入对象,还是一个链表的头节点,每一个Entry对象通过next指针指向他的下一个Entry节点,当新来的Entry映射到与之冲突的数组位置时,只需要插入到对应的链表中即可[1],HASH-链表的原理示意图见图1所示.

总结上面描述的HASH-链表形成过程如下:1)定义一个链表头结点的HASH表;2)遥控指令的KEY通过求模函数对N求余,得到HASH表的下标位置,并以链表节点的形式插入到对应HASH表下标位置的双向链表中;3)如果有不同的遥控指令的KEY值HASH化后对应相同的HASH表下标位置,则依次插入到相应的双向链表中.这样具有相同下标位置的遥控指令就形成了一个双向链表.

通过遥控指令的KEY值找到HASH表的下标位置,通过对HASH表下标位置对应的双向链表进行查找,就能得到遥控指令验证、执行所有的信息.

3 具体实例

(1)公共接口定义

/* 宏定义 */

typedef struct list_head HashTable;

#define hash_init(node)

#define hash_insert(table, cell)

#define hash_find(pos, table, userkey, type_of)

/* 链表头定义 */

struct list_head

{

struct list_head *next, *prev;

};

/* 遥控指令hash节点数据结构 */

typedef struct TAG_COMMMAND_LIST

{

unint32 key; /* 为指令id */

unint32 len; /* 指令长度 */

unint32 pfHandle; /* 指令处理函数 */

/* 哈希链区 */

struct list_head list; /* 链表数据结构 */

} SCommandList;

/* HASH表定义 */

HashTable cmdHashTable[203];

(2)子系统具体示例

下面以热控为例说明在子系统的具体应用方法,能源、总线、FDIR、GNC等分系统的使用方法与此相同.

1)热控指令声明

热控指令的声明如图2所示.

图2 热控指令定义示例

2)热控指令插入HASH表中

调用hash_insert将mCommandListHeat[10],依次插入到cmdHashTable中.

通过公共接口定义,各个子系进行具体指令的定义,并插入到HASH表中,遥控指令的具体处理都封锁在各个子系统内,上层通过统一的接口hash_find访问子系统的具体内容.

(3)效果分析

1)解耦性

通过上述的方法,遥控机制里提供了统一的遥控接口定义和插入方法,各个子系统各自定义自己的命令字和命令解析函数,遥控机制通过统一的接口函数访问各个子系统定义的命令字和命令解析函数,遥控机制功能和子系统的遥控功能完全隔离.

如果卫星在轨增加一个新的子系统,可以按照(2)的过程进行定义和注册,能做到不改动原来程序的情况下,增加新的子系统遥控功能,软件的影响域小,软件的可扩展性和可维护性大大提高.

2)查找性能结果比对

图3对比了在指令关键字都是200个的情况下折半查找和HASH链表查找指令的次数比对,由图3可以看出折半查找的均值在7次左右,分布于1-8之间,HASH链表查找的大部分1次就能找到具体指令,少数会出现2、3次找到指令的情况,HASH链表查找的性能比折半查找的效果要好,HASH链表查找的均匀性比折半查找的效果要好,指令的个数越多这种效果越明显.

图3 折半查找和HASH链表查找次数比对图

4 结 论

卫星综合电子应用软件实现了星务和GNC控制的功能,从整体上缩短了研制周期和节约了开发费用,但也带来了软件规模和复杂度的提高,怎样从架构上减少软件之间的耦合,并提高软件的可扩展和可维护性变得尤为重要.本文针对卫星综合电子应用软件的遥控功能,提出用HASH表和链表的方法解决了软件功能耦合问题,提高了软件的可扩展和在轨维护,此方法还可以应用到其他类似的应用场景如遥测等.

猜你喜欢
遥控子系统指令
“遥控”老师
《单一形状固定循环指令G90车外圆仿真》教案设计
新机研制中总装装配指令策划研究
他是如何遥控引爆的
关于ARM+FPGA组建PLC高速指令控制器的研究
网络空间供应链中入侵检测及防御子系统的投资机制研究
网络空间供应链中入侵检测及防御子系统的投资机制研究
团队与知识管理的关系研究
浅谈中职学校新型模块化机房建设
遥控赛车