一种优先级抢占时间片轮转操作系统中任务定时调度方法转让专利

申请号 : CN201310746023.2

文献号 : CN103713948B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 龚健杨孟飞乔磊杨桦顾斌彭飞王婧徐建刘波

申请人 : 北京控制工程研究所

摘要 :

本发明一种优先级抢占时间片轮转操作系统中任务定时调度方法,步骤如下:(1)利用操作系统接口函数创建用户任务TaskEncap_N(),在用户任务TaskEncap_N()中对实际的用户任务函数TaskFunc_N()进行封装,即先挂起函数TaskFunc_N(),再调用函数TaskFunc_N();(2)定义一个用户任务的起始调度时刻位图和用户任务的起始调度任务位图,利用位图快速索引用户任务的起始调度时刻以及用户任务控制块指针;(3)时间片中断时,利用时间片中断钩子函数实现定时调度,即在需要任务调度的时刻,如果上一个时间段的任务未完成则重启动该任务,再恢复本时间段的任务;否则直接恢复本时间段的任务。

权利要求 :

1.一种优先级抢占时间片轮转操作系统中任务定时调度方法,其特征在于步骤如下:

1)创建并封装用户任务;

11)创建任务前,将所有用户任务控制块指针定义为一个一维数组SYSTaskID[N],其中N为任务个数;

12)设操作系统任务创建接口函数为OSTaskSpawn(),用户任务Task_N的函数为TaskFunc_N(),对函数TaskFunc_N()进行封装,得到封装后的函数TaskEncap_N(),具体封装过程为:设操作系统任务挂起接口函数为OSTaskSuspend();则在TaskEncap_N()中,进入任务无限循环体时,采用操作系统任务挂起接口函数OSTaskSuspend()挂起当前任务,然后再调用用户任务函数TaskFunc_N();

13)创建用户任务SYSTaskID[N]=OSTaskSpawn(TaskEncap_N,param_1…param_n),其中param_1…param_n为操作系统任务创建接口函数OSTaskSpawn()中的其他参数;在调用接口函数OSTaskSpawn()创建Task_1到Task_N时,把任务Task_1到Task_N设置为相同的优先级;

2)利用位图快速索引用户任务的起始调度时刻以及用户任务控制块指针;

21)定义一个用户任务的起始调度时刻位图MapSchedeIndex[],位图大小为根据用户调度需求将位图MapSchedeIndex[]中需要进行任务调度的位置置1,其余位置置0;

22)定义一个用户任务的起始调度任务位图MapSchedeTask[],位图大小为将MapSchedeTask[]中与MapSchedeIndex[]中值为1的位置所对应的位置上,设置成需要调度的任务的索引值,所述的索引值为SYSTaskID[N]的索引值N;

3)时间片中断时,利用时间片中断钩子函数控制任务的定时调度;

31)在操作系统内核的时间片中断中,对时间片进行计数,然后根据位图MapSchedeIndex[]判断该时间片是否为对新任务进行调度的时刻;

32)当MapSchedeIndex[]中的值为0时,不进行任何操作;当MapSchedeIndex[]中的值为1时,则该位置所对应的时刻为需要对新任务进行调度的时刻,并设操作系统任务恢复接口函数为OSTaskResume(),操作系统任务重启动接口函数为OSTaskRestart(),将当前任务控制块指针与SYSTaskID[N]中上一个时间段的任务控制块指针相比较,如果当前任务控制块指针与SYSTaskID[N]中上一个时间段的任务控制块指针不相等则调用OSTaskResume()直接恢复本时间段任务;如果当前任务控制块指针与SYSTaskID[N]中上一个时间段的任务控制块指针相等,则需要调用OSTaskRestart()重新启动上一个时间段的任务,然后再调用OSTaskResume()恢复本时间段任务;其中所述上一个时间段的任务和本时间段任务均通过位图MapSchedeTask[]进行快速索引。

说明书 :

一种优先级抢占时间片轮转操作系统中任务定时调度方法

技术领域

[0001] 本发明涉及一种优先级抢占时间片轮转操作系统中任务定时调度方法,属于嵌入式操作系统领域。

背景技术

