(57)【特許請求の範囲】
【請求項１】
デッドラインの表現単位が異なるタスクをスケジューリングするタスクスケジューリング装置であって、
前記デッドラインの表現単位別にタスクを管理し、
前記デッドラインの表現単位別に管理された各タスク群において、それぞれのタスク群中で最もデッドラインの近いタスクを抽出し、
該抽出されたタスクのうち基準となる表現単位以外のタスクのデッドラインを前記基準となる表現単位にそれぞれ換算して該換算されたデッドラインと前記基準となる表現単位のデッドラインとの中で最もデッドラインの近いタスクをディスパッチすること
を特徴とするタスクスケジューリング装置。
【請求項２】
請求項１に記載のタスクスケジューリング装置において、
前記デッドラインの表現単位が異なるタスクとして、デッドラインが絶対時間により決まるタスクとデッドラインがイベントの発生回数により決まるタスクとを管理すること
を特徴とするタスクスケジューリング装置。
【請求項３】
請求項２に記載のタスクスケジューリング装置において、
複数の種類のイベントが存在し、各種類のイベントは、他の種類のイベントと重なることなく、１または複数の前記デッドラインがイベントの発生回数により決まるタスクに対応しており、該タスクのデッドラインは、対応する種類のイベントの発生回数により決まり、
前記デッドラインが絶対時間により決まるタスクの表現単位を、前記基準となる表現単位とし、
前記デッドラインがイベントの発生回数により決まるタスク群に関しては、イベントの種類別にタスクを管理し、
イベントの種類別に管理された各タスク群において、それぞれのタスク群中で最もデッドラインに近いタスクを抽出し、
該抽出されたタスクのデッドラインを前記基準となる表現単位にそれぞれ換算して該換算されたデッドラインと前記基準となる表現単位のデッドラインとの中で最もデッドラインの近いタスクをディスパッチすること
を特徴とするタスクスケジューリング装置。
【請求項４】
請求項１〜３のいずれかに記載のタスクスケジューリング装置において、
タスクの管理は、それぞれの前記タスク群別に設けたキューで行い、前記キューはそれぞれデッドラインの近いタスクの順にタスクを整列して格納し、
それぞれの前記タスク群中で最もデッドラインの近いタスクとして、それぞれの前記キューの先頭のタスクを用いること
を特徴とするタスクスケジューリング装置。
【請求項５】
実行可能状態のタスクの内、最も短い制限時間を持つタスクを優先的に実行する時限優先スケジューリングを行うタスクスケジューリング装置であって、
デッドラインが絶対時間により決まるタスクを制限時間が短い順に並べ、実行順序を管理する制限時間キュー部と、
イベント入力の種類毎に備えられ、デッドラインが当該イベント入力の発生回数により決まるタスクを制限回数が少ない順に並べ、実行順序を管理する制限回数キュー部と、
前記制限回数キュー部の先頭タスクが持つ制限回数を制限時間に換算する換算部と、
前記換算部により得た換算結果の制限時間と、制限時間キュー部の先頭タスクが持つ制限時間を比較し、制限時間が最も短いタスクを次の実行タスクとして選択する選択部と、
前記選択部が選択したタスクが、現在実行しているタスクと異なる場合にタスクを切替えるディスパッチ部とを備えること
を特徴とするタスクスケジューリング装置。
【請求項６】
請求項５に記載のタスクスケジューリング装置において、
前記制限時間キュー部は、
システムの時間管理に必要な基本周期信号に同期して、前記制限時間キュー部の各タスクの制限時間をデクリメントするデクリメント部と、
新たに前記制限時間キュー部にタスクを追加する場合に、追加するタスクに課された制限時間を、前記制限時間キュー部に並ぶ他のタスクの制限時間と比較し、比較結果に従って前記制限時間キュー部の各タスクを制限時間の短い順に再整列する並び替え部とを備えること
を特徴とするタスクスケジューリング装置。
【請求項７】
請求項５または６に記載のタスクスケジューリング装置において、
前記制限回数キュー部は、
対象イベントの入力が起こる度に、イベント回数キュー部の各タスクの制限回数をデクリメントするデクリメント部と、
新たに前記制限回数キュー部にタスクを追加する場合に、追加するタスクに課された制限回数を、当該制限回数キュー部に並ぶ他のタスクの制限回数と比較し、比較結果に従って当該制限回数キュー部の各タスクを制限回数の少ない順に再整列する並び替え部とを備えること
を特徴とするタスクスケジューリング装置。
【請求項８】
請求項５〜７のいずれかに記載のタスクスケジューリング装置において、
前記換算部は、
イベント入力の周期を基本周期信号の入力回数により求めるイベント周期測定部と、
前記制限回数キュー部の先頭タスクが持つ制限回数に、前記イベント割込み周期測定部が求めたイベント入力の周期を乗じる乗算部を備えること
を特徴とするタスクスケジューリング装置。
【請求項９】
請求項５〜８のいずれかに記載のタスクスケジューリング装置において、
前記換算部は、あるイベントが入力されてから、次に同じイベントが入力されるまでの間、基本周期信号に同期して前記制限回数キュー部の先頭タスクが持つ制限回数分を累積加算する加算部を備えること
を特徴とするタスクスケジューリング装置。
【請求項１０】
請求項９に記載のタスクスケジューリング装置において、
前記選択部は、前記制限回数キュー部に待ちタスクが存在しない場合は、前記累積加算を行わず、前記制限時間キュー部の先頭タスクを優先的に実行させること
を特徴とするタスクスケジューリング装置。
【請求項１１】
実行可能状態のタスクの内、最も短い制限時間を持つタスクを優先的に実行する時限優先スケジューリングを行うタスクスケジューリング方法であって、
デッドラインが絶対時間により決まるタスクを制限時間が短い順に制限時間キュー部に並べ、実行順序を管理する制限時間管理ステップと、
イベント入力の種類毎に備えられ、デッドラインが当該イベント入力の発生回数により決まるタスクを制限回数が少ない順に制限回数キュー部に並べ、実行順序を管理する制限回数管理ステップと、
前記制限回数キュー部の先頭タスクが持つ制限回数を制限時間に換算する換算ステップと、
前記換算ステップにより得た換算結果の制限時間と、制限時間管理ステップにより得た先頭タスクが持つ制限時間を比較し、制限時間が最も短いタスクを次の実行タスクとして選択する選択ステップと、
前記選択ステップにより選択したタスクが、現在実行しているタスクと異なる場合にタスクを切替えるディスパッチステップとを備えること
を特徴とするタスクスケジューリング方法。
【請求項１２】
請求項１１に記載のタスクスケジューリング方法において、
前記制限時間管理ステップは、
システムの時間管理に必要な基本周期信号に同期して、前記制限時間キュー部の各タスクの制限時間をデクリメントするデクリメントステップと、
新たに前記制限時間キュー部にタスクを追加する場合に、追加するタスクに課された制限時間を、前記制限時間キュー部に並ぶ他のタスクの制限時間と比較し、比較結果に従って前記制限時間キュー部の各タスク制限時間の短い順に再整列する並び替えステップとを備えること
を特徴とするタスクスケジューリング方法。
【請求項１３】
請求項１１または１２に記載のタスクスケジューリング方法において、
前記制限回数制御ステップは、
対象イベントの入力が起こる度に、イベント回数キュー部の各タスクの制限回数をデクリメントするデクリメントステップと、
新たに前記制限回数キュー部にタスクを追加する場合に、追加するタスクに課された制限回数を、当該制限回数キュー部に並ぶ他のタスクの制限回数と比較し、比較結果に従って当該制限回数キュー部の各タスクを制限回数の少ない順に再整列する並び替えステップとを備えること
を特徴とするタスクスケジューリング方法。
【請求項１４】
請求項１１〜１３のいずれかに記載のタスクスケジューリング方法において、
前記換算ステップは、
イベント入力の周期を基本周期信号の入力回数により求めるイベント周期測定ステップと、
前記制限回数管理ステップにより得た先頭タスクが持つ制限回数に、前記イベント周期測ステップにより求めたイベント入力の周期を乗じる乗算ステップを備えること
を特徴とするタスクスケジューリング方法。
【請求項１５】
請求項１１〜１４のいずれかに記載のタスクスケジューリング方法において、
前記換算ステップは、あるイベントが入力されてから、次に同じイベントが入力されるまでの間、基本周期信号に同期して前記制限回数ステップにより得た先頭タスクが持つ制限回数分を累積加算する加算ステップを備えること
を特徴とするタスクスケジューリング方法。
【請求項１６】
請求項１５に記載のタスクスケジューリング方法において、
前記選択ステップは、前記制限回数制御ステップの対象となるタスクが存在しない場合は、前記累積加算を行わず、前記制限時間制御ステップにより得られた先頭タスクを優先的に実行させること
を特徴とするタスクスケジューリング方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
タスクスケジューリング装置及びタスクスケジューリング方法に関する。
【０００２】
【従来の技術】
従来から、複数のタスクを擬似的に並列に処理するマルチタスキング処理において、各タスクの実行順序を決定する方法、つまりスケジューリングについて種々の検討がなされてきた。現在、多くのＲＴＯＳ（リアルタイム処理に用いられるオペレーティングシステム）では各タスクに優先度を割り当て、優先度の高いタスクから順に実行する優先度固定型のスケジューリングが用いられている。
【０００３】
しかしながら、この方式ではそれぞれのタスクがいつ終了するかは予測不能であり、いわゆるリアルタイム処理が必要な場合のように、タスクに明確なデッドライン（その時点までに該タスクが終了することが必要な期限）がある場合に、そのデッドラインを保証してスケジューリングを行うことは不可能であった。このようなリアルタイム処理を必要とするスケジューリング方法として、デッドラインでタスクの実行を管理するＥＤＦ(Earlist Deadline First)スケジューリング方式が知られている。これはデッドラインに最も近いタスクから実行権を与える方式である。この方式については以下の文献で紹介されている。
【０００４】
Xu  and  Parnas,  "Scheduling  Process  with  Release  Times,  Deadlines,  Precedence,  and  Exclusion  Relations",  IEEE  Transactions  on  Software  Engineering,  Vol.16,  No.3,  March  1990,  pp.360-369.
藤倉俊幸、”スケジューリング可能性を判定する理論と手法”、月刊インターフェース１９９８年１２月、ｐ１０１〜ｐ１１２、ＣＱ出版社
この方式は、各タスクがデッドラインを守ることができるようにスケジューリングする方式としては、最も直接的で確実である。
【０００５】
【発明が解決しようとする課題】
しかしながら、ＥＤＦスケジューリング方式を適用する為にはすべてのタスクの明確なデッドラインが既知でなくてはならない。ただし、システムによってはデッドラインが、時間により変化するようなタスクが存在する場合がある。たとえばリアルタイム性が要求されるエンジン制御を例にとって見ると、エンジン制御には点火タスク、燃料噴射タスク等のクランク角からの入力される割込み信号の回数でデッドラインが決まるタスクと、何ミリ秒毎といった実時間で予めデッドラインが決まったタスクが混在して動作する。そしてクランク角からの割込み信号に同期したタスクはエンジンの回転数によってクランク割込み信号の間隔が変わり、デッドラインがダイナミックに変化することになる。従ってエンジン回転数により、何ミリ秒毎といった固定周期で起動されるタスクとの実行順位が入れ替わる可能性がある。この為に、エンジン回転数の変化にともないＥＤＦスケジューリングを頻繁に行わなければならない。エンジン回転数は連続的に変化する為、ＥＤＦスケジューリングをその度に行なった場合、ＣＰＵがスケジューリングに多大な処理時間を費やし、本来のタスク処理に費やす時間が圧迫されることが問題となる。
【０００６】
例えば、割込み信号の回数でデッドラインが決まるタスク（所定のイベント入力回数（制限回数）内に実行を完了すべきタスク）である制限回数タスクと、絶対時間で予めデッドラインが決められたタスク（所定時間（制限時間）内に実行を完了すべきタスク）である制限時間タスクとが混在する場合に、最もデッドラインに近いタスク（ディスパッチすべきタスク）を決定するためには、例えば制限回数タスク群のデッドラインの表現単位であるイベント入力の回数（制限回数）を所定の換算係数等を用いて制限時間に換算し、制限時間タスク群と合わせて、制限時間の昇べきの順にすべてのタスクを１つのキューに整列して、一番先頭のタスクを選択するなどする必要がある。このようにした場合、制限回数から制限時間へ換算する際の換算係数はイベント入力の周期（間隔）に応じて変化するので、イベント入力の周期が変わる毎に、すべての制限回数タスクのデッドライン（制限回数）を制限時間へ換算しなければならず、しかもこの換算したすべての制限回数タスクとすべての制限時間タスクとを合わせてタスクの制限時間の大きさによってキュー内のタスクを再整列する処理も行わなければならない。そのためＣＰＵがスケジューリングに多大な処理時間を費やし、本来のタスク処理に費やす時間が圧迫されてしまう。
【０００７】
そこで本発明は、例えば制限時間タスクと制限回数タスクのように、デッドラインの表現単位が異なるタスクが混在し、デッドラインが時間によって変化する表現単位を含む場合に特に効率よくスケジューリングを行うことのできるスケジューリング装置及びスケジューリング方法を提供することを目的とする。
【０００８】
【課題を解決するための手段及び発明の効果】
上述した問題点を解決するためになされた請求項１に記載のタスクスケジューリング装置は、デッドラインの表現単位別にタスクを管理する。そして、デッドラインの表現単位別に管理された各タスク群において、それぞれのタスク群中で最もデッドラインの近いタスクを抽出し、その抽出されたタスクのうち換算すべき表現単位のタスクのデッドラインを、基準となる表現単位にそれぞれ換算する。基準となる表現単位は、管理している表現単位のうちのいずれかの表現単位を利用してもよいし、また、例えば、別の所定の表現単位を利用してもよい。管理しているいずれかの表現単位を基準とする表現単位とする場合には抽出されたタスクのうち基準となる表現単位以外のタスクのデッドラインを、基準となる表現単位にそれぞれ換算してその換算されたデッドラインと基準となる表現単位のデッドラインとの中で最もデッドラインの近いタスクをディスパッチする。一方、別の所定の表現単位を基準とする表現単位とする場合であれば、抽出されたタスクを所定の基準となる表現単位にそれぞれ換算してその換算されたデッドラインの中で最もデッドラインの近いタスクをディスパッチしても良い。
【０００９】
例えば、請求項２に示すように、デッドラインが絶対時間により決まるタスク、すなわちデッドラインが実時間で制限される制限時間タスク（表現単位が制限時間）と、デッドラインがイベントの発生回数により決まる制限回数タスク（表現単位が制限回数）とがある場合には、制限時間タスクと制限回数タスクを別々に管理する。そして、制限時間タスク群の中で最もデッドラインに近いタスクと制限回数タスク群の中で最もデッドラインに近いタスクとから、換算すべきタスクを基準となる表現単位のデッドラインに換算する。
【００１０】
例えば、基準となる表現単位として制限時間を用いる場合には、制限回数タスク群の中で最もデッドラインに近いタスクの制限回数を制限時間に換算する。そしてこの換算した制限時間と制限時間タスク群の中で最もデッドラインに近いタスクの制限時間との中で、制限時間の最も小さいタスクをディスパッチする。
【００１１】
一方、基準となる表現単位として制限回数を用いる場合には、制限時間タスク群の中で最もデッドラインに近いタスクの制限時間を制限回数に換算する。そしてこの換算した制限回数と制限回数タスク群の中で最もデッドラインに近いタスクの制限回数とを比較して、制限回数の最も少ないタスクをディスパッチする。
【００１２】
また、基準となる表現単位として制限回数や制限時間とは別の所定の制限単位を用いる場合には、制限回数タスク群の中で最もデッドラインに近いタスクの制限回数を所定の制限単位に換算し、制限時間タスク群の中で最もデッドラインに近いタスクの制限時間を所定の制限単位に換算する。そして換算された制限単位の値を比較してその値の最も小さいタスクをディスパッチする。
【００１３】
このようにデッドラインの表現単位が異なるタスクを別々に管理し、各々の表現単位のタスク群の中で最もデッドラインに近いタスクをそれぞれ抽出するので、各表現単位内ではそれぞれの表現単位のままで管理することができる。したがって、従来は１つにまとめて管理する場合に必要なすべてのタスクの表現単位の値の換算処理や、換算後の値を用いて整列する処理などが不要になり、効率よくスケジューリングを行うことのできる。
【００１４】
しかも、換算内容が時々刻々変化するものがある場合には、単に抽出されたそれぞれの表現単位における最もデッドラインの近いタスクのうち、換算内容の変化したタスクを換算しなおして、最もデッドラインの近いタスクを選ぶだけでよい。したがって従来のように換算内容が変化するたびにすべてのタスクの換算をし直して整列し直す必要がない。よって、例えば、エンジンの回転によって発生するクランク割込み等のようにイベントの周期に応じて換算係数等の換算方法（換算関数）が変化する場合においても、スケジューリングを効率よく行うことができる。
【００１５】
なお基準となる表現単位は、表現単位を統一した際に最小のピッチを持つ表現単位を採用するとよい。すなわち例えば、表現単位を統一しようとした際に制限時間の方が制限回数より細かいピッチで表現される場合には制限時間を基準となる表現単位とし、制限回数の方が制限時間より細かいピッチで表現される場合には制限回数を基準となる表現単位とすればよい。こうすることで換算後の値を正確な値とすることができる。
【００１６】
そして、請求項３に示すように、複数の種類のイベントが存在し、各種類のイベントは、他の種類のイベントと重なることなく、１または複数のデッドラインがイベントの発生回数により決まるタスクに対応しており、該タスクのデッドラインは、対応する種類のイベントの発生回数により決まるよう構成されていても良い。そして、デッドラインが絶対時間により決まるタスクの表現単位を、基準となる表現単位とし、デッドラインがイベントの発生回数により決まるタスク群に関しては、イベントの種類別にタスクを管理し、イベントの種類別に管理された各タスク群において、それぞれのタスク群中で最もデッドラインに近いタスクを抽出し、該抽出されたタスクのデッドラインを基準となる表現単位にそれぞれ換算して該換算されたデッドラインと基準となる表現単位のデッドラインとの中で最もデッドラインの近いタスクをディスパッチしても良い。このようにすれば、イベントの種類毎にタスクが管理されるので、あるイベントが発生した際にはそのイベントに関して管理されたタスク群に対して処理を行うだけで済む。また、換算もイベントの種類毎行うので、例えば換算係数等をイベントの種類毎に変えることも容易にできる。
【００１７】
なおそれぞれの表現単位別のタスクの管理は例えば請求項４のようにするとよい。このようにすれば、管理を容易に行うことができる。
このように請求項１〜４のいずれかに記載のタスクスケジューリング装置よれば、すべてのタスクを１つにまとめて管理する場合に比べて、効率よくＥＤＦスケジューリングを行うことができる。
【００１８】
こうしたタスクスケジューリング装置は、例えば請求項５に示すように構成することができる。請求項５に記載のタスクスケジューリング装置によれば、換算部によって制限回数キュー部の先頭タスクが持つ制限回数が制限時間に換算され、制限時間キュー部の先頭タスクが持つ制限時間と比較して制限時間が最も短いタスクをディスパッチする。
【００１９】
したがって、ディスパッチすべきタスクを決定するために、従来のようにデッドラインが制限回数で表現されるすべてのタスクのデッドラインを制限時間によるデッドラインに換算して整列する必要はなく、それぞれの制限回数キュー部の先頭タスクのみ制限時間に換算するだけで済む。したがって例えば換算部における換算係数が、時間の経過に伴って変化しても、先頭タスクのみ新たな換算係数を用いて制限時間に換算するだけでよい。よって、デッドラインが実時間で制限されるタスクと、デッドラインがイベント等の割り込み回数で決まりその割り込み周期が時間とともに変化するタスクを含むシステムにおいて、効率よくＥＤＦスケジューリングを行うことができる。
【００２０】
なお、このようなスケジューリングは、ソフトウェアでもハードウェアでも行うことができる。
そしてこうした制限時間キュー部は、例えば請求項６のように構成することができる。また制限回数キュー部は、例えば請求項７のように構成することができる。
【００２１】
請求項６に記載のタスクスケジューリング装置は、制限時間キュー部の各タスクの制限時間を、基本周期信号に同期してディクリメントする。また、新たなタスクを追加する際に制限時間の短い順に再整列する。
同様に請求項７に記載のタスクスケジューリング装置は、制限回数キュー部の各タスクの制限回数を、基本周期信号に同期してディクリメントする。また、新たなタスクを追加する際に制限回数の少ない順に再整列する。
【００２２】
制限回数キュー部の先頭タスクが持つ制限回数を制限時間に換算する方法としては、種々の方法がありうる。例えば、制限回数と制限時間の関係をルックアップテーブルとして持ち、制限回数をインデックスとして制限時間に換算するようにしてもよい。また例えば、請求項８に示すように制限回数キュー部の持つ制限回数に基本周期信号の入力回数により求めたイベント入力の周期を乗じて制限時間に換算するようにしてもよい。
【００２３】
また請求項９に示すように、あるイベントが入力されてから次に同じイベントが入力されるまでの間、基本周期信号入力に同期して制限回数キュー部の先頭タスクが持つ制限回数分を累積加算して換算するようにしてもよい。そして、この場合、選択部は制限回数キュー部に待ちタスクが存在しない場合には、請求項１０に示すように累積加算を行わず、制限時間キュー部の先頭タスクを優先的に実行するようにしてもよい。
【００２４】
請求項８〜１０に示すように、イベント周期内の基本周期信号の入力回数を換算係数として用いるのは、次のイベント入力までの時間をイベント入力の周期から推定することに相当する。すなわちイベント入力の間隔が相対的に短ければイベント周期内の基本周期信号の入力回数は小さくなり換算後の制限時間は短くなる。一方、イベント入力の間隔が相対的に長ければ基本周期信号の入力回数は大きくなり、制限時間は長くなる。すなわち周期から制限時間を推定することに相当する。このような換算方法は、イベント信号の入力間隔がまったくランダムではなく、ある連続性を持って変化する場合に特に有効である。例えばエンジン制御のように機械系の動作を検出するセンサ等からの入力信号は、ある連続性を持って変化する場合が多く、特に有効である。
【００２５】
なお、請求項１１〜１６は、請求項５〜１０に記載の内容にそれぞれ対応するタスクスケジューリング方法であり、それぞれ対応する請求項の効果と同様の効果を奏する。例えば、請求項１１に記載のタスクスケジューリング方法によれば、上述した請求項５に記載のタスクスケジューリング装置における効果と同様の効果を奏する。
【００２６】
【発明の実施の形態】
以下、本発明が適用された実施例について図面を用いて説明する。なお、本発明の実施の形態は、下記の実施例に何ら限定されることなく、本発明の技術的範囲に属する限り種々の形態を採りうることは言うまでもない。
［第１実施例］
図１は第１実施例としてのタスクスケジューリング装置１００の構成を示す図である。本実施例のタスクスケジューリング装置１００は、制限時間キュー部１０、第１〜第ＮまでのＮ個の制限回数キュー部２０、第１〜第ＮまでのＮ個の換算部３０、選択部４０、ディスパッチ部５０より構成される。
【００２７】
制限時間キュー部１０は実行可能かつデッドラインがタイマー割込み等の基本周期信号に同期した実時間で決まるタスクが待ち行列を形成する。基本周期信号は、ＣＰＵに使用されるクロックを分周したもので、例えばＣＰＵの１０ＭＨｚのクロックを１００００分の１分周することにより１ｍｓの周期の基本周期信号を生成する。待ち行列には、各タスクに予め割り当てられたＩＤと各タスクに対する現時刻における制限時間とのペアを制限時間が小さいタスク（デッドラインが近いタスク）順に整列し、先頭に位置するタスクの制限時間とタスクＩＤを選択部４０に出力する。また、制限時間キュー（待ち行列）中の各タスクに対する制限時間はタイマー割込みが入る毎に、デクリメントする。
【００２８】
第１〜第Ｎ制限回数キュー部２０は実行可能かつデッドラインが第１〜第Ｎのそれぞれのイベントの入力回数で決まるタスクが待ち行列を形成する。この待ち行列には各タスクに予め割り当てられたＩＤと各タスクの現時刻における各イベント入力に対する制限回数とのペアを制限回数が小さいタスク（デッドラインが近いタスク）順に整列し、先頭に位置するタスクの制限回数を換算部３０へ、タスクＩＤを選択部４０へ出力する。また、制限回数キュー部２０中の各タスクに対する制限回数はイベント入力が起こる毎に、デクリメントする。
【００２９】
第１〜第Ｎ換算部３０はそれぞれ第１〜第Ｎ制限回数キュー部２０より出力される先頭タスクの制限回数を、制限時間に換算し、換算結果を選択部４０へ出力する。
選択部４０は、制限時間キュー部１０の先頭タスクの現時点での制限時間と、第１〜第Ｎ制限回数キュー部２０のそれぞれの先頭タスクの現時点での制限回数をそれぞれ第１〜第Ｎ換算部３０で換算した換算結果の制限時間と比較し、これらの中で最も制限時間が少ないタスクを選択して、そのタスクＩＤをディスパッチ部５０に出力する。
【００３０】
ディスパッチ部５０は選択部４０より入力したタスクＩＤが、現在、ＣＰＵで実行中のタスクに対するタスクＩＤと異なる場合に、選択部４０より入力したタスクＩＤのタスクのディスパッチを実施する。このようにして最もデッドラインに近いタスクを実行させることができる。
【００３１】
なお、換算部３０と選択部４０とを合わせ、図１に破線で示す部分を換算選択部としてまとめたブロック構成としてもよい。
以下、さらに具体的にタスクスケジューリング装置１００の構成及び動作を説明する。ここでは、説明を分かりやすくするため、制限回数キュー部２０が１つのみ（Ｎ＝１）の場合について説明する。
【００３２】
例えば、図２に示すように、現在の制限時間キュー部１０の先頭のタスクＩＤが２で制限時間が１９、制限回数キュー部２０の先頭のタスクＩＤが１で制限回数が６の場合について考えてみる。この制限回数「６」は、図３に示す換算部３０によって制限時間に換算する。なお図３に示す換算部３０は請求項１０に記載の換算部に相当する。
【００３３】
換算部３０の動作を図３のブロック図及び図４に示すタイミングチャートを用いて説明する。
図３の換算部３０に入力されるイベント入力信号は、外部から非同期に入力されたイベント割込み信号を一旦、基本周期信号でラッチすることにより、基本制御信号に同期した信号としたものである。図３に示すＲＥＧ１は制限回数キュー部２０の先頭タスクの制限回数を記憶するレジスタで、Ｓｅｌｅｃｔｏｒ１の出力が入力される。Ｓｅｌｅｃｔｏｒ１は制御信号であるイベント入力信号が０の場合はＲＥＧ１の出力を、１の場合はＲＥＧ１の出力をデクリメント（ＤＥＣ）した結果を出力するセレクタである。これによりＲＥＧ１はイベント入力信号が１で、かつ基本周期信号の立ち上がりに同期して制限回数をデクリメントする。図４のタイミングチャートにおいては、１回目のイベント入力信号が１の際に、基本周期信号の立ち上がりに同期してＲＥＧ１が６から５にデクリメントされる動作がそれに相当する（時刻ｔ１参照）。
【００３４】
ＲＥＧ２はＳｅｌｅｃｔｏｒ２の出力が入力されるレジスタである。Ｓｅｌｅｃｔｏｒ２は制御信号であるイベント入力信号が０の場合はＲＥＧ２の値とＲＥＧ１の出力からデクリメント（ＤＥＣ）した値を加算した結果を、１の場合は０を出力するセレクタである。これによりＲＥＧ２は基本周期信号の立ち上がり時に、イベント入力信号が１の場合は、値を０にリセットし、０の場合はＲＥＧ１からデクリメントした値を自自身の値に加算する。図４のタイミングチャートにおいては１回目のイベント入力信号が１の際に、基本周期信号の立ち上がりで０にリセットされ（時刻ｔ１参照）、その後、基本周期信号の立ち上がりに同期して、４、８、１２とＲＥＧ１が保持する５から１デクリメントした４づつ累積加算を行う動作がそれに相当する。
【００３５】
ＲＥＧ３はＳｅｌｅｃｔｏｒ３の出力が入力されるレジスタである。Ｓｅｌｅｃｔｏｒ３は制御信号であるイベント入力信号が０の場合はＲＥＧ３の値からデクリメント（ＤＥＣ）した値を、１の場合はＡｄｄｅｒの値を出力するセレクタである。これによりＲＥＧ３は基本周期信号の立ち上がり時に、イベント入力信号が０の場合は、自身の値をデクリメントし、１の場合はＲＥＧ２が保持する値とＲＥＧ１をデクリメントした値を加算した値をプリセットする。図４のタイミングチャートにおいて、２回目のイベント入力信号が１で、かつ基本周期信号の立ち上がりに同期して、ＲＥＧ２が保持する値「１２」とＲＥＧ１をデクリメントした値「４」を加算した値「１６」をプリセットし（時刻ｔ２参照）、その後、基本周期信号の立ち上がりに同期して、１５、１４とデクリメントする動作がそれに相当する。
【００３６】
以上の動作により求まる制限回数キュー部２０の先頭タスクの制限回数を制限時間に換算した結果（ＲＥＧ３）と、制限時間キュー部１０の先頭タスクの制限時間が選択部４０へ出力され、選択部４０においてこれらの制限時間の大小判定を行い、小さい値を持つ方の先頭タスクのタスクＩＤをディスパッチ部５０に出力し、ディスパッチ部５０でそのタスクＩＤのタスクをディスパッチすることでそのタスクがＣＰＵで実行されることになる。図４のタイミングチャートにおいては、制限時間キュー部１０の先頭タスクの制限時間が７の時に、制限回数キュー部２０の先頭タスクの制限時間（ＲＥＧ３）の値が制限時間キュー部１０の制限時間より小さくなる為、選択部４０が出力するタスクＩＤが２から１へと変化する（時刻ｔ３参照）。これによりディスパッチ部５０によりタスク２からタスク１へのディスパッチ処理が実施される。このようなディスパッチが起きたのは、イベント入力信号の周期が時間とともに短い周期へと変化し、制限回数で示すタスク１のデッドラインの方が、制限時間で示すタスク２のデッドラインより早まったことによる。
【００３７】
なお、制限回数キュー部２０が複数ある場合（図１においてＮ＞１）にも、それぞれの制限回数キュー部２０は、同様に動作する。そして、選択部４０は、それぞれの第１〜第Ｎ換算部３０によって換算されたそれぞれの換算結果の換算時間と、制限時間キュー部１０の出力する制限時間との中で、最も制限時間の短いタスクを選択し、そのタスクＩＤをディスパッチ部５０へ出力する。したがって、もっともデッドラインに近いタスクがＣＰＵによって実行される。
【００３８】
このようにして、制限時間キュー部１０と制限回数キュー部２０とをそれぞれ別のキューとして備え、例えば何ミリ秒毎といった実時間で予めデッドラインが決まったタスク（タスクＩＤと制限時間のペア）は制限時間キュー部１０に制限時間の短い順に並べる一方、デッドラインが割込みの間隔で変化するタスクについてはそれぞれのイベント毎の制限回数キュー部２０を設け、それぞれの制限回数キュー部２０内で制限回数の短い順にタスク（タスクＩＤと制限回数のペア）を並べる。そして、制限回数キュー部２０の先頭タスクの制限回数を換算部３０で制限時間に換算して、選択部４０はこの換算結果の制限時間群と制限時間キュー部１０の先頭タスクの制限時間との中で最も制限時間が少ないタスクのタスクＩＤをディスパッチ部５０へ出力し、ディスパッチ部５０がそのタスクＩＤのタスクをディスパッチする。
【００３９】
よって、従来のようにキューが１本で制限回数を毎度制限時間に変換してキュー内のタスク（タスクＩＤと制限時間のペア）の並べ替えをし、そのキューの先頭タスクをディスパッチする方式に比べて処理時間がかからず、効率よくスケジューリングを行うことができる。
［第２実施例］
第２実施例は、第１実施例の構成のうち換算部３０の構成を図３に示した構成から図５に示す構成に代えたものである。図５の換算部３０は請求項９に記載の換算部に相当する。
【００４０】
第１実施例と同様にして、制限時間キュー部１０及び制限回数キュー部２０の状態が図２に示す状態であるものとして、図５の換算部３０を用いた場合の動作を図６のタイミングチャートに示して説明する。
図５に示すＲＥＧ１は、図３に示すＲＥＧ１と同様の動作となる。
【００４１】
ＲＥＧ２はＳｅｌｅｃｔｏｒ２の出力が入力される。Ｓｅｌｅｃｔｏｒ２は制御信号であるイベント入力信号が０の場合はＲＥＧ２の値をインクリメントした値を、１の場合は１を出力する。これによりＲＥＧ２は基本周期信号の立ち上がり時に、イベント入力信号が１の場合は、値を１にプリセットし、１の場合は自身の値をインクリメントする。図６のタイミングチャートにおいては１回目のイベント入力信号が１の際に、基本周期信号の立ち上がりに同期して１にリセットされ（図６のｔ１参照）、その後、基本周期信号の立ち上がりに同期して、２、３、４とインクリメントする動作がそれに相当する。
【００４２】
ＲＥＧ３はＳｅｌｅｃｔｏｒ３の出力が入力される。Ｓｅｌｅｃｔｏｒ３は制御信号であるイベント入力信号が１の場合はＲＥＧ２の値とＲＥＧ１からデクリメントした値を乗算した結果を、０の場合はＲＥＧ３をデクリメントした値を出力する。これによりＲＥＧ３は基本周期信号の立ち上がり時に、イベント入力信号が１の場合は、乗算結果（Ｍｕｌの出力）をプリセットし、０の場合はデクリメント動作を行う。図６のタイミングチャートにおいて、２回目のイベント入力信号が１の際に、基本周期信号の立ち上がりに同期して、ＲＥＧ１が保持する値５からデクリメントした値「４」とＲＥＧ２で保持する値「４」を乗算した値「１６」をプリセットし（図６のｔ２参照）、その後、基本周期信号の立ち上がりに同期して、１５、１４とデクリメントする動作がそれに相当する。図３、図５においてＲＥＧ３の導出過程は異なるものの、図４、図６の両タイミングチャートにおいてＲＥＧ３の保持する値はまったく同じものとなり、その結果ディスパッチ部により同じタイミングでタスクＩＤ＝２からタスクＩＤ＝１へのディスパッチ処理が実施される（図６のｔ３参照）。
［第３実施例］
図７及び図８は、コンピュータによって実行されるタスクスケジューリング処理を示すフローチャートである。図７におけるＳＴＥＰ１、図８におけるＳＴＥＰ６は特許請求の範囲に記載の制限時間制御ステップに相当し、ＳＴＥＰ２、ＳＴＥＰ７は制限回数ステップに相当する。また、ＳＴＥＰ３は換算ステップに相当し、ＳＴＥＰ４は選択ステップに相当する。そして、ＳＴＥＰ５はディスパッチステップに相当する。
【００４３】
以下、図７及び図８のフローチャートを参照して処理のながれについて説明する。最初にフローチャート中に用いる変数について説明する。
図７においてＴＭＱ［ｔ］は制限時間キューを表わし、構成要素としてタスクＩＤ：ＴＭＱ［ｔ］．ｉｄに、制限時間をＴＭＱ［ｔ］．ｔｉｍｅを持つ。なおＴＭＱ［０］が０番目の制限時間キュー、すなわち制限時間キューの先頭を表わす。一方、ＥＶＱ［ｔ］は制限回数キューを表わし、構成要素としてタスクＩＤ：ＥＶＱ［ｔ］．ｉｄ、制限回数：ＥＶＱ［ｔ］．ｐｒｉｏｄを持つ。ＥＶＱ［０］が０番目の制限時間キュー、すなわち制限時間キューの先頭を表わす。
【００４４】
ＥＶＱ．ｔｍｐは制限回数キューの先頭タスクの制限回数を制限時間に換算する際に一時的に値を格納する変数である。また、ＥＶＱ．ｔｉｍｅは制限回数キューの先頭タスクの制限回数を制限時間に換算した結果が代入される変数である。
【００４５】
ＲＵＮ＿ＴＳＫは現在、ＣＰＵにて実行されているタスクのタスクＩＤが代入される変数であり、ＴＭＰ＿ＴＳＫはディスパッチ有無の判定の際に用いる変数である。
また基本周期信号としてはタイマー割込みを、イベント入力信号としてはイベント割込みを想定する。
【００４６】
新しいタスクをキューに追加する場合やキューからタスクを削除する場合、図８に示すようする。すなわち、制限時間キューに対してタスクの追加、削除が起きた場合には、ＳＴＥＰ６において各タスクの持つ制限時間に基づいてタスクの並び替えを行い、先頭タスクに最も制限時間の短いタスクを持ってきて、以後、制限時間の短い順に整列する。また制限回数キューに対してタスクの追加、削除が起きた場合には、ＳＴＥＰ７において各タスクの持つ制限回数に基づいてタスクの並び替えを行い、先頭タスクに最も制限回数の短いタスクを持ってきて、以後、制限回数の少ない順に整列する。
【００４７】
一方、割込みが発生すると図７の処理を実行する。はじめに割込みの要因がタイマ割込みか否かを判定し（Ｓ１００）、タイマ割込みの場合にはＳＴＥＰ１の処理を実行する（Ｓ１１０へ移行する）。
ＳＴＥＰ１において、タイマー割込みにより制限時間キュー上のすべてのタスクの制限時間をデクリメントする。すなわち、はじめにキューの位置を示す値ｔを０とし（Ｓ１１０）、ｔ番目の制限時間キューであるＴＭＱ［ｔ］に待ち要素があるか否かを判定して（Ｓ１２０）、待ち要素がある場合には（Ｓ１２０：Ｙ）、そのｔ番目の制限時間キューのタスクの制限時間をデクリメントし（ＴＭＱ［ｔ］．ｔｉｍｅ−−）、待ち要素の有無を判定する位置を次の位置へ変更し（ｔ＋＋）、Ｓ１２０へ戻る。このようにして待ち要素が無くなるまで、各構成要素の制限時間をデクリメントする。そして、待ち要素が無くなると（Ｓ１２０：Ｎ）、ＳＴＥＰ３のＳ１４０へ移行する。
【００４８】
Ｓ１４０では、制限回数キューの先頭ＥＶＱ［０］に待ち要素があるか否かを判定し、待ち要素がある場合には（Ｓ１４０：Ｙ）、現在のＥＶＱ．ｔｍｐの値に、制限回数キューの先頭タスクの制限回数から１引いた値であるＥＶＱ［０］．ｐｒｉｏｄ−１を加え、制限回数の換算結果であるＥＶＱ．ｔｉｍｅをディクリメントする。一方制限回数キューの先頭ＥＶＱ［０］に待ち要素がない場合には（Ｓ１４０：Ｎ）この処理を終了する。
【００４９】
このようにして、割込み要因がタイマ割込みの場合には（Ｓ１００：Ｙ）、制限時間キューの待ち要素の制限時間をデクリメントし、制限回数キューの換算結果をディクリメントし、制限回数を制限時間に換算するための累積加算（ＥＶＱ．ｔｍｐ＋＝（ＥＶＱ［０］．ｐｒｉｏｄ−１）を行う。
【００５０】
一方、割込み要因がイベント割込みの場合には（Ｓ１００：Ｎ，Ｓ１６０：Ｙ）、ＳＴＥＰ２（Ｓ１７０）からの処理を行う。
ＳＴＥＰ２では、イベント割込みにより制限回数キュー上のすべてのタスクの制限回数をデクリメントする。すなわち、ＳＴＥＰ１と同様に、はじめにキューの位置を示す値ｔを０とし（Ｓ１７０）、ｔ番目の制限回数キューであるＥＶＱ［ｔ］に待ち要素があるか否かを判定して（Ｓ１８０）、待ち要素がある場合には（Ｓ１８０：Ｙ）、そのｔ番目の制限回数キューのタスクの制限回数をデクリメントし（ＥＶＱ［ｔ］．ｐｒｉｏｄ−−）、待ち要素の有無を判定する位置を次の位置へ変更し（ｔ＋＋）、Ｓ１８０へ戻る。このようにして待ち要素が無くなるまで、各構成要素の制限回数をデクリメントする。そして、待ち要素が無くなると（Ｓ１２０：Ｎ）、ＳＴＥＰ３のＳ２００へ移行する。
【００５１】
Ｓ２００では、制限回数キューの先頭ＥＶＱ［０］に待ち要素があるか否かを判定し、待ち要素がある場合には（Ｓ２００：Ｙ）、制限回数キューの先頭タスクの制限回数の制限時間への換算結果であるＥＶＱ．ｔｉｍｅにＥＶＱ．ｔｍｐの値を代入し、ＥＶＱ．ｔｍｐをリセットする（ＥＶＱ．ｔｍｐ＝０）（Ｓ２１０）。
【００５２】
続いてＳＴＥＰ４では、ＲＵＮ＿ＴＳＫをＴＭＰ＿ＴＳＫに待避し（Ｓ２２０）、制限時間キューの先頭タスクの制限時間ＴＭＱ［０］．ｔｉｍｅと制限回数キューの先頭タスクの制限回数を制限時間に換算したＥＶＱ．ｔｉｍｅを比較し（Ｓ２３０）、制限時間キューの先頭タスクの制限時間が制限回数キューの先頭タスクの制限回数を換算した制限時間より小さい（ＴＭＱ［０］．ｔｉｍｅ  ＜ＥＶＱ．ｔｉｍｅ）場合は（Ｓ２３０：Ｙ）、制限時間キューの先頭タスクのタスクＩＤをＲＵＮ＿ＴＳＫに代入し（ＲＵＮ＿ＴＳＫ＝ＴＭＱ［０］．ｉｄ）（Ｓ２４０）、そうでない場合は（Ｓ２３０：Ｎ）、制限回数キューの先頭タスクのタスクＩＤをＲＵＮ＿ＴＳＫに代入する（ＲＵＮ＿ＴＳＫ＝ＥＶＱ［０］．ｉｄ）（Ｓ２５０）。
【００５３】
続くＳＴＥＰ５では、ＴＭＰ＿ＴＳＫとＲＵＮ＿ＴＳＫが異なるか否かを判定し（Ｓ２６０）、ＴＭＰ＿ＴＳＫとＲＵＮ＿ＴＳＫが異なる場合は（Ｓ２６０：Ｙ）、現在ＣＰＵにて実行しているタスクと異なるタスクをＣＰＵで実行する必要がある為、タスクＩＤがＴＭＰ＿ＴＳＫのタスクからタスクＩＤがＲＵＮ＿ＴＳＫのタスクへのディスパッチ処理を実行する（Ｓ２７０）。
【００５４】
このように、ＳＴＥＰ３の処理によって、制限回数キューの先頭タスクの制限回数を制限時間に換算し、その換算結果の制限時間と制限時間キューの先頭の制限時間を比較することで、タスクスケジューリングを行う。したがって、スケジューリングのコストを減らすことができる。
【００５５】
なお、本実施例においてＳＴＥＰ３のＳ１５０の処理が請求項１６に記載の加算ステップに相当する。
［第４実施例］
第３実施例における図７のＳＴＥＰ３の換算処理に代えて、図９に示すＳＴＥＰ３の処理を行うように構成することもできる。すなわち、図７のＳ１５０に代えて、図９のＳ１５５を行い、図７のＳ２１０に代えて、図９のＳ２１５を行う。その他の処理は、第３実施例と同様であるので、Ｓ１５５及びＳ２１５の処理について説明する。
【００５６】
ＳＴＥＰ３において、タイマー割込みが起き（Ｓ１００：Ｙ）、制限回数キューにタスクが存在する場合に（Ｓ１４０：Ｙ）、ＥＶＱ．ｔｍｐをインクリメントし、換算結果ＥＶＱ．ｔｉｍｅをデクリメントする。また、イベント割込みが起き（Ｓ１００：Ｙ，Ｓ１６０：Ｙ）、制限回数キューにタスクが存在する場合は（Ｓ２００：Ｙ）、制限回数キューの先頭タスクの制限回数から１減じた値（ＥＶＱ［０］．ｐｒｉｏｄ−１）にＥＶＱ．ｔｍｐを乗じた値をＥＶＱ．ｔｉｍｅに代入し、ＥＶＱ．ｔｍｐを０にリセットする（Ｓ２１５）。
【００５７】
このようにして、制限回数キューの先頭タスクの制限回数を制限時間に換算してもよい。本実施例においてＳＴＥＰ３のＳ２１５の処理が請求項１５に記載の乗算ステップに相当する。
［第５実施例］
第１実施例から第４実施例では、制限回数キュー部の先頭タスクを換算部で制限時間に換算することで、デッドラインの最も短いタスクを選択しているが、逆に、制限時間を制限回数に換算した上ですることでデッドラインの最も短いタスクを選択するようにしてもよい。
【００５８】
すなわち、制限回数の最小周期と制限時間の最小周期（基本周期）を比較して小さい方の値に変換すればよいので、制限回数の方が制限時間より小さい周期の場合にはこのような構成になる。
例えば、第１イベント入力信号の制限回数で換算する場合には、図１０に示すように、制限時間キュー部１０の先頭の制限時間を第１換算部３０において第１イベント入力信号の制限回数で換算する一方、図示しない第２制限回数キュー部２０〜第Ｎ制限回数キュー部２０までの制限回数を第１イベント入力信号の制限回数で換算する。そして、これら換算部３０からの出力と第１制限回数キュー部の先頭の制限回数との中で最も制限回数が少ないタスクのタスクＩＤを選択部４０で選択し、ディスパッチ部５０へ出力する。したがって、最もデッドラインに近いタスクが実行されることになる。
［第６実施例］
第１〜第４実施例の構成において、換算部あるいは換算ステップは、制限回数と制限時間の関係をルックアップテーブルにしておいて、制限回数をインデックスとして制限時間を求めることもできる。第５実施例においても同様にルックアップテーブルを用いて変換してもよい。
［第７実施例］
第１実施例〜第６実施例に記載の構成は、例えばエンジンの電子制御装置（ＥＣＵ）におけるタスクスケジューリング装置として用いることができる。例えば、基本周期が１ｍｓのＥＣＵにおける制御用タスクとして、制限時間が２１ｍｓのエンジンの水温検知タスクと、制限時間が１９ｍｓの吸気管の圧力検知タスクと、制限回数が２回でエンジン１回転毎にかかる割込みに基づく処理タスクがある場合に、例えばエンジンの回転数が６０００ｒｐｍの場合には、換算係数は１０ｍｓとなる。この場合、換算後の制限時間は１０ｍｓ×２＝２０ｍｓとなり、制限時間が１９ｍｓの吸気管の圧力検知タスクがディスパッチされることになる。しかし、エンジンの回転数の変化に応じて、これらの優先順位は変化する。この例のように、タスクの優先順位がクロスするオーダーのデッドラインを持つタスクを持つ場合に特に有効に機能する。
【図面の簡単な説明】
【図１】タスクスケジューリング装置の構成を示すブロック図である。
【図２】第１実施例の制限時間及び制限回数の例を示す図である。
【図３】第１実施例の制限回数キュー部と換算部の構成を示す説明図である。
【図４】第１実施例の制限回数キュー部・換算部・選択部の動作を示す説明図である。
【図５】第２実施例の換算部の構成を示す図である。
【図６】第２実施例の制限回数キュー部・換算部・選択部の動作を示す説明図である。
【図７】第３実施例のタスクスケジューリング処理における割込み時の処理を示すフローチャートである。
【図８】第３実施例のタスクスケジューリング処理におけるタスク状態変化時の処理を示すフローチャートである。
【図９】第４実施例のタスクスケジューリング処理を示すフローチャートである。
【図１０】第５実施例のタスクスケジューリング装置の構成を示すブロック図である。
【符号の説明】
１００…タスクスケジューリング装置
１０…制限時間キュー部
２０…制限回数キュー部
３０…換算部
４０…選択部
５０…ディスパッチ部
【図１】
0004449255.tif 000002
【図２】
0004449255.tif 000003
【図３】
0004449255.tif 000004
【図４】
0004449255.tif 000005
【図５】
0004449255.tif 000006
【図６】
0004449255.tif 000007
【図７】
0004449255.tif 000008
【図８】
0004449255.tif 000009
【図９】
0004449255.tif 000010
【図１０】
0004449255.tif 000011