本发明涉及一种基于双环形缓冲的时标指令序列管理方法,尤其涉及一种航天嵌入式软件的强实时性约束指令管理的解决方法,属于技术嵌入式软件领域。
背景技术:
时标指令序列是指由带有时间标志的一组指令组成,时标指令的执行时间为相应时标所指示的时间。其主要作用是进行程序控制。比如专利“卫星出入境自主遥测处理控制方法”中指出:时标指令组由带有时间标志的时标指令组成,时标指令的执行时间为相应时标所指示的时间。根据卫星的轨道周期设定一个程控周期,地面一次性的注入一个程控周期内所需要的时标指令组。卫星根据当前执行的任务调取相应的时标指令组,然后根据当前的卫星时间执行时标指令组中的相应指令,各个时标指令按照时标依次执行,每一个指令执行完成后,自动放置到时标指令组的队尾,并将之前的执行时间加上一个程控周期作为下一次的执行时间。
环形缓冲是指将数据缓冲域划分为读写两部分,中断/任务向缓冲区中写入数据;另一中断/任务根据中断或者查询周期,周期性地从缓冲区中读取数据,并将读取后的缓冲区释放为可写。如《计算机应用软件》第22卷第4期“基于环形缓冲区的实时系统负载平衡技术”中指出。环形缓冲区也称双缓冲技术,本质上也是一种并行处理技术,将数据缓冲内存区域划分为两部分,一方面从设备连续的进行工作,向缓冲区中写入数据;另一方面主设备根据半满中断或者查询周期,周期性地从缓冲区中读取数据。主设备读取数据的时刻是当缓冲区的一半写满的时刻,当主设备开始读取已经写满数据的一半缓冲区时,从设备开始向另一半缓冲区写入数据。
然而,若插入大量时标指令导致缓冲区频繁拷贝操作,非常耗时。这对实时性要求很高的系统,频繁的拷贝操作带来的时间消耗是非常严重的。
技术实现要素:
本发明的技术解决问题是:克服现有技术的不足,提供一种基于双环形缓冲的时标指令序列管理方法,确保遥控管理任务在较短时间内完成,保证了巡视探测的实时性。
本发明的技术方案是:一种基于双环形缓冲的时标指令序列管理方法,设计两个环形缓冲,前置环形缓冲用于存储地面上行的多个时标指令单元,后置环形缓冲用于存储时标序列,参与执行时标指令序列管理的功能;步骤如下:
1)接收地面上行的时标指令序列管理指令,校验时标指令序列管理指令的校验和,指令头以及指令数据的正确性;若时标指令管理序列指令不正确,丢弃该时标指令序列管理指令,跳转到步骤7);若时标指令序列管理指令正确,进入步骤2);
2)将时标指令序列管理指令中的时标指令单元写入前置环形缓冲;
3)检查前置环形缓冲,若前置环形缓冲无任何指令,跳转到步骤7);若前置环形缓冲区有指令,进入步骤4);
4)读取前置环形缓冲中的一个时标指令单元;
5)找到该时标指令单元指向的时标指令序列,若该时标指令需插入序列,则执行步骤6);若该时标指令需在序列中删除,则执行步骤7);
6)将时标指令单元按时间顺序从小到大插入序列;
7)检查时标指令序列中的时标指令单元,若后置环形缓冲中的时标指令单元与读取的时标指令单元相等,删除后置环形缓冲的时标指令单元;若删除位置在后置缓冲区的序列头指针h之后,将序列头指针h后移删除的时标指令单元长度;
8)顺序对各时标指令序列,执行步骤9)-12),直到所有序列均执行完毕,本周期结束;
9)该时标指令序列是否执行过程中,若不在执行过程中跳转到步骤8);
10)该时标指令序列是否执行完成,若已经执行完成,置序列执行完成,置后置缓冲区的头尾指针等于读写指针,跳转到步骤8);
11)读取该序列中第一条待执行时标指令单元,若时标指令的时间到,执行该指令,后置缓冲区的序列头指针h前移一个时标指令单元;跳转到步骤10);
12)若时标指令未到执行时刻,跳转到步骤8)。
所述步骤2)的具体写入操作流程如下:
2.1)检查环形缓冲区剩余长度,若剩余长度小于待写入的指令单元长度,置写入失败,转至步骤3),否则执行下一步;
2.2)判断写指针是否回卷:已回卷,转至步骤2.6),否则执行下一步;
2.3)写入数据,写入数据的长度=min(时标指令单元长度,回卷前的长度)
2.4)判断时标指令单元是否写入完毕,写入完毕跳转至步骤2.7),否则执行下一步;
2.5)写指针回卷,写入剩余的时标指令单元长度,跳转到步骤2.7);
2.6)写入指令数据;
2.7)更新写指针。
所述步骤4)读取前置环形缓冲中的一个时标指令单元读取操作流程如下:
4.1)检查环形缓冲是否为空,若为空则跳转到步骤5),否则执行下一步;
4.2)获取环形缓冲中第一个时标指令单元的长度;
4.3)判断读指针是否回卷,若未回卷跳转到步骤4.7),否则执行下一步;
4.4)读取指令单元数据,读取数据长度=min(要读取数据长度,读指针回卷前的长度);
4.5)判断是否需要回卷读指针,若需要则执行下一步,否则跳转到步骤4.7);
4.6)读取第一个时标指令单元剩余数据;
4.7)更新读指针。
所述步骤6)中将时标指令单元按时间顺序从小到大插入序列的具体方法为:判断若插入位置在后置缓冲区的序列头指针h之后,则将序列头指针h前移插入的时标指令单元长度;并跳转到步骤7);其他插入操作流程如下:
6.1)检查环形缓冲区剩余长度,若剩余长度小于待写入的指令单元长度,转至步骤7),否则执行下一步;
6.2)获得插入偏移量;
6.3)计算当前环形缓冲的总长度;
6.4)每次将环形缓冲中的数据从前往后依次向前移动环形缓冲中的数据,移动起点为读指针位置,移动长度为min(时标指令长度,(总长度-偏移量-移动次数x时标指令单元长度的乘积)),直到移动完偏移量处的数据为止;
6.5)在偏移量处写入时标指令单元数据;
6.6)将读指针前移时标指令单元的长度。
所述前置环形缓冲由数据存储区数组,读指针r和写指针w组成。当读指针r和写指针w指向同一个存储单元时,环形缓冲空;当读指针r和写指针w相邻时,环形缓冲满;处于读指针r和写指针w之间的为有效存储数据,即上行未插入或删除的时标指令单元。
所述后置环形缓冲由数据存储区数组,读指针r,写指针w,序列头指针h和序列尾指针t组成;当读指针r和写指针w指向同一个存储单元时,时标指令序列满;当序列头指针h和序列尾指针t相邻时,表示时标指令序列执行完毕;处于序列头指针h和序列尾指针t之间的为序列中未执行的时标指令;处于读指针r和写指针w为本序列包含的所有时标指令;当序列未执行时,读指针r与序列头指针h重合,写指针w和序列尾指针t重合。
本发明与现有技术相比的有益效果是:
时标指令序列管理功能是嫦娥四号自主功能的关键组成部分,通过设计两个环形缓冲,前置环形缓冲用于存储地面上行的多个时标指令单元;后置环形缓冲用于存储时标序列,参与执行时标指令序列管理的功能;每个任务周期内只处理一个时标指令单元。
有如下优点:一、时标指令单元的读取插入删除操作简单,使得前后双环形缓冲操作得到了统一;二、缩短了时标指令管理指令的处理时间,因双缓冲的存在,可以每周期只执行时标指令管理指令的一个指令单元,给当前巡视探测任务留有足够的时间,保证巡视探测任务的实时性;三、每周期只执行时标指令管理指令的一个指令单元,均衡了时标指令管理功能的时间;四、适应不同长度的时标指令要求,不会造成存储空间浪费。
附图说明
图1为前置环形缓冲示意图;
图2为后置环形缓冲示意图;
图3为环形缓冲写入操作流程图;
图4为环形缓冲读取操作流程图;
图5为环形缓冲插入操作流程图;
图6为环形缓冲删除操作流程图。
具体实施方式
下面结合附图对本发明的具体实施方式进行进一步的详细描述。
本发明设计了两个环形缓冲,前置环形缓冲用于存储地面上行的多个时标指令单元,后置环形缓冲用于存储时标序列,参与执行时标指令序列管理的功能。前置环形缓冲如图1所示。
前置环形缓冲由数据存储区数组,读指针r和写指针w组成。当读指针r和写指针w指向同一个存储单元时,环形缓冲空;当读指针r和写指针w相邻时,环形缓冲满;处于读指针r和写指针w之间的为有效存储数据,即上行未插入或删除的时标指令单元。
后置环形缓冲示意图如图2所示。后置环形缓冲由数据存储区数组,读指针r,写指针w,序列头指针h和序列尾指针t组成。当读指针r和写指针w指向同一个存储单元时,时标指令序列满;当序列头指针h和序列尾指针t相邻时,表示时标指令序列执行完毕;处于序列头指针h和序列尾指针t之间的为序列中未执行的时标指令;处于读指针r和写指针w为本序列包含的所有时标指令。当序列未执行时,读指针r与序列头指针h重合,写指针w和序列尾指针t重合。
如图3-6,在每个时标指令序列管理周期,执行如下操作:
1)接收地面上行的时标指令序列管理指令,校验时标指令序列管理指令的校验和,指令头以及指令数据的正确性;若时标指令管理序列指令不正确,丢弃该时标指令序列管理指令,跳转到步骤7);
2)若时标指令序列管理指令正确,将时标指令序列管理指令中的时标指令单元写入前置环形缓冲,写入操作流程如下:
2.1)检查环形缓冲区剩余长度,若剩余长度小于待写入的指令单元长度,置写入失败,转至步骤3),否则执行下一步;
2.2)判断写指针是否回卷:已回卷,转至步骤2.7),否则执行下一步;
2.3)写入数据长度=min(时标指令单元长度,回卷前的长度);
2.4)写入数据,长度为步骤2.3)的长度;
2.5)判断时标指令单元是否写入完毕,写入完毕跳转至步骤2.8),否则执行下一步;
2.6)写指针回卷,写入剩余的时标指令单元长度,跳转到步骤2.8);
2.7)写入指令数据;
2.8)更新写指针。
3)检查前置环形缓冲,若前置环形缓冲无任何指令,跳转到步骤7);
4)若前置环形缓冲区有指令,读取前置环形缓冲中的一个时标指令单元,读取操作流程如下:
4.1)检查环形缓冲是否为空,为空则跳转到步骤5,否则执行下一步;
4.2)获取环形缓冲中第一个时标指令单元的长度;
4.3)判断读指针是否回卷,未回卷跳转到步骤4.8),否则执行下一步;
4.4)读取数据长度=min(要读取数据长度,读指针回卷前的长度);
4.5)读取指令单元数据;
4.6)判断是否需要回卷读指针,是执行下一步,否则跳转到步骤4.8);
4.7)读取第一个时标指令单元剩余数据;
4.8)更新读指针。
5)找到该时标指令单元指向的时标指令序列,若该时标指令需插入序列执行步骤6);若该时标指令需在序列中删除,执行步骤7);
6)将时标指令单元按时间顺序从小到大插入序列,判断若插入位置在后置缓冲区的序列头指针h之后,将序列头指针h前移插入的时标指令单元长度;跳转到步骤7);其他插入操作流程如下:
6.1)检查环形缓冲区剩余长度,若剩余长度小于待写入的指令单元长度,转至步骤7),否则执行下一步;
6.2)获得插入偏移量;
6.3)计算当前环形缓冲的总长度;
6.4)每次将环形缓冲中的数据从前往后依次向前移动环形缓冲中的数据,移动起点为读指针位置,移动长度为min(时标指令长度,(总长度-偏移量-移动次数x时标指令单元长度的乘积)),直到移动完偏移量处的数据为止;
6.5)在偏移量处写入时标指令单元数据;
6.6)将读指针前移时标指令单元的长度。
7)检查时标指令序列中的时标指令单元,若后置环形缓冲中的时标指令单元与读取的时标指令单元相等,删除后置环形缓冲的时标指令单元;若删除位置在后置缓冲区的序列头指针h之后,将序列头指针h后移删除的时标指令单元长度;
8)顺序对各时标指令序列,执行步骤9-12,直到所有序列均执行完毕,本周期结束;
9)该时标指令序列是否执行过程中,若不在执行过程中跳转到步骤8);
10)该时标指令序列是否执行完成,若已经执行完成,置序列执行完成,置后置缓冲区的头尾指针等于读写指针,跳转到步骤8);
11)读取该序列中第一条待执行时标指令单元,若时标指令的时间到,执行该指令,后置缓冲区的序列头指针h前移一个时标指令单元;跳转到步骤10);
12)若时标指令未到执行时刻,跳转到步骤8)。
本发明说明书中未作详细描述的内容属于本领域专业技术人员的公知技术。