作者:xudongxiao
声明:转载请联系作者并取得RT-Thread大赛许可,本软件不涉密
概述
本作品为了验证星务软件在RT-Thread系统运行的可行性,底层是否能够驱动星务软件,同时扩展RT-Thread应用范围。ART-Pi作为卫星下位机,星务前端用VS2010开发,两者之间通过异步串口通信。星务前端发送遥控指令,ART-Pi能够正常解析运行,并且能把星务的一些状态遥测发送至星务前端,方便地面人员查看。本作品设计的线程只有星务线程,采集线程,姿控线程,地测线程,Free线程,正常的卫星软件不止这五个线程,简化为这五个,涉及到的外设也简化为只有定时器与异步串口。
开发环境
RT-Thread版本:RT-Thread 4.0.2
开发工具及版本:RT-Thread Studio 1.1.5,Visual Studio 2010
RT-Thread使用情况概述
内核部分:线程操作(创建,挂起,删除),二值信号量
组件部分:软件定时器,异步串口,
软件包:无
其他:无
硬件框架
本作品验证RT-Thread系统,软件方面应用较多,底层硬件只需要一个ART-Pi开发板模拟卫星系统即可。ART-Pi作为卫星下位机,星务前端用一个PC代替即可,硬件框架如图1所示。
图1 硬件框架
软件框架说明
软件框架如图2所示,软件定时器以4Hz频率给星务线程信号量,星务线程启动后,检测其他各个线程的运行状况,核对线程运行时间,核对软件狗计数是否超过阈值,核对运行时间片,当都满足后,给所有线程信号量。设计的各个线程优先级如表1所示,由表可知,星务线程优先级最高,会一直运行至等待下一个信号量,依据RTT线程抢占运行原理,次一级优先级线程运行。所以在一个时间片内,线程运行顺序为,星务线程→采集线程→姿控线程→地测线程→Free线程。图中的遥测遥控部分在下一章节“软件模块原理”描述。
软件定时器于整秒处开始运行,定时器间隔为250ms,将0-249ms定义为时间片TASK_ROUNDA,将250-499ms定义为时间片TASK_ROUNDB,将500-749ms定义为时间片TASK_ROUNDC,将750-999ms定义为时间片TASK_ROUNDD。各线程运行时间片如表2所示。
表1
线程 |
星务线程 |
采集线程 |
姿控线程 |
地测线程 |
Free线程 |
优先级 |
25 |
26 |
27 |
28 |
29 |
表2
线程 |
星务线程 |
采集线程 |
姿控线程 |
地测线程 |
Free线程 |
时间片 |
ALL |
ALL |
ALL |
ALL |
NONE |
图2 软件框架
软件模块说明
软件模块分为遥控上传,遥测下传,星务软件管理三个部分,遥控上传流程图如图3-a,3-b所示。
图3-a 遥控流程
图3-b 遥控流程
1.遥控流程
星务前端依照表3所示的遥控包结构组包,并通过异步串口发送至ART-Pi串口6,其中类型占用2个字节,定义如表4所示。
表3 遥测遥控公共包结构体(STM32为小端)
|
帧头 |
长度 |
校验 |
类型 |
数据 |
长度(字节) |
2 |
2 |
2 |
2 |
n |
说明 |
固定0xEB90 |
类型与数据字节长 |
类型与数据按字节累加和 |
|
|
表4 遥控包结构的类型说明
|
类型 |
|
长度 |
1 |
1 |
说明 |
分系统类型(typeL) |
指令码(typeH) |
分系统类型:星务线程0x00,请求线程0x01,姿控线程0x02,无0x03.
指令码:自定义
地测线程将串口6FIFO读空,按照表3结构循环解析解析遥控指令,直到无可用遥控包,然后将合法遥控包存储到遥控指令缓存,等待线程来取指令;地测在存储指令前,查看遥控指令缓存是否有可用空间,有可用空间则将指令存储,并将标志位置有效状态,线程检测本线程对应的指令在缓冲区中有有效状态指令时,将指令取出,并将标志位置空闲。具体遥控指令说明参考附录。
2.遥测流程
遥测流程星上程序简单,地测线程依据包发送的时间片,符合本周期则发送,不符合则丢弃,发送的数据包结构符合表3,包下发的具体信息请参考附录。具体解包流程可参考上位机代码,非本设计详述部分,故不再赘述。
3.星务软件管理
星务初始化时,初始化各个线程,初始化硬件等;当星上软件运行起来时,检测各个线程状态,给合法线程信号量。当前线程共有三种状态,即允许运行、线程挂起、线程停止。各个线程的状态不仅受到遥控指令控制,还会与星务软件狗有关,各个线程之间的转换关系如图4所示。
图4 线程状态转换与遥控指令对应关系
图4中,红字表示发送的遥控指令,圆圈内表示当前线程状态。
星务软件设计了软件狗,软件狗的作用是为了防止线程死循环,将整个优先级之后的的线程同时卡死的问题,具体过程是每次当星务给线程信号量时,此线程对应的软件狗计数会累加,当线程运行至线程循环底部时,会将软件狗清零;如果在一个周期内,程序由于卡死在死循环或者是任务循环次数过大,导致本周期未运行至函数体底部,则星务会继续累计软件狗,当次数大于设置值时,依据设置的方式对线程处理,线程重启或者是整个操作系统重启。
演示效果
图5 星务前端上位机界面1
图6 星务前端上位机界面2
图7 实物照片
演示视频:
比赛感悟
本作品较好的实现了原定的目标,在真实情况下,RTT也会有较好表现,扩展了RTT的应用范围,对其他的类似系统也有很好的借鉴作用;但是作为功能强大的ART-Pi开发板,真正用到的功能较少,后期可以再开发一些其他的有意义的应用。
本作品所用的代码与实际卫星使用代码原理一致而具体不同,有部分借鉴的成分,主要的困难是需要将星务系统底层适配RTT,并且不能照抄原版代码,一是为了避免涉密,二是为了提高移植的意义,使我对整个卫星的软件框架有了很好的认识,对我本人从事的工作也有很好的促进作用。而且开源卫星代码的原理也让卫星代码圈子增加一点生态,也对其将来的发展有好的促进作用。
备注
本作品遥控指令包与遥测数据包解析如表所示
测试遥控包:星务分系统,指令码0xff,参数0x00,0x01,0x02,0x03
测试遥控包组帧:0x90,0xEB,0x06,0x00,0x05,0x01,0x00,0xff,0x00,0x01,0x02,0x03
星务线程遥控指令:
名称 |
指令码 |
参数 |
线程控制 |
0x01 |
Byte0:线程类型 采集线程:0x01 姿控线程:0x02 地测线程:0x03 Byte1:线程行为 允许运行:0x33 暂停运行:0x66 恢复运行:0xBB 停止运行:0x99 重启运行:0xAA |
ADC输出 |
0x02 |
Byte0~Byte1:电压值,范围0-32768,小端 |
PWM输出 |
0x03 |
Byte0:0-100,对应0-100占空比 |
OC1控制 |
0x04 |
Byte0:开关参数设置 0x55:高电平 0xAA:低电平 |
OC2控制 |
0x05 |
Byte0:开关参数设置 0x55:高电平 0xAA:低电平 |
采集线程遥控指令:
名称 |
指令码 |
参数 |
设备开关控制 |
0x01 |
Byte0:设备编号 范围0~3 Byte1:设备开关 0x55:设备开 0xAA:设备关 |
姿控线程遥控指令:
名称 |
指令码 |
参数 |
对日定向 |
0x01 |
无 |
对地定向 |
0x02 |
无 |
遥测包说明:
遥测包存储与信息定义:
信息 |
下发周期 |
类型 |
数据地址 |
数据长度 |
参数 |
测试包 |
TASK_RNDA |
0x0000 |
test_data |
23 |
Byte0~ Byte7:星上时 Byte8~ Byte22:预留,0xAA |
线程状态包 |
TASK_RNDB |
0x0001 |
task_info_tm |
4 |
Byte0:星务线程状态 Byte1:采集线程状态 Byte2:姿控线程状态 Byte3:地测线程状态 |
计算机状态包 |
TASK_RNDC |
0x0002 |
com_state_tm |
7 |
Byte0~Byte1:电压值,范围0-32768,小端 Byte2:0-100,对应0-100占空比 Byte3~Byte4:OC高低电平 Byte5:正确指令计数 Byte6:错误指令计数 |
设备开关包 |
TASK_RNDD |
0x0003 |
dev_onoff_state |
4 |
Byte0:设备0开关状态 Byte1:设备1开关状态 Byte2:设备2开关状态 Byte3:设备3开关状态 |