一種優(yōu)先級(jí)搶占時(shí)間片輪轉(zhuǎn)操作系統(tǒng)中任務(wù)定時(shí)調(diào)度方法
【專(zhuān)利摘要】本發(fā)明一種優(yōu)先級(jí)搶占時(shí)間片輪轉(zhuǎn)操作系統(tǒng)中任務(wù)定時(shí)調(diào)度方法,步驟如下:(1)利用操作系統(tǒng)接口函數(shù)創(chuàng)建用戶(hù)任務(wù)TaskEncap_N(),在用戶(hù)任務(wù)TaskEncap_N()中對(duì)實(shí)際的用戶(hù)任務(wù)函數(shù)TaskFunc_N()進(jìn)行封裝,即先掛起函數(shù)TaskFunc_N(),再調(diào)用函數(shù)TaskFunc_N();(2)定義一個(gè)用戶(hù)任務(wù)的起始調(diào)度時(shí)刻位圖和用戶(hù)任務(wù)的起始調(diào)度任務(wù)位圖,利用位圖快速索引用戶(hù)任務(wù)的起始調(diào)度時(shí)刻以及用戶(hù)任務(wù)控制塊指針;(3)時(shí)間片中斷時(shí),利用時(shí)間片中斷鉤子函數(shù)實(shí)現(xiàn)定時(shí)調(diào)度,即在需要任務(wù)調(diào)度的時(shí)刻,如果上一個(gè)時(shí)間段的任務(wù)未完成則重啟動(dòng)該任務(wù),再恢復(fù)本時(shí)間段的任務(wù);否則直接恢復(fù)本時(shí)間段的任務(wù)。
【專(zhuān)利說(shuō)明】一種優(yōu)先級(jí)搶占時(shí)間片輪轉(zhuǎn)操作系統(tǒng)中任務(wù)定時(shí)調(diào)度方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種優(yōu)先級(jí)搶占時(shí)間片輪轉(zhuǎn)操作系統(tǒng)中任務(wù)定時(shí)調(diào)度方法,屬于嵌入式操作系統(tǒng)領(lǐng)域。
【背景技術(shù)】
[0002]在大多數(shù)衛(wèi)星控制計(jì)算機(jī)中,軟件主要以任務(wù)的形式被執(zhí)行,并且這些任務(wù)需要按照控制周期定時(shí)進(jìn)行調(diào)度,即在每個(gè)控制周期中,這些任務(wù)必須分別在控制周期內(nèi)預(yù)先確定的時(shí)間點(diǎn)開(kāi)始執(zhí)行,且必須在規(guī)定的時(shí)間內(nèi)執(zhí)行完畢。因此任務(wù)的定時(shí)調(diào)度是衛(wèi)星控制計(jì)算機(jī)系統(tǒng)軟件的重要功能。
[0003]目前新一代空間飛行器嵌入式操作系統(tǒng)的核心調(diào)度策略是優(yōu)先級(jí)搶占并結(jié)合時(shí)間片輪轉(zhuǎn)進(jìn)行任務(wù)調(diào)度。為了滿(mǎn)足衛(wèi)星控制計(jì)算機(jī)任務(wù)定時(shí)調(diào)度的需求,需要在操作系統(tǒng)中實(shí)現(xiàn)實(shí)時(shí)定時(shí)調(diào)度。本專(zhuān)利作為空間飛行器嵌入式操作系統(tǒng)的一個(gè)組成部分,在核心調(diào)度策略的基礎(chǔ)上實(shí)現(xiàn)了定時(shí)調(diào)度的方法。如果不采用本專(zhuān)利所提供的方法,則無(wú)法滿(mǎn)足當(dāng)前衛(wèi)星控制計(jì)算機(jī)控制周期任務(wù)運(yùn)行的需求。而采用本專(zhuān)利所提供的方法,則操作系統(tǒng)既能夠?qū)崿F(xiàn)基于優(yōu)先級(jí)的搶占式任務(wù)調(diào)度,又能夠?qū)崿F(xiàn)控制周期任務(wù)的定時(shí)調(diào)度。這樣就滿(mǎn)足了當(dāng)前不同空間飛行器的不同需求。
【發(fā)明內(nèi)容】
[0004]本發(fā)明解決的技術(shù)問(wèn)題是:克服現(xiàn)有技術(shù)的不足,提供了一種優(yōu)先級(jí)搶占時(shí)間片輪轉(zhuǎn)操作系統(tǒng)中任務(wù)定時(shí) 調(diào)度方法,使得操作系統(tǒng)既能夠?qū)崿F(xiàn)基于優(yōu)先級(jí)搶占和時(shí)間片輪轉(zhuǎn)的調(diào)度,又能實(shí)現(xiàn)基于控制周期的定時(shí)任務(wù)調(diào)度。
[0005]本發(fā)明的技術(shù)方案是:一種優(yōu)先級(jí)搶占時(shí)間片輪轉(zhuǎn)操作系統(tǒng)中任務(wù)定時(shí)調(diào)度方法,步驟如下:
[0006]I)創(chuàng)建并封裝用戶(hù)任務(wù);
[0007]11)創(chuàng)建任務(wù)前,將所有用戶(hù)任務(wù)控制塊指針定義為一個(gè)一維數(shù)組SYSTaskID [N],其中N為任務(wù)個(gè)數(shù);
[0008]12)設(shè)操作系統(tǒng)任務(wù)創(chuàng)建接口函數(shù)為OSTaskSpawn O,用戶(hù)任務(wù)Task_N的函數(shù)為T(mén)askFunc_NO ,對(duì)函數(shù)TaskFunc_NO進(jìn)行封裝,得到封裝后的函數(shù)TaskEncap_NO ,具體封裝過(guò)程為:設(shè)操作系統(tǒng)任務(wù)掛起接口函數(shù)為OSTaskSuspend O ;則在TaskEncap_N()中,進(jìn)入任務(wù)無(wú)限循環(huán)體時(shí),采用操作系統(tǒng)任務(wù)掛起接口函數(shù)OSTaskSuspendO掛起當(dāng)前任務(wù),然后再調(diào)用用戶(hù)任務(wù)函數(shù)TaskFunc_N();
[0009]13)創(chuàng)建用戶(hù)任務(wù) SYSTaskID[N] =OSTaskSpawn(TaskEncap_N, param_l...param_η),其中paran^l^.paramji為操作系統(tǒng)任務(wù)創(chuàng)建接口函數(shù)OSTaskSpawnO中的其他參數(shù);在調(diào)用接口函數(shù)OSTaskSpawn O創(chuàng)建Task_l到Task_N時(shí),把任務(wù)Task_l到Task_N設(shè)置為相同的優(yōu)先級(jí);
[0010]2)利用位圖快速索引用戶(hù)任務(wù)的起始調(diào)度時(shí)刻以及用戶(hù)任務(wù)控制塊指針;[0011]21)定義一個(gè)用戶(hù)任務(wù)的起始調(diào)度時(shí)刻位圖MapSchedelndex□,位圖大小為控制周期
,根據(jù)用戶(hù)調(diào)度需求將位圖MapSchedelndex[]中需要進(jìn)行任務(wù)調(diào)度的位置置1,其余位置置O ;
[0012]22)定義一個(gè)用戶(hù)任務(wù)的起始調(diào)度任務(wù)位圖MapSchedeTask□,位圖大小為?f|[| JfIflB
日寸丨旬片.,將MapSchedeTask口中與MapSchedelndex []中值為I的位置所對(duì)應(yīng)的位置上,
設(shè)置成需要調(diào)度的任務(wù)的索引值,所述的索引值為SYSTaskID[N]的索引值N;
[0013]3)時(shí)間片中斷時(shí),利用時(shí)間片中斷鉤子函數(shù)控制任務(wù)的定時(shí)調(diào)度;
[0014]31)在操作系統(tǒng)內(nèi)核的時(shí)間片中斷中,對(duì)時(shí)間片進(jìn)行計(jì)數(shù),然后根據(jù)位圖MapSchedelndex[]判斷該時(shí)間片是否對(duì)新任務(wù)進(jìn)行調(diào)度的時(shí)刻;
[0015]32)當(dāng) MapSchedelndex[]中的值為 O 時(shí),不進(jìn)行任何操作;當(dāng) MapSchedelndex[]中的值為I時(shí),則該位置所對(duì)應(yīng)的時(shí)刻為需要對(duì)新任務(wù)進(jìn)行調(diào)度的時(shí)刻,并設(shè)操作系統(tǒng)任務(wù)恢復(fù)接口函數(shù)為OSTaskResume O,操作系統(tǒng)任務(wù)重啟動(dòng)接口函數(shù)為OSTaskRestart O,將當(dāng)前任務(wù)控制塊指針與SYSTaskID[N]中上一個(gè)時(shí)間段的任務(wù)控制塊指針相比較,如果當(dāng)前任務(wù)控制塊指針與S YSTaskID[N]中上一個(gè)時(shí)間段的任務(wù)控制塊指針不相等則調(diào)用OSTaskResume ()直接恢復(fù)本時(shí)間段任務(wù);如果當(dāng)前任務(wù)控制塊指針與SYSTaskID[N]中上一個(gè)時(shí)間段的任務(wù)控制塊指針相等,則需要調(diào)用OSTaskRestartO重新啟動(dòng)上一個(gè)時(shí)間段的任務(wù),然后再調(diào)用OSTaskResume O恢復(fù)本時(shí)間段任務(wù);其中所述上一個(gè)時(shí)間段的任務(wù)和本時(shí)間段任務(wù)均通過(guò)位圖MapSchedeTask[]進(jìn)行快速索引。
[0016]本發(fā)明與現(xiàn)有技術(shù)相比具有如下優(yōu)點(diǎn):
[0017](I)在優(yōu)先級(jí)搶占和多任務(wù)時(shí)間片輪轉(zhuǎn)基礎(chǔ)上,同時(shí)支持任務(wù)的定時(shí)調(diào)度,增加了任務(wù)調(diào)度的模式;
[0018](2)能夠在確定起始時(shí)間開(kāi)始任務(wù),并能夠使任務(wù)在確定的時(shí)間段執(zhí)行,從內(nèi)核級(jí)別上保證了任務(wù)執(zhí)行的高度實(shí)時(shí)性;
[0019](3)對(duì)應(yīng)用程序開(kāi)發(fā)提供了統(tǒng)一的接口,不需要應(yīng)用程序開(kāi)發(fā)過(guò)程中涉及操作系統(tǒng)內(nèi)核,對(duì)應(yīng)用程序用戶(hù)提供了簡(jiǎn)單的接口。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0020]圖1為周期任務(wù)調(diào)度。
[0021]圖2為封裝后任務(wù)函數(shù)TaskEncap_N O的具體算法。
[0022]圖3為時(shí)間片中斷鉤子函數(shù)中的定時(shí)調(diào)度算法。
【具體實(shí)施方式】
[0023]一、方法原理
[0024]本發(fā)明利用操作系統(tǒng)內(nèi)核提供的接口函數(shù),采取對(duì)任務(wù)先掛起后恢復(fù)的策略,實(shí)現(xiàn)在優(yōu)先級(jí)搶占時(shí)間片輪轉(zhuǎn)操作系統(tǒng)中任務(wù)的定時(shí)調(diào)度。
[0025]創(chuàng)建任務(wù)時(shí),使所有用戶(hù)任務(wù)具有相同優(yōu)先級(jí),并在初始時(shí)刻讓所有用戶(hù)任務(wù)處于掛起狀態(tài)。在操作系統(tǒng)內(nèi)核的時(shí)間片中斷中,根據(jù)控制周期中任務(wù)需要運(yùn)行的起始時(shí)刻,對(duì)處于掛起態(tài)的任務(wù)進(jìn)行恢復(fù),使其恢復(fù)運(yùn)行,從而實(shí)現(xiàn)任務(wù)的定時(shí)調(diào)度。[0026]二、設(shè)計(jì)方案
[0027]假設(shè)衛(wèi)星控制計(jì)算機(jī)中,應(yīng)用軟件需要以T=16s為控制周期進(jìn)行任務(wù)的定時(shí)調(diào)度,Ts為每個(gè)控制周期開(kāi)始的時(shí)間,在每個(gè)控制周期T期間要執(zhí)行3個(gè)任務(wù)Task_l、Task_2和Task_3,其中每個(gè)任務(wù)允許執(zhí)行時(shí)間為T(mén)l=6s、T2=6s、T3=4s,具體情況如圖1所示。時(shí)間片 tick 值為 IOOms0
[0028]利用本專(zhuān)利的方法實(shí)現(xiàn)上述功能如下:
[0029]I)創(chuàng)建并封裝用戶(hù)任務(wù);
[0030]11)創(chuàng)建任務(wù)前,將所有用戶(hù)任務(wù)控制塊指針定義為一個(gè)一維數(shù)組SYSTaskID[3];
[0031 ] 12 )設(shè)操作系統(tǒng)任務(wù)創(chuàng)建接口函數(shù)為OSTaskSpawn O,用戶(hù)任務(wù)Task_N的函數(shù)為T(mén)askFunc_N O,對(duì)函數(shù)TaskFunc_N O進(jìn)行封裝,得到封裝后的函數(shù)TaskEncap_N(),N=1,2,3。具體封裝過(guò)程為:設(shè)操作系統(tǒng)任務(wù)掛起接口函數(shù)為OSTaskSuspendO ;則在TaSkEncap_N()中,進(jìn)入任務(wù)無(wú)限循環(huán)體時(shí),采用操作系統(tǒng)任務(wù)掛起接口函數(shù)OSTaskSuspendO掛起當(dāng)前任務(wù),然后再調(diào)用用戶(hù)任務(wù)函數(shù)TaskFunc_N(),如圖2所示;
[0032]13)創(chuàng)建用戶(hù)任務(wù) SYSTaskID[N] =OSTaskSpawn(TaskEncap_N, param_l...param_n),其中paran^l^.paramji為操作系統(tǒng)任務(wù)創(chuàng)建接口函數(shù)OSTaskSpawnO中的其他參數(shù),N=I, 2, 3 ;在調(diào)用接口函數(shù)OSTaskSpawn O創(chuàng)建Task_l到Task_N時(shí),把任務(wù)Task_l到Task_N設(shè)置為相同的優(yōu)先級(jí);
[0033]2)利用位圖快速索引用戶(hù)任務(wù)的起始調(diào)度時(shí)刻以及用戶(hù)任務(wù)控制塊指針;
[0034]21)定義一個(gè)用戶(hù)任務(wù)的起始調(diào)度時(shí)刻位圖MapSchedelndext;.]=
tick
MapSchedelndex[160];
[0035]22)定義一個(gè)用戶(hù)任務(wù)的起始調(diào)度任務(wù)位圖MapSchedeTaskt^]=
tick
MapSchedeTask[160];
[0036]3)時(shí)間片中斷時(shí),利用時(shí)間片中斷鉤子函數(shù)控制任務(wù)的定時(shí)調(diào)度;
[0037]31)在操作系統(tǒng)內(nèi)核的時(shí)間片中斷中,對(duì)時(shí)間片進(jìn)行計(jì)數(shù),然后根據(jù)位圖MapSchedelndex[160]判斷該時(shí)間片是否對(duì)新任務(wù)進(jìn)行調(diào)度的時(shí)刻;
[0038]32)當(dāng)MapSchedelndex[160]中的值為O時(shí),不進(jìn)行任何操作;當(dāng)MapSchedelndex[160]中的值為I時(shí),則該位置所對(duì)應(yīng)的時(shí)刻為需要對(duì)新任務(wù)進(jìn)行調(diào)度的時(shí)刻,并設(shè)操作系統(tǒng)任務(wù)恢復(fù)接口函數(shù)為OSTaskResume O,操作系統(tǒng)任務(wù)重啟動(dòng)接口函數(shù)為OSTaskRestart O,將當(dāng)前任務(wù)控制塊指針與SYSTaskID[N]中上一個(gè)時(shí)間段的任務(wù)控制塊指針相比較,如果當(dāng)前任務(wù)控制塊指針與SYSTaskID[N]中上一個(gè)時(shí)間段的任務(wù)控制塊指針不相等則調(diào)用OSTaskResume O直接恢復(fù)本時(shí)間段任務(wù);如果當(dāng)前任務(wù)控制塊指針與SYSTaskID[N]中上一個(gè)時(shí)間段的任務(wù)控制塊指針相等,則需要調(diào)用OSTaskRestartO重新啟動(dòng)上一個(gè)時(shí)間段的任務(wù),然后再調(diào)用OSTaskResumeO恢復(fù)本時(shí)間段任務(wù);其中所述上一個(gè)時(shí)間段的任務(wù)和本時(shí)間段任務(wù)均通過(guò)位圖MapSchedeTask[160]進(jìn)行快速索引,N=I, 2,3,整個(gè)流程如圖3所示。
[0039]本發(fā)明說(shuō)明書(shū)中未作詳細(xì)描述的內(nèi)容屬本領(lǐng)域技術(shù)人員的公知技術(shù)。
【權(quán)利要求】
1.一種優(yōu)先級(jí)搶占時(shí)間片輪轉(zhuǎn)操作系統(tǒng)中任務(wù)定時(shí)調(diào)度方法,其特征在于步驟如下: 1)創(chuàng)建并封裝用戶(hù)任務(wù); 11)創(chuàng)建任務(wù)前,將所有用戶(hù)任務(wù)控制塊指針定義為一個(gè)一維數(shù)組SYSTaskID [N],其中N為任務(wù)個(gè)數(shù); . 12 )設(shè)操作系統(tǒng)任務(wù)創(chuàng)建接口函數(shù)為OSTaskSpawn O,用戶(hù)任務(wù)Task_N的函數(shù)為T(mén)askFunc_NO ,對(duì)函數(shù)TaskFunc_N()進(jìn)行封裝,得到封裝后的函數(shù)TaskEncap_N(),具體封裝過(guò)程為:設(shè)操作系統(tǒng)任務(wù)掛起接口函數(shù)為OSTaskSuspend O ;則在TaskEncap_N()中,進(jìn)入任務(wù)無(wú)限循環(huán)體時(shí),采用操作系統(tǒng)任務(wù)掛起接口函數(shù)OSTaskSuspend O掛起當(dāng)前任務(wù),然后再調(diào)用用戶(hù)任務(wù)函數(shù)TaskFunc_N(); 13)創(chuàng)建用戶(hù)任務(wù) SYSTaskID[N] =OSTaskSpawn(TaskEncap_N, param_l...param_n),其中paran^l^.paramji為操作系統(tǒng)任務(wù)創(chuàng)建接口函數(shù)OSTaskSpawn O中的其他參數(shù);在調(diào)用接口函數(shù)OSTaskSpawn O創(chuàng)建Task_l到Task_N時(shí),把任務(wù)Task_l到Task_N設(shè)置為相同的優(yōu)先級(jí); 2)利用位圖快速索引用戶(hù)任務(wù)的起始調(diào)度時(shí)刻以及用戶(hù)任務(wù)控制塊指針; 21)定義一個(gè)用戶(hù)任務(wù)的起始調(diào)度時(shí)刻位圖MapSchedelndex口,位圖大小為才空泡丨悟IS月
,根據(jù)用戶(hù)調(diào) 度需求將位圖MapSchedelndex[]中需要進(jìn)行任務(wù)調(diào)度的位置置1,其余位置置O ;梓制周期 22)定義一個(gè)用戶(hù)任務(wù)的起始調(diào)度任務(wù)位圖MapSchedeTask□,位圖大小為^^,將MapSchedeTask []中與MapSchedelndex []中值為I的位置所對(duì)應(yīng)的位置上,設(shè)置成需要調(diào)度的任務(wù)的索引值,所述的索引值為SYSTaskID[N]的索引值N; 3)時(shí)間片中斷時(shí),利用時(shí)間片中斷鉤子函數(shù)控制任務(wù)的定時(shí)調(diào)度;. 31)在操作系統(tǒng)內(nèi)核的時(shí)間片中斷中,對(duì)時(shí)間片進(jìn)行計(jì)數(shù),然后根據(jù)位圖MapSchedelndex[]判斷該時(shí)間片是否對(duì)新任務(wù)進(jìn)行調(diào)度的時(shí)刻; 32)當(dāng)MapSchedelndex[]中的值為O時(shí),不進(jìn)行任何操作;當(dāng)MapSchedelndex[]中的值為I時(shí),則該位置所對(duì)應(yīng)的時(shí)刻為需要對(duì)新任務(wù)進(jìn)行調(diào)度的時(shí)刻,并設(shè)操作系統(tǒng)任務(wù)恢復(fù)接口函數(shù)為OSTaskResumeO,操作系統(tǒng)任務(wù)重啟動(dòng)接口函數(shù)為OSTaskRestartO,將當(dāng)前任務(wù)控制塊指針與SYSTaskID[N]中上一個(gè)時(shí)間段的任務(wù)控制塊指針相比較,如果當(dāng)前任務(wù)控制塊指針與SYSTaskID[N]中上一個(gè)時(shí)間段的任務(wù)控制塊指針不相等則調(diào)用OSTaskResume ()直接恢復(fù)本時(shí)間段任務(wù);如果當(dāng)前任務(wù)控制塊指針與SYSTaskID[N]中上一個(gè)時(shí)間段的任務(wù)控制塊指針相等,則需要調(diào)用OSTaskRestartO重新啟動(dòng)上一個(gè)時(shí)間段的任務(wù),然后再調(diào)用OSTaskResume O恢復(fù)本時(shí)間段任務(wù);其中所述上一個(gè)時(shí)間段的任務(wù)和本時(shí)間段任務(wù)均通過(guò)位圖MapSchedeTask[]進(jìn)行快速索引。
【文檔編號(hào)】G06F9/48GK103713948SQ201310746023
【公開(kāi)日】2014年4月9日 申請(qǐng)日期:2013年12月30日 優(yōu)先權(quán)日:2013年12月30日
【發(fā)明者】龔健, 楊孟飛, 喬磊, 楊樺, 顧斌, 彭飛, 王婧, 徐建, 劉波 申請(qǐng)人:北京控制工程研究所