[0002] 在大多数卫星控制计算机中,软件主要以任务的形式被执行,并且这些任务需要按照控制周期定时进行调度,即在每个控制周期中,这些任务必须分别在控制周期内预先确定的时间点开始执行,且必须在规定的时间内执行完毕。因此任务的定时调度是卫星控制计算机系统软件的重要功能。
[0003] 目前新一代空间飞行器嵌入式操作系统的核心调度策略是优先级抢占并结合时间片轮转进行任务调度。为了满足卫星控制计算机任务定时调度的需求,需要在操作系统中实现实时定时调度。本专利作为空间飞行器嵌入式操作系统的一个组成部分,在核心调度策略的基础上实现了定时调度的方法。如果不采用本专利所提供的方法,则无法满足当前卫星控制计算机控制周期任务运行的需求。而采用本专利所提供的方法,则操作系统既能够实现基于优先级的抢占式任务调度,又能够实现控制周期任务的定时调度。这样就满足了当前不同空间飞行器的不同需求。

发明内容

[0004] 本发明解决的技术问题是:克服现有技术的不足,提供了一种优先级抢占时间片轮转操作系统中任务定时调度方法,使得操作系统既能够实现基于优先级抢占和时间片轮转的调度,又能实现基于控制周期的定时任务调度。
[0005] 本发明的技术方案是:一种优先级抢占时间片轮转操作系统中任务定时调度方法,步骤如下:
[0006] 1)创建并封装用户任务;
[0007] 11)创建任务前,将所有用户任务控制块指针定义为一个一维数组SYSTaskID[N],其中N为任务个数;
[0008] 12)设操作系统任务创建接口函数为OSTaskSpawn(),用户任务Task_N的函数为TaskFunc_N(),对函数TaskFunc_N()进行封装,得到封装后的函数TaskEncap_N(),具体封装过程为:设操作系统任务挂起接口函数为OSTaskSuspend();则在TaskEncap_N()中,进入任务无限循环体时,采用操作系统任务挂起接口函数OSTaskSuspend()挂起当前任务,然后再调用用户任务函数TaskFunc_N();
[0009] 13)创建用户任务SYSTaskID[N]=OSTaskSpawn(TaskEncap_N,param_1…param_n),其中param_1…param_n为操作系统任务创建接口函数OSTaskSpawn()中的其他参数;在调用接口函数OSTaskSpawn()创建Task_1到Task_N时,把任务Task_1到Task_N设置为相同的优先级;
[0010] 2)利用位图快速索引用户任务的起始调度时刻以及用户任务控制块指针;
[0011] 21)定义一个用户任务的起始调度时刻位图MapSchedeIndex[],位图大小为根据用户调度需求将位图MapSchedeIndex[]中需要进行任务调度的位置置1,其余位置置0;
[0012] 22)定义一个用户任务的起始调度任务位图MapSchedeTask[],位图大小为将MapSchedeTask[]中与MapSchedeIndex[]中值为1的位置所对应的位置上,设置成需要调度的任务的索引值,所述的索引值为SYSTaskID[N]的索引值N;
[0013] 3)时间片中断时,利用时间片中断钩子函数控制任务的定时调度;
[0014] 31)在操作系统内核的时间片中断中,对时间片进行计数,然后根据位图MapSchedeIndex[]判断该时间片是否对新任务进行调度的时刻;
[0015] 32)当MapSchedeIndex[]中的值为0时,不进行任何操作;当MapSchedeIndex[]中的值为1时,则该位置所对应的时刻为需要对新任务进行调度的时刻,并设操作系统任务恢复接口函数为OSTaskResume(),操作系统任务重启动接口函数为OSTaskRestart(),将当前任务控制块指针与SYSTaskID[N]中上一个时间段的任务控制块指针相比较,如果当前任务控制块指针与SYSTaskID[N]中上一个时间段的任务控制块指针不相等则调用OSTaskResume()直接恢复本时间段任务;如果当前任务控制块指针与SYSTaskID[N]中上一个时间段的任务控制块指针相等,则需要调用OSTaskRestart()重新启动上一个时间段的任务,然后再调用OSTaskResume()恢复本时间段任务;其中所述上一个时间段的任务和本时间段任务均通过位图MapSchedeTask[]进行快速索引。
[0016] 本发明与现有技术相比具有如下优点:
[0017] (1)在优先级抢占和多任务时间片轮转基础上,同时支持任务的定时调度,增加了任务调度的模式;
[0018] (2)能够在确定起始时间开始任务,并能够使任务在确定的时间段执行,从内核级别上保证了任务执行的高度实时性;
[0019] (3)对应用程序开发提供了统一的接口,不需要应用程序开发过程中涉及操作系统内核,对应用程序用户提供了简单的接口。

