发明名称 一种空间飞行器周期性混成随机任务调度方法
摘要 一种空间飞行器周期性混成随机任务调度方法,基于优先级抢占、同优先级任务调度策略,在不更改空间飞行器操作系统内核任务调度策略的基础上,实现了周期任务固定时间点启动、周期内任务随机启动以及完全随机任务启动的调度方法。本发明方法在当固定时间点任务不占用CPU时,控制随机任务随时执行,直到任务在固定时间点启动运行,同时支持任务的实时加入和退出,与现有技术相比,能够有效的提高空间飞行器计算机的CPU利用率,使得操作系统不仅能保持原有任务调动策略,还具有良好的复用性、适应性和灵活性,具有很好的适用价值。
申请公布号 CN106445659A 申请公布日期 2017.02.22
申请号 CN201610814726.8 申请日期 2016.09.09
申请人 北京控制工程研究所 发明人 乔磊;龚健;杨孟飞;杨桦;彭飞;徐建;谭彦亮;吴一帆;刘忠汉
分类号 G06F9/48(2006.01)I 主分类号 G06F9/48(2006.01)I
代理机构 中国航天科技专利中心 11009 代理人 陈鹏
主权项 一种空间飞行器周期性混成随机任务调度方法,其特征在于包括如下步骤:(1)将所有用户任务控制块指针定义为一维数组{Task[1],Task[2],…,Task[N]},其中,N为用户任务控制块数目,每个任务控制块均对应一个任务,Taski为第i个用户任务,i=1,2,3…N;(2)获取SpaceOS操作系统中的任务创建接口函数OSTaskSpawn(),然后使用任务创建接口函数OSTaskSpawn()创建N个任务控制块,假定第i个任务控制块对应的用户任务的功能函数为Taski(),然后对函数Taski()进行封装,得到封装后能够被SpaceOS操作系统直接调用的函数TaskEni();(3)创建第i个用户任务对应的数据结构为Task[i]=OSTaskSpawn(TaskEni,param1…paramM),其中,param1、param2、…、paramM为操作系统任务创建接口函数OSTaskSpawn()中的参数,M为整数;(4)将Task1到TaskX设为固定时间点调度任务,优先级设为A,将TaskX+1到TaskY设为固定周期内随机调度任务,优先级设为B,将TaskY+1到TaskN设为完全随机调度任务,优先级设为C,A<B<C,X、Y均为小于N的正整数且X小于Y,优先级数值越小优先级越高;(5)获取优先级最高的固定时间点调度任务Task1到TaskX,在一维位图unsigned int Index中设置用户任务Task1到TaskX的任务调度时刻,其中,Index为8*P bit位且每bit位取值为0或1,当Index中第j bit位为1时,表明第j个时间片起始时刻有用户任务的任务调度时刻来临,时间片为SpaceOS操作系统内核计时的最小时间段,每个时间片起始时刻均设有中断,j为整数,P为正整数,用户任务Task1到TaskX中的任一用户任务均对应多个时间片且用户任务Task1到TaskX中的用户任务对应的时间片数目可能不相等;所述的任务调度时刻为对应用户任务包括的第一个时间片的起始时刻;(6)监测一维位图unsigned int Index中的第k个用户任务的bit位并判断,当时间片中断发生时,时间片个数tick递增1,然后计算(0x1<<tick)&Index是否为0,若为0,则此时间片没有用户任务需要调度,继续监测一维位图unsigned int Index中第k个用户任务的bit位且递增时间片个数tick直至有用户任务需要调度或者第k个用户任务的bit位遍历完成,若为1,则判断第k个用户任务的状态,当为运行态时,调用任务重启动接口函数OSTaskRestart()清空上次第k个用户任务执行产生的数据,并重新启动第k个用户任务,当为挂起态时,则调用任务恢复接口函数OSTaskResume()启动第k个用户任务,在执行第k个用户任务过程中,继续监测一维位图unsigned int Index中第k个用户任务的bit位且递增时间片个数tick直至第k个用户任务的bit位遍历完成,如果第k个用户任务过程在第k个用户任务对应的时间片内执行完成,则将第k个用户任务修改为挂起态,转入步骤(9),否则将第k个用户任务修改为运行态,其中,k=1,2,3…X,每个用户任务状态的初始值为挂起态,用户任务执行产生数据的初始值为空;(7)重复步骤(6)直至一维位图unsigned int Index被遍历,实现将所有用户任务设置为挂起态或者运行态;(8)将时间片个数tick归零,重复步骤(6)‑(7)直至完成固定时间点调度任务Task1到TaskX不再执行,其中,时间片个数tick每归零一次,控制周期计数状态量FixCircleStartCnt递增1,控制周期计数状态量FixCircleStartCnt初始值为0;(9)顺序判断固定周期内随机调度任务Taskq的状态,如果为挂起态,则顺序执行固定周期内随机调度任务Taskq并存储执行产生的数据,直至步骤(6)中第k个用户任务对应的时间片用尽后转入步骤(7);当固定周期内随机调度任务Taskq在一次步骤(6)中第k个用户任务对应的时间片执行完成时,将固定周期内随机调度任务Taskq设置为挂起态,然后顺序判断执行下一个固定周期内随机调度任务,若所有的固定周期内随机调度任务Taskq执行完成,则转入步骤(10);当固定周期内随机调度任务Taskq在一次步骤(6)中第k个用户任务对应的时间片未执行完成时,将固定周期内随机调度任务Taskq设置为运行态;监测步骤(8)中的控制周期计数状态量FixCircleStartCnt,当控制周期计数状态量FixCircleStartCnt为15时,将步骤(8)中的控制周期计数状态量FixCircleStartCnt归零,调用任务重启动接口函数为OSTaskRestart()清空状态为运行态的固定周期内随机调度任务执行产生的数据,并将其状态修改为挂起态,调用任务恢复接口函数为OSTaskResume()重新顺序判断并执行固定周期内随机调度任务Taskq;其中,固定周期内随机调度任务Taskq的初始状态为挂起态,q=X+1,X+2,X+3,…,TaskY;(10)调度执行完全随机调度任务TaskY+1到TaskN。
地址 100080 北京市海淀区北京2729信箱