引言
以卫星或宇宙飞船为平台的空间相机工作在距地球100 km以上的外层空间,一旦发生故障无法修复,或修复的成本极高,如美国2009年5月对哈勃望远镜的第5次修复就耗费约9亿美元[1]。如果空间相机控制器具备在轨程序重注功能,即当空间相机在轨发生故障或发现软件缺陷时,能在地面通过测控天线将重注程序的二进制码流发送给在轨飞行的空间相机,空间相机在校验成功后执行,即可对故障和缺陷进行修复,延长空间相机寿命,节约昂贵的维修费用。
数字信号处理器(Digital Signal Processor, DSP)采用了哈佛结构、超标量流水线、多总线和专用硬件运算部件等技术,可以实现低功耗下的高速实时信号处理,是理想的空间相机控制器[23]。本文提出了一种基于DSP的空间相机控制器在轨程序重注方法,给出了重注程序接收、存储、校验和执行的流程和代码,并给出了DSP重注程序的编写和生成方法。并以重注死循环程序为例,对在轨程序重注方法进行验证。
1在轨程序重注方法的实现
图1为DSP空间相机控制器的组成原理[4],DSP程序目标代码和常量表固化在只读存储器PROM中,数据存储器SRAM中保存变量和堆栈。Flash中保存用于像移计算的电子地图。相机控制器从上位机接收指令和数据,并转发给成像单元和调焦单元。本文所用的DSP型号为TMS320VC33。DSP空间相机控制器上电或复位后从PROM运行固化的程序。为了实现在轨程序重注功能,必须在固化程序中留有处理上注程序的接口。重注程序从地面通过测控天线传送给上位机,上位机再转发给DSP。
图1DSP空间相机控制器组成原理图
DSP除了同上位机通信外,还要完成像移计算、图像对时信息采集等任务,因此当重注程序较大时,需要分多包多次上注。DSP处理重注程序的流程如下:
① 重注程序包计数器加1。
② 当收到第一包时,从重注程序接收缓冲区中读取重注程序包数,同时将重注程序过往包加载成功标识置位,并清零重注程序总长度、重注程序总累加和与重注程序可用性标识。
③ 当从重注程序接收缓冲区中读取的当前包序与重注程序包计数器值一致,即包序正确时,依次将重注程序从重注程序接收缓冲区加载到RAM或Flash中指定位置,然后再从该位置读出,将32位数据拆分成8位数据,计算累加和。如果包序错误,重注程序包计数器减1,跳至模块出口。
④ 如果累加和校验成功,置位当前重注程序包加载成功标识,否则清零当前重注程序包加载成功标识。
⑤ 将当前重注程序包加载成功标识和重注程序过往包加载成功标识进行与运算,结果赋给重注程序过往包加载成功标识。
⑥ 从重注程序接收缓冲区中读取当前包重注程序累加和,将之累加到重注程序总累加和缓存值。
⑦ 从重注程序接收缓冲区中读取当前包重注程序长度,将之累加到重注程序总长度缓存值。
⑧ 当重注程序包计数器值等于重注程序包数,即收到最后1包时,清零重注程序包计数器,然后判断重注程序过往包加载成功标识。如果重注程序过往包加载成功标识被置位,说明所有包都加载成功,置位重注程序可用性标识;否则清零重注程序可用性标识。
在重注程序加载成功后,接收到执行重注程序指令后DSP开始执行重注程序。执行重注程序标识被置位时,若重注程序可用性标识被置位,依次读出全部重注程序,将32位数据拆分成8位数据后计算字节累加和,如果计算得到的累加和和重注程序总累加和缓存值相等,在对相关寄存器压入堆栈后,跳转到重注程序加载的首地址开始执行,返回时将相关寄存器弹出堆栈;如果计算得到的累加和与重注程序总累加和缓存值不相等,清零重注程序可用性标识。部分源代码如下:
……
if (sumtemp == ReProgramSum) {/*如果校验成功*/
asm("PUSH R7"); /*将R7压入堆栈*/
asm("LDI @_ProgramStartAddr,R7 ");
/*将重注程序加载的首地址送入R7*/
asm("CALLU R7");
asm("POP R7"); /*将R7弹出堆栈*/
}
else{/*如果校验失败*/
……
}
从源代码中可以看出,由于要进行堆栈操作和跳转操作,必须使用汇编指令才能实现,因此采用了asm语句内嵌汇编的方法。这里需要注意的是,使用CALLU调用指令,而非BR跳转指令,由于CALLU指令自动将当前PC指针的内容压入堆栈,然后将R7的内容赋给PC指针。而BR指令只是将R7的内容赋给PC指针,没有对当前PC指针的内容进行保存,从而会出现一开始执行重注程序就跑飞的现象。
2重注程序的编写
重注程序可以分为3类: 补丁型重注程序、替代型重注程序和死循环重注程序。补丁型重注程序在执行完毕后返回主循环,继续执行固化程序,并作为主循环的一部分,主循环每循环一次就执行一次重注程序。替代型重注程序重新构造一个主循环,而不返回执行固化程序,为了避免看门狗复位,需要在重注程序的主循环中喂狗,为了能够替代原固化程序完成与上位机的通信功能,并影响其他中断,需要重新对中断向量表的位置进行设置。在空间相机控制器的地面测试中使用最多的是死循环重注程序。当上注死循环程序并执行后,DSP进入一个无限循环,但没有喂狗操作,导致看门狗电路产生复位脉冲,使DSP相机控制器复位,这实质上是一个热启动过程。通常要求DSP相机控制器具有热启动计数功能,即当DSP相机控制器由于受到干扰或供电电压波动而热启动时,对热启动计数器加1,并将热启动计数作为遥测返回。因此通过上注死循环重注程序可以同时验证DSP的程序重注功能、看门狗电路功能和热启动计数功能。
表1为重注程序结构。由于上注的重注程序可以各种各样,每包重注程序的长度也变化不一,因此需要通过参数长度来通知DSP,和上位机通信的过程中需要连续收多少个字节的数据。重注程序包数和重注程序包序用于DSP在收到多包重注程序时对上注顺序的正确性进行检查。重注程序加载地址为本包重注程序需要加载到的绝对地址,重注程序代码长度给出了本包重注程序加载结束的位置。重注程序帧校验和用于对本包重注程序进行和校验,只有校验正确,才会进行加载。
表1重注程序结构
首先在Code Composer Studio(简称CCS)中使用DSP汇编语言编写死循环程序如下:
.text
_main:AND 0Dfffh,ST
lps:NOP
BR lps
RETSU
可以看出,在程序中首先关闭所有中断,然后进入一个无限循环中,循环中不作任何操作。关闭中断的目的是为了停止所有中断服务程序的运行,避免由于中断服务程序中的喂狗操作导致系统不复位的情况。对应的链接命令文件(*.cmd)编写如下[5]:
MEMORY{
……
SRAM: org=0091A000H len=00005000H
}
SECTIONS{
……
.text: > SRAM
}
这里需要注意的是,DSP程序中的标号在编译时由CCS根据CMD文件中SECTION(段)指定的地址自动转换为真实的地址,因此必须将SRAM的org设定为重注程序的加载地址。由于本文要把死循环重注程序加载至地址91A000H处,因此将SRAM的org设定为91A000H。编译后形成的十六进制目标代码如下:
02 F5 DF FF0C 80 00 00 60 91 A0 01 78 80 00 00
其中60 91 A0 01对应BR lps指令,可以看出标号lps在编译时被自动替换为地址91 A0 01。则按表1构造的完整重注程序如下:
18 01 00 10 91 a0 00 02 F5 DF FF 0C 80 00 00 60 91 A0 01 78 80 00 00 2D
由于死循环重注程序很短,一共只有1包,包序号为00。
3实验验证
为了验证本文提出的DSP空间相机控制器在轨程序重注方法和重注程序编写方法的正确性,将前面生成的死循环重注程序通过上位机发送给DSP空间相机控制器,用CCS通过DSP仿真器观察重注程序的加载情况。加载结果如图2所示,从图中可以看出,目标代码正确加载到了地址91A000H~91A003H处。
图2死循环重注程序加载结果
图3为开始执行重注程序后的结果。从图中可以看出PC指针变为91A000H,全速运行后,PC指针在91A001H和91A001H之间反复切换,说明重注程序得以正确执行。当不用仿真器,而直接从PROM中运行DSP程序时,在上注死循环重注程序并执行后,从遥测结果上看热启动计数加1,同时验证了DSP的程序重注功能、看门狗电路功能和热启动计数功能。说明本文提出的DSP空间相机控制器在轨程序重注方法和重注程序编写方法正确有效。
图3死循环重注程序执行结果
结语
针对空间相机在轨发生故障或发现软件缺陷后难以修复这一难题,本文提出了一种基于DSP的空间相机控制器在轨程序重注方法,给出了重注程序接收、存储、校验和执行的流程和部分代码。并给出了DSP重注程序的编写和生成方法。利用该方法,当DSP的空间相机控制器在轨故障或发现软件缺陷时,可以将修复程序上注后执行。上注死循环重注程序的验证实验结果表明,本文提出的DSP空间相机控制器在轨程序重注方法和重注程序编写方法正确有效。