附图说明

[0020] 图1为周期任务调度。
[0021] 图2为封装后任务函数TaskEncap_N()的具体算法。
[0022] 图3为时间片中断钩子函数中的定时调度算法。

具体实施方式

[0023] 一、方法原理
[0024] 本发明利用操作系统内核提供的接口函数,采取对任务先挂起后恢复的策略,实现在优先级抢占时间片轮转操作系统中任务的定时调度。
[0025] 创建任务时,使所有用户任务具有相同优先级,并在初始时刻让所有用户任务处于挂起状态。在操作系统内核的时间片中断中,根据控制周期中任务需要运行的起始时刻,对处于挂起态的任务进行恢复,使其恢复运行,从而实现任务的定时调度。
[0026] 二、设计方案
[0027] 假设卫星控制计算机中,应用软件需要以T=16s为控制周期进行任务的定时调度,Ts为每个控制周期开始的时间,在每个控制周期T期间要执行3个任务Task_1、Task_2和Task_3,其中每个任务允许执行时间为T1=6s、T2=6s、T3=4s,具体情况如图1所示。时间片tick值为100ms。
[0028] 利用本专利的方法实现上述功能如下:
[0029] 1)创建并封装用户任务;
[0030] 11)创建任务前,将所有用户任务控制块指针定义为一个一维数组SYSTaskID[3];
[0031] 12)设操作系统任务创建接口函数为OSTaskSpawn(),用户任务Task_N的函数为TaskFunc_N(),对函数TaskFunc_N()进行封装,得到封装后的函数TaskEncap_N(),N=1,2,3。具体封装过程为:设操作系统任务挂起接口函数为OSTaskSuspend();则在TaskEncap_N()中,进入任务无限循环体时,采用操作系统任务挂起接口函数OSTaskSuspend()挂起当前任务,然后再调用用户任务函数TaskFunc_N(),如图2所示;
[0032] 13)创建用户任务SYSTaskID[N]=OSTaskSpawn(TaskEncap_N,param_1…param_n),其中param_1…param_n为操作系统任务创建接口函数OSTaskSpawn()中的其他参数,N=1,2,3;在调用接口函数OSTaskSpawn()创建Task_1到Task_N时,把任务Task_1到Task_N设置为相同的优先级;
[0033] 2)利用位图快速索引用户任务的起始调度时刻以及用户任务控制块指针;
[0034] 21)定义一个用户任务的起始调度时刻位图
[0035] 22)定义一个用户任务的起始调度任务位图
[0036] 3)时间片中断时,利用时间片中断钩子函数控制任务的定时调度;
[0037] 31)在操作系统内核的时间片中断中,对时间片进行计数,然后根据位图MapSchedeIndex[160]判断该时间片是否对新任务进行调度的时刻;
[0038] 32)当 MapSchedeIndex[160]中 的 值 为 0时,不 进 行 任 何 操 作;当MapSchedeIndex[160]中的值为1时,则该位置所对应的时刻为需要对新任务进行调度的时刻,并设操作系统任务恢复接口函数为OSTaskResume(),操作系统任务重启动接口函数为OSTaskRestart(),将当前任务控制块指针与SYSTaskID[N]中上一个时间段的任务控制块指针相比较,如果当前任务控制块指针与SYSTaskID[N]中上一个时间段的任务控制块指针不相等则调用OSTaskResume()直接恢复本时间段任务;如果当前任务控制块指针与SYSTaskID[N]中上一个时间段的任务控制块指针相等,则需要调用OSTaskRestart()重新启动上一个时间段的任务,然后再调用OSTaskResume()恢复本时间段任务;其中所述上一个时间段的任务和本时间段任务均通过位图MapSchedeTask[160]进行快速索引,N=1,2,3,整个流程如图3所示。
[0039] 本发明说明书中未作详细描述的内容属本领域技术人员的公知技术。