(57)【特許請求の範囲】
【請求項１】
レディ・キューと、タイマ・キューと、実行中タスク・アドレスと、レディ・キュー先頭ポインタと、レディ・キュー空先頭ポインタと、タイマ・キュー先頭ポインタと、タイマ・キュー空先頭ポインタと、強制終了タスク用メモリと、第１の強制終了タスク用カウンタと、第２の強制終了タスク用カウンタと、タスク・カウンタとから構成されるリアルタイムＯＳのメモリ領域を用いたタスク管理方法であって、
前記レディ・キューは、起動タスクのアドレスとその前後のポインタを記憶し、
前記タイマ・キューは、遅延起動タスクのアドレスとその遅延時間を記憶し、  前記実行中タスク・アドレスは、実行中タスクのアドレスを記憶し、
前記レディ・キュー先頭ポインタは、前記レディ・キューの先頭ポインタを記憶し、
前記レディ・キュー空先頭ポインタは、レディ・キュー空の先頭ポインタを記憶し、
前記タイマ・キュー先頭ポインタは、前記タイマ・キューの先頭ポインタを記憶し、
前記タイマ・キュー空先頭ポインタは、タイマ・キュー空の先頭ポインタを記憶し、
前記強制終了タスク用メモリは、タスク強制終了システム・コールが指定するタスク・アドレスを記憶し、
前記タスク強制終了システムコールの処理を、自タスク終了システムコール中で行い、
前記第１の強制終了タスク用カウンタは強制終了するタスクの有効範囲を示し、前記第１の強制終了タスク用カウンタがＮとすると、前記レディ・キューに登録されているＮ番目までのタスクが強制終了の対象となり、
前記第２の強制終了タスク用カウンタは強制終了するタスクの無効範囲を示し、前記第２の強制終了タスク用カウンタがＭとすると、前記レディ・キューに登録されているＭ番目までのタスクは強制終了の対象外となり、
前記第１の強制終了タスク用カウンタがＮで、前記第２の強制終了タスク用カウンタがＭとすると（Ｍ≦Ｎ）、前記レディ・キューに登録されている（Ｍ＋１）番目からＮ番目までのタスクが強制終了の対象となり、
前記第１の強制終了タスク用カウンタを用いて、タスク強制終了時の前記レディ・キューの有効範囲を判別し、
前記第２の強制終了タスク用カウンタを用いて、タスク強制終了時の前記レディ・キューの無効範囲を判別し、
前記タスク・カウンタは、前記レディ・キューに登録されているタスクをリアルタイムにカウントするリアルタイムＯＳのメモリ領域を用いたタスク管理方法。
【請求項２】
前記タスク強制終了システムコールの処理を、自タスク終了システムコール中で行い、
１回の前記タスク強制終了システムコールでは１つのタスクを指定し、複数のタスクを強制終了する場合は、前記タスク強制終了システムコールを複数回コールするため、前記強制終了タスク用メモリと、前記第１の強制終了タスク用カウンタと、前記第２の強制終了タスク用カウンタとは、前記タスク強制終了システムコールで指定されるタスクの数だけ用意し、
前記タスク強制終了システムコールでは、指定タスクの前記強制終了タスク用メモリに対応する前記第１の強制終了タスク用カウンタに前記タスク・カウンタをコピーするのみであり、
前記自タスク終了システムコールでは、前記第１の強制終了タスク用カウンタと前記第２の強制終了タスク用カウンタとから前記レディ・キュー先頭のタスクを起動または強制終了し、
タスク強制終了を前記自タスク終了システムコールで行うことにより、前記タスク強制終了システムコールで強制終了するタスクの検索範囲は、前記レディ・キューに登録されている全てのタスクを対象とするのではなく、前記レディ・キューの先頭に登録されているタスクに限定する請求項１に記載のリアルタイムＯＳのメモリ領域を用いたタスク管理方法。
【請求項３】
更に、タスク・アドレス・テーブルを備え、
該タスク・アドレス・テーブルは、タスクを前記レディ・キューまたは前記タイマ・キューに登録するときに、タスクＩＤから呼び出される各タスクの実アドレスのテーブルであり、
更に、タスクを操作するときに前記タスクＩＤから前記タスク・アドレス・テーブルを参照してタスクアドレスを算出する請求項２に記載のリアルタイムＯＳのメモリ領域を用いたタスク管理方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はリアルタイムＯＳのメモリ領域を用いたタスク管理方法に関する。
【０００２】
【従来の技術】
図３３に従来のリアルタイムＯＳのメモリ領域の例を示す。
【０００３】
レディ・キュー００１は１６コ、タイマ・キュー００２は８コとする。
【０００４】
図３３に示すように従来のリアルタイムＯＳは、レディ・キュー００１と、タイマ・キュー００２と、実行中タスク・アドレス００３と、レディ・キュー先頭ポインタ００４と、レディ・キュー空先頭ポインタ００５と、タイマ・キュー先頭ポインタ００６と、タイマ・キュー空先頭ポインタ００７とから構成されている。
【０００５】
このような構成を有する従来のリアルタイムＯＳは次のように動作する。
【０００６】
まず、従来のシステムコールと遅延起動用のタイマ割り込み関数について、概略を図３４〜３９のフローを用いて説明する。
【０００７】
ｓｔａ_ｔｓｋ ： 指定タスクをレディ・キュー００１末尾に登録する（図３４ステップ１）。
【０００８】
ｅｘｔ_ｔｓｋ ： まず、レディ・キュー００１が空かチェックする（図３５ステップ１）。空であれば、タスクが登録されるのを待つ。空でなければレディ・キュー００１先頭に登録されているタスクのスタート・アドレスをスタックに積む（図３５ステップ２）。そしてレディ・キュー先頭ポインタ００４を更新する（図３５ステップ３）。
【０００９】
最後にＲＥＴ命令を実行すると、図３５ステップ２でスタックに積んだアドレスをプログラム・カウンタに書込み、タスクが実行される（図３５ステップ４）。
【００１０】
ｓｔａ_ｔｓｋｐ： 指定タスクをレディ・キュー００１先頭に登録する（図３６ステップ１）。
【００１１】
ｃｈｇ_ｐｒｉ ： 指定タスクがレディ・キュー００１に登録されているか検索する（図３７ステップ１）。登録されていなければ何もしない。登録されていれば、指定タスクをレディ・キュー００１ 先頭に移動する。
【００１２】
ｔｅｒ_ｔｓｋ ： 指定タスクがレディ・キュー００１に登録されているか検索する（図３８ステップ１）登録されていなければ何もしない。登録されていれば、指定タスクをレディ・キュー００１より消去する。
【００１３】
ＭＸ_ＩＮＴ ： まず、タイマ・キュー００２が空かチェックする（図３９ステップ１）。空であれば何もせずに終わる。空でなければタイマ・キュー００２先頭に登録されているタスクの遅延起動時間をデクリメントする（図３９ステップ２）。そして、デクリメントした結果がゼロかチェックする（図３９ステップ３）。ゼロでなければ何もせずに終わる。ゼロであればタイマ・キュー００２先頭に登録されているタスクをレディ・キュー００１先頭に移動する（図３９ステップ４）。そしてレディ・キュー先頭ポインタ００４とタイマ・キュー先頭ポインタ００６を更新する（図３９ステップ５）。そして、新たにタイマ・キュー００２先頭となったタスクの遅延起動時間がゼロかチェックする（図３９ステップ３）。以上の動作を遅延起動時間がゼロでなくなるまで行って、処理を終わる。次に図４０と図４１〜５３を用いて、前記のリアルタイムＯＳのシステムコール発行の一例を示す。
【００１４】
はじめに、イニシャライズする（図４０ステップ０１）。このとき実行中のタスクはｔａｓｋＺである。イニシャライズが終わった時点のメモリ状態は図４１である。
【００１５】
次に、ｔａｓｋＡをレディ・キュー００１末尾に登録する（図４０ステップ０２）。このときのメモリ状態は図４２である。
【００１６】
レディ・キュー００１にタスクが登録されたので、レディ・キュー空先頭ポインタ００５が更新されている。
【００１７】
同様にｔａｓｋＢとｔａｓｋＣをレディ・キュー００１末尾に登録する（図４０ステップ０３〜０４）。このときのメモリ状態は図４３となる。
【００１８】
次にレディ・キュー００１の先頭にｔａｓｋＤを登録する（図４０ステップ５）。このときのメモリ状態は図４４となる。
【００１９】
レディ・キュー００１の先頭に登録されたので、レディ・キュー先頭ポインタ００４が更新されている。
【００２０】
次にレディ・キュー００１末尾にｔａｓｋＤを登録する（図４０ステップ０６）。このときのメモリ状態は図４５となる。
【００２１】
次にタイマ・キュー００２にｔａｓｋＡを遅延起動時間とともに登録する（図４０ステップ０７）。このときのメモリ状態は図４６となる。タイマ・キュー００２にタスクが登録されてので、タイマ・キュー空先頭ポインタ００７が更新されている。
【００２２】
同様にｔａｓｋＢをタイマ・キュー００２に登録する（図４０ステップ０８）。このときのメモリ状態は図４７となる。
【００２３】
ｔａｓｋＢの遅延起動時間は、タイマ・キュー００２先頭の遅延起動時間からの累積となるため、２００となっている。
【００２４】
同様にｔａｓｋＦをタイマ・キュー００２に登録する（図４０ステップ０９）。このときのメモリ状態は図４８となる。
【００２５】
次に、タイマ・キュー００２先頭のタスクをレディ・キュー００１に登録するため時間待ちする（図４０ステップ１０）。
【００２６】
このときのメモリ状態は図４９となり、ｔａｓｋＡがタイマ・キュー００２からレディ・キュー００１に移っている。
【００２７】
同様にｔａｓｋＦをレディ・キュー００１に登録するため時間待ちする（図４０ステップ１１）。このときのメモリ状態が図５０である。
【００２８】
同様にｔａｓｋＢをレディ・キュー００１に登録するためウェイトする（図４０ステップ１２）。このときのメモリ状態が図５１である。
【００２９】
次に、自タスク終了システムコールを発行する（図４０ステップ１３）。このときのメモリ状態は図５２となり、レディ・キュー００１先頭に登録されていたｔａｓｋＢが実行中となる。
【００３０】
次にｔａｓｋＣを消すために、タスク強制終了システムコールを発行する（図４０ステップ１４）。タスク強制終了システムコールでは、レディ・キュー００１に登録されているタスクを順に検索し、ｔａｓｋＣを見つけるとレディ・キュー空先頭の次につながるよう、ポインタのつなぎ変えをする。このときのメモリ状態は図５３となる。
【００３１】
【発明が解決しようとする課題】
しかし、上述の従来技術には次のような問題点があった。
【００３２】
第１の問題点は、タスク強制終了システムコールの処理に時間がかかるということである。
【００３３】
上記の例で図４０ステップ１４のｔａｓｋＣ強制終了システムコールでは図５２のメモリ状態のレディ・キュー００１に登録されている全タスクの検索を行い、強制終了処理としてリングをつなぎかえる処理に時間がかかる（システムコールのフローでは、図３８のステップ２とステップ３にあたる）。
【００３４】
第２の問題点は、処理能力の低いマイクロコンピュータでは、ｔｅｒ_ｔｓｋにより１つのタスクしか強制終了していない場合があった。
【００３５】
その理由は、タスク強制終了システムコールの処理に時間がかかるため、指定タスクを見つけた後、残りのレディ・キュー００１のタスク検索を省いている。
【００３６】
第３の問題点は、タスク強制終了の処理に時間がかかるにもかかわらず、割り込み禁止区間が存在するということである。
【００３７】
その理由は、タスク強制終了時にレディ・キュー００１の先頭ポインタを操作しているため、図３８のステップ３の処理中は割込み禁止区間が存在し、その区間では一切の割り込みを受け付けないためである。
【００３８】
上述の従来技術の問題点に鑑み、本発明の目的は、タスク強制終了処理の負荷を軽減することのできるリアルタイムＯＳのメモリ領域を用いたタスク管理方法を提供することにある。
【００３９】
【課題を解決するための手段】
本発明のリアルタイムＯＳのメモリ領域を用いたタスク管理方法は、
レディ・キューと、タイマ・キューと、実行中タスク・アドレスと、レディ・キュー先頭ポインタと、レディ・キュー空先頭ポインタと、タイマ・キュー先頭ポインタと、タイマ・キュー空先頭ポインタと、強制終了タスク用メモリと、第１の強制終了タスク用カウンタと、第２の強制終了タスク用カウンタと、タスク・カウンタとから構成されるリアルタイムＯＳのメモリ領域を用いたタスク管理方法であって、レディ・キューは、起動タスクのアドレスとその前後のポインタを記憶し、タイマ・キューは、遅延起動タスクのアドレスとその遅延時間を記憶し、実行中タスク・アドレスは、実行中タスクのアドレスを記憶し、レディ・キュー先頭ポインタは、レディ・キューの先頭ポインタを記憶し、レディ・キュー空先頭ポインタは、レディ・キュー空の先頭ポインタを記憶し、タイマ・キュー先頭ポインタは、タイマ・キューの先頭ポインタを記憶し、タイマ・キュー空先頭ポインタは、タイマ・キュー空の先頭ポインタを記憶し、強制終了タスク用メモリは、タスク強制終了システム・コールが指定するタスク・アドレスを記憶し、第１の強制終了タスク用カウンタは強制終了するタスクの有効範囲を示し、第１の強制終了タスク用カウンタがＮとすると、レディ・キューに登録されているＮ番目までのタスクが強制終了の対象となり、第２の強制終了タスク用カウンタは強制終了するタスクの無効範囲を示し、第２の強制終了タスク用カウンタがＭとすると、レディ・キューに登録されているＭ番目までのタスクは強制終了の対象外となり、第１の強制終了タスク用カウンタがＮで、第２の強制終了タスク用カウンタがＭとすると（Ｍ≦Ｎ）、レディ・キューに登録されている（Ｍ＋１）番目からＮ番目までのタスクが強制終了の対象となり、第１の強制終了タスク用カウンタを用いて、タスク強制終了時の前記レディ・キューの有効範囲を判別し、第２の強制終了タスク用カウンタを用いて、タスク強制終了時のレディ・キューの無効範囲を判別し、タスク・カウンタは、レディ・キューに登録されているタスクをリアルタイムにカウントする。
【００４０】
また、本発明のリアルタイムＯＳのメモリ領域は、更に、タスク・アドレス・テーブルを備え、タスク・アドレス・テーブルは、タスクをレディ・キューまたはタイマ・キューに登録するときに、タスクＩＤから呼び出される各タスクの実アドレスのテーブルであってもよい。
【００４１】
また、タスク強制終了システムコールの処理を、自タスク終了システムコール中で行い、１回のタスク強制終了システムコールでは１つのタスクを指定し、複数のタスクを強制終了する場合は、タスク強制終了システムコールを複数回コールするため、強制終了タスク用メモリと、第１の強制終了タスク用カウンタと、第２の強制終了タスク用カウンタとは、タスク強制終了システムコールで指定されるタスクの数だけ用意し、タスク強制終了システムコールでは、指定タスクの強制終了タスク用メモリに対応する第１の強制終了タスク用カウンタにタスク・カウンタをコピーするのみであり、自タスク終了システムコールでは、第１の強制終了タスク用カウンタと第２の強制終了タスク用カウンタとからレディ・キュー先頭のタスクを起動または強制終了し、タスク強制終了を自タスク終了システムコールで行うことにより、タスク強制終了システムコールで強制終了するタスクの検索範囲は、レディ・キューに登録されている全てのタスクを対象とするのではなく、レディ・キューの先頭に登録されているタスクに限定してもよい。
【００４２】
また、更に、タスク・アドレス・テーブルを備え、タスク・アドレス・テーブルは、タスクをレディ・キューまたはタイマ・キューに登録するときに、タスクＩＤから呼び出される各タスクの実アドレスのテーブルであり、更に、タスクを操作するときにタスクＩＤからタスク・アドレス・テーブルを参照してタスクアドレスを算出してもよい。
【００４３】
本発明は、リアルタイムＯＳを使用したシステムにおいてタスク強制終了処理の負荷を軽減することのできる構成を提供するものである。
【００４４】
本発明の自タスク終了システムコールでは、第１の強制終了タスク用カウンタと第２の強制終了タスク用カウンタからレディ・キュー先頭のタスクを起動、もしくは強制終了する。
【００４５】
タスク強制終了を自タスク終了システムコールで行うことにより、レディ・キューに登録されている全てのタスクを対象とするのではなく、レディ・キューの先頭に登録されているタスクに限定することにより、タスク強制終了処理の負荷を軽減する事が出来る。
【００４６】
【発明の実施の形態】
（発明の第１の実施の形態）
本発明は、リアルタイムＯＳを使用したシステムにおいてタスク強制終了処理の負荷を軽減することのできる構成を提供するものである。
【００４７】
本発明の第１の実施の形態について図面を参照して詳細に説明する。
【００４８】
図１に示すように本発明のリアルタイムＯＳのメモリ領域の構成要素は、従来の構成要素であるレディ・キュー００１と、タイマ・キュー００２と、実行中タスク・アドレス００３と、レディ・キュー先頭ポインタ００４と、レディ・キュー空先頭ポインタ００５と、タイマ・キュー先頭ポインタ００６と、タイマ・キュー空先頭ポインタ００７と、本発明のために新規に追加する強制終了タスク用メモリ１０１と、強制終了タスク用カウンタ１０２と、強制終了タスク用カウンタ１０３と、タスク・カウンタ１０４である。
【００４９】
強制終了タスク用メモリ１０１は、タスク強制終了システムコールで指定するタスク・アドレスを記憶する。
【００５０】
強制終了タスク用カウンタ１０２は、タスク強制終了時のレディ・キュー００１の有効範囲を判別するために用いるカウンタである。
【００５１】
強制終了タスク用カウンタ１０３は、タスク強制終了時のレディ・キュー００１の無効範囲を判別するために用いるカウンタである。
【００５２】
タスク・カウンタ１０４は、レディ・キュー００１に登録されているタスクをリアルタイムにカウントするカウンタである。
【００５３】
上記４通りのメモリ領域を用いて、従来のタスク強制終了システムコール（以降ｔｅｒ_ｔｓｋと記す）の処理を、従来の自タスク終了システムコール（以降ｅｘｔ_ｔｓｋと記す）中で行うことを特徴とする。
【００５４】
強制終了タスク用メモリ１０１、強制終了タスク用カウンタ１０２、強制終了タスク用カウンタ１０３は、ｔｅｒ_ｔｓｋで指定されるタスクの数だけ用意する。１回のｔｅｒ_ｔｓｋでは１つのタスクを指定し、複数のタスクを強制終了する場合は、ｔｅｒ_ｔｓｋを複数回コールする。
【００５５】
本発明のｔｅｒ_ｔｓｋでは、指定タスクの強制終了タスク用メモリ１０１に対応する強制終了タスク用カウンタ１０２にタスク・カウンタ１０４をコピーするのみである。
【００５６】
本発明のｅｘｔ_ｔｓｋでは、強制終了タスク用カウンタ１０２と強制終了タスク用カウンタ１０３からレディ・キュー００１先頭のタスクを起動、もしくは強制終了する。
【００５７】
このようにしてタスク強制終了をｅｘｔ_ｔｓｋで行うことにより、レディ・キュー００１に登録されている全てのタスクを対象とするのではなく、レディ・キュー００１の先頭に登録されているタスクに限定することにより、タスク強制終了処理の負荷を軽減する事が出来る。
【００５８】
図２に本発明のリアルタイムＯＳのメモリ領域の例を示す。
【００５９】
レディ・キュー００１は１６コ、タイマ・キュー００２は８コ、ｔｅｒ_ｔｓｋで指定されるタスクはｔａｓｋＢ、ｔａｓｋＣ、ｔａｓｋＥの３コとする。
【００６０】
図２を参照すると、本発明のリアルタイムＯＳによるタスク管理方法の実施例１は、レディ・キュー００１と、タイマ・キュー００２と、実行中タスク・アドレス００３と、レディ・キュー先頭ポインタ００４と、レディ・キュー空先頭ポインタ００５と、タイマ・キュー先頭ポインタ００６と、タイマ・キュー空先頭ポインタ００７と、強制終了タスク用メモリ１０１と、強制終了タスク用カウンタ１０２と、強制終了タスク用カウンタ１０３と、タスク・カウンタ１０４とから構成されている。
【００６１】
レディ・キュー００１は、起動タスクのアドレスとその前後のポインタを記憶する。
【００６２】
タイマ・キュー００２は、遅延起動タスクのアドレスとその遅延時間を記憶する。
【００６３】
実行中タスク・アドレス００３は、実行中タスクのアドレスを記憶する。
【００６４】
レディ・キュー先頭ポインタ００４は、レディー・キューの先頭ポインタを記憶する。
【００６５】
レディ・キュー空先頭ポインタ００５は、レディー・キュー空の先頭ポインタを記憶する。
【００６６】
タイマ・キュー先頭ポインタ００６は、タイマ・キューの先頭ポインタを記憶する。
【００６７】
タイマ・キュー空先頭ポインタ００７は、タイマ・キュー空の先頭ポインタを記憶する。
【００６８】
まず、本発明で使用するシステムコールと遅延起動用のタイマ割り込み関数について、図３〜８のフローを用いて概略を説明する。
【００６９】
ｓｔａ_ｔｓｋ： 指定タスクをレディ・キュー００１末尾に登録する（図３ステップ１）。レディ・キュー００１に登録されているタスクが１コ増えたので、タスク・カウンタ１０４をインクリメントする（図３ステップ２）。
【００７０】
ｅｘｔ_ｔｓｋ ： まず、レディ・キュー００１が空かチェックする（図４ステップ１）。空であれば、タスクが登録されるのを待つ。空でなければ強制終了タスク用カウンタ１０３がゼロかチェックする（図４ステップ２）。ゼロであれば、次タスクがｔｅｒ_ｔｓｋの対象かチェックする（図４ステップ３）。対象でなければ、強制終了タスク用カウンタ１０２のうちゼロでないもののみデクリメントし（図４ステップ４）、タスク・カウンタ１０４をデクリメントする（図４ステップ９）。
【００７１】
そして、次タスクのスタート・アドレスをスタックに積んで（図４ステップ１０）、レディ・キュー先頭ポインタ００４を更新する。最後にＲＥＴ命令を実行すると、図４ステップ１０でスタックに積んだアドレスをプログラム・カウンタに書込み、タスクが実行される（図４ステップ１２）。
【００７２】
図４ステップ３においてｔｅｒ_ｔｓｋの対象であれば、強制終了タスク用カウンタ１０２のうちゼロでないもののみデクリメントし（図４ステップ５）、タスク・カウンタ１０４をデクリメントし（図４ステップ６）、レディ・キュー先頭ポインタ００４を更新する（図４ステップ７）。そして丸付き数字１へ分岐し、再度レディ・キュー００１が空かチェックする。
【００７３】
図４ステップ２において強制終了タスク用カウンタ１０３がゼロでなければ、強制終了タスク用カウンタ１０３とタスク・カウンタ１０４をデクリメントする（図４ステップ８、９）。
【００７４】
そして、次タスクのスタート・アドレスをスタックに積んで（図４ステップ１０）、レディ・キュー先頭ポインタ００４を更新する。最後にＲＥＴ命令を実行すると、図４ステップ１０でスタックに積んだアドレスをプログラム・カウンタに書込み、タスクが実行される（図４ステップ１２）。
【００７５】
ｓｔａ_ｔｓｋｐ： 指定タスクをレディ・キュー００１先頭に登録する（図５ステップ１）。レディ・キュー００１に登録されているタスクが１コ増えたので、タスク・カウンタ１０４をインクリメントする（図５ステップ２）。ｔｅｒ_ｔｓｋの対象となっているタスクに対応する強制終了タスク用カウンタ１０３をインクリメントする（図５ステップ３）。
【００７６】
ｃｈｇ_ｐｒｉ ： まず、レディ・キュー００１に指定タスクがあるか検索する（図６ステップ１）。なければ、レディ・キュー００１に登録されている全タスクを検索したかチェックする（図６ステップ４）。全タスク終了していれば処理を終わる。全タスク終了していなければ図６ステップ１に戻る。検索の結果指定タスクがレディ・キュー００１にあれば、指定タスクがｔｅｒ_ｔｓｋの対象かチェックする（図６ステップ２）。指定タスクがｔｅｒ_ｔｓｋの対象でなければ、指定タスクをレディ・キュー００１先頭に移動し（図６ステップ６）、強制終了タスク用カウンタ１０３をインクリメントする（図６ステップ７）。指定タスクがｔｅｒ_ｔｓｋの対象であれば、さらに指定タスクがｔｅｒ_ｔｓｋに該当するかチェックする（図６ステップ３）。該当すれば、全タスク終了したかチェックする（図６ステップ３）。指定タスクがｔｅｒ_ｔｓｋに該当していなければ、強制終了タスク用カウンタ１０２をデクリメントして（図６ステップ５）指定タスクをレディ・キュー００１先頭に移動し、強制終了タスク用カウンタ１０３をインクリメントする（図６ステップ７）。以上の処理をレディ・キュー００１に登録されている全タスクに対して行う。
【００７７】
ｔｅｒ_ｔｓｋ ： 指定タスクに対応する強制終了タスク用カウンタ１０２にタスク・カウンタ１０４をセットする（図７ステップ１）。
【００７８】
ＭＸ_ＩＮＴ ： まず、タイマ・キュー００２が空かチェックする（図８ステップ１）。空であれば何もせずに終わる。空でなければタイマ・キュー００２先頭に登録されているタスクの遅延起動時間をデクリメントする（図８ステップ２）。そして、デクリメントした結果がゼロかチェックする（図８ステップ３）。ゼロでなければ何もせずに終わる。ゼロであればタイマ・キュー００２先頭に登録されているタスクをレディ・キュー００１先頭に移動する（図８ステップ４）。そしてレディ・キュー先頭ポインタ００４とタイマ・キュー先頭ポインタ００６を更新する（図８ステップ５）。レディ・キュー００１に登録されているタスクが１コ増えたので、タスク・カウンタ１０４をインクリメントし、本割り込みでレディ・キュー００１に登録されたタスクは本割り込み以前に発行されたｔｅｒ_ｔｓｋとは無関係なので、強制終了タスク用カウンタ１０３をインクリメントする（図８ステップ６）。そして、新たにタイマ・キュー００２先頭となったタスクの遅延起動時間がゼロかチェックする（図８ステップ３）。以上の動作を遅延起動時間がゼロでなくなるまで行って、処理を終わる。
【００７９】
続いて、図９及び図１０〜３１を参照して本実施の形態の全体の動作について詳細に説明する。
【００８０】
はじめに、イニシャライズする（図９ステップＡ０１）。このとき実行中のタスクはｔａｓｋＺである。イニシャライズが終わった時点のメモリ状態は図１０である。
【００８１】
次に、ｔａｓｋＡをレディ・キュー００１末尾に登録する（図９ステップＡ０２）。このときのメモリ状態は図１１である。
【００８２】
ｔａｓｋＡがレディ・キュー００１末尾に登録され、レディ・キュー空先頭ポインタ００５が更新される。同様にタスクを４コ、レディ・キュー００１末尾に登録する（図９ステップＡ０３〜０６）。このときのメモリ状態は図１２である。
【００８３】
レディ・キュー００１には５コのタスクが登録されているので、タスク・カウンタは５となる。次にｔａｓｋＥを強制終了するシステムコールを発行する（図９ステップＡ０７）。このときのメモリ状態は図１３である。タスク・カウンタ１０４の値がｔａｓｋＥの強制終了タスク用カウンタ１０２に書込まれている。
【００８４】
次にタスクを２コ、レディ・キュー００１末尾に登録する（図９ステップＡ０８〜０９）。このときのメモリ状態は図１４である。
【００８５】
レディ・キュー００１に登録されているタスクが２コ増えたので、タスク・カウンタ１０４の値は７となり、レディ・キュー空先頭ポインタ００５が更新されている。ここで再度、ｔａｓｋＥを強制終了するシステムコールを発行する（図９ステップＡ１０）。
【００８６】
このときのメモリ状態は図１５である。ｔａｓｋＥの強制終了タスク用カウンタが５から７に更新されている。次にｔａｓｋＢをレディ・キュー００１先頭に登録する（図９ステップＡ１１）。このときのメモリ状態は図１６である。レディ・キュー００１先頭にタスクが登録されたため、強制終了タスク用カウンタ１０２がゼロでないｔａｓｋＥの強制終了タスク用カウンタ１０３をインクリメントする。次にタスクを２コ、レディ・キュー００１末尾に登録する（図９ステップＡ１２、１３）。このときのメモリ状態は図１７である。次にｔａｓｋＥの優先順位を上げるシステムコールを発行する（図９ステップＡ１４）。このときのメモリ状態は図１８である。図１８よりレディ・キュー００１にはｔａｓｋＥが２コ登録されているが、４番目に登録されているｔａｓｋＥはｔｅｒ_ｔｓｋで削除されるタスクであるので、何もしない。８番目に登録されているｔａｓｋＥはｔｅｒ_ｔｓｋの対象ではないのでレディ・キュー００１先頭に移動し、強制終了タスク用カウンタ１０２がゼロでないｔａｓｋＥの強制終了タスク用メモリ１０３のみインクリメントする。
【００８７】
次にタイマ・キュー００２にタスクを登録する。まず、ｔａｓｋＡを時間１００でタイマ・キュー００２に登録する（図９ステップＡ１５）。このときのメモリ状態は図１９である。タイマ・キュー００２にタスクが登録され、タイマ・キュー空先頭ポインタ００７が更新されている。次にｔａｓｋＢを強制終了するシステムコールを発行する（図９ステップＡ１６）。このときのメモリ状態は図２０である。ｔａｓｋＢに対応する強制終了タスク用カウンタ１０２にタスクカウンタ１０４の値が書込まれ、タイマ・キュー００２に登録されているｔａｓｋＡの時間が３０経過し、７０となる。
【００８８】
次にｔａｓｋＦの優先順位を上げるシステムコールを発行する（図９ステップＡ１７）。このときのメモリ状態は図２１である。ｔａｓｋＦはｔａｓｋＢの強制終了タスク用カウンタ１０２の対象であるが、該当タスクでないため、ｔａｓｋＢに対応する強制終了タスク用カウンタ１０２をデクリメントし、強制終了タスク用カウンタ１０３をインクリメントする。また、ｔａｓｋＦはｔａｓｋＥの強制終了タスク用カウンタ１０２の対象ではないため、同様に強制終了タスク用カウンタ１０２をデクリメントし、強制終了タスク用カウンタ１０３をインクリメントする。タイマ・キュー００２に登録されているｔａｓｋＡの時間はさらに経過し、３０となっている。
【００８９】
ここで、ＭＸ用タイマ割り込みが発生し（図９ステップＡ１８）、タイマ・キュー００２に登録されているｔａｓｋＡの時間がゼロとなる。そして、タイマ・キュー００２に登録されているｔａｓｋＡがレディ・キュー００１先頭に移動される。
【００９０】
あらたに、レディ・キュー００１先頭にタスクが登録されたので、ｔａｓｋＢとｔａｓｋＥに対応する強制終了タスク用カウンタ１０３がインクリメントされる。このときのメモリ状態は図２２である。
【００９１】
次にｔａｓｋＣを消去するシステムコールを発行する（図９ステップＡ１９）。このときのメモリ状態は図２３である。
【００９２】
ｔａｓｋＣに対応する強制終了タスク用カウンタ１０２にタスク・カウンタ１０４の値が書込まれている。
【００９３】
次にｔａｓｋＦをレディ・キュー００１末尾に登録する（図９ステップＡ２０）。このときのメモリ状態は図２４である。
【００９４】
ここから自タスク終了システムコールを発行し、順次メモリ状態を見ていく。
まず、自タスク終了システムコールを発行する（図９ステップＢ０１）。レディ・キュー００１先頭にはｔａｓｋＡが登録されており、ｔａｓｋＡはｔｅｒ_ｔｓｋで指定されないのでそのまま起動する。そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。このときのメモリ状態は図２５である。
【００９５】
次に、自タスク終了システムコールを発行する（図９ステップＢ０２）。レディ・キュー００１先頭にはｔａｓｋＦが登録されており、ｔａｓｋＦはｔｅｒ_ｔｓｋで指定されないのでそのまま起動する。そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。このときのメモリ状態は図２６である。
【００９６】
次に、自タスク終了システムコールを発行する（図９ステップＢ０３）。レディ・キュー００１先頭にはｔａｓｋＥが登録されており、ｔａｓｋＥはｔｅｒ_ｔｓｋで指定されているがｔａｓｋＥに対応する強制終了タスク用カウンタ１０３がゼロでないため、そのまま起動する。そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。このときのメモリ状態は図２７である。
【００９７】
次に、自タスク終了システムコールを発行する（図９ステップＢ０４）。レディ・キュー００１先頭にはｔａｓｋＢが登録されており、ｔａｓｋＢはｔｅｒ_ｔｓｋで指定されていてかつｔａｓｋＢに対応する強制終了タスク用カウンタ１０３がゼロで強制終了タスク用カウンタ１０２がゼロでないためｔａｓｋＢは起動しない。そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。あらたにレディ・キュー００１先頭にはｔａｓｋＡが登録されており、ｔａｓｋＡはｔｅｒ_ｔｓｋで指定されないのでそのまま起動する。そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。このときのメモリ状態は図２８である。
【００９８】
次に、自タスク終了システムコールを発行する（図９ステップＢ０５）。レディ・キュー００１先頭にはｔａｓｋＢが登録されており、ｔａｓｋＢはｔｅｒ_ｔｓｋで指定されていてかつｔａｓｋＢに対応する強制終了タスク用カウンタ１０３がゼロで強制終了タスク用カウンタ１０２がゼロでないためｔａｓｋＢは起動しない。そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。あらたにレディ・キュー００１先頭にはｔａｓｋＣが登録されているが同様に起動しない。
【００９９】
あらたにレディ・キュー００１先頭にはｔａｓｋＤが登録されており、ｔａｓｋＤはｔｅｒ_ｔｓｋで指定されないのでそのまま起動する。
【０１００】
そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。このときのメモリ状態は図２９である。
【０１０１】
次に、自タスク終了システムコールを発行する（図９ステップＢ０６）。レディ・キュー００１先頭にはｔａｓｋＥが登録されており、ｔａｓｋＥはｔｅｒ_ｔｓｋで指定されていてかつｔａｓｋＥに対応する強制終了タスク用カウンタ１０３がゼロで強制終了タスク用カウンタ１０２がゼロでないためｔａｓｋＥは起動しない。そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。あらたにレディ・キュー００１先頭にはｔａｓｋＡが登録されているおり、ｔａｓｋＡはｔｅｒ_ｔｓｋで指定されないのでそのまま起動する。そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。このときのメモリ状態は図３０である。
【０１０２】
次に、自タスク終了システムコールを発行する（図９ステップＢ０７）。レディ・キュー００１先頭にはｔａｓｋＤが登録されており、ｔａｓｋＤはｔｅｒ_ｔｓｋで指定されないのでそのまま起動する。そして、レディ・キュー先頭ポインタ００４を更新し、強制終了タスク用カウンタ１０３もしくは強制終了タスク用カウンタ１０２をデクリメントする。このときのメモリ状態は図３１である。
【０１０３】
以上のように、自タスク終了システムコールで強制終了タスク用カウンタ１０２および強制終了タスク用カウンタ１０３の値で、そのタスクを起動するか起動しないかのチェックを行う。
【０１０４】
（発明の第２の実施の形態）
本発明の第２の実施の形態について図面を参照して詳細に説明する。
【０１０５】
従来のリアルタイムＯＳでは、キューに格納するタスク・アドレス情報を削減するため、タスク・アドレス・テーブルを別に設け、キューにはタスクＩＤだけを格納する場合がある。このようなリアルタイムＯＳに本発明を応用する例を本発明の第２の実施の形態として説明する。
【０１０６】
本発明の第２の実施の形態の構成は、図１で示す構成要素に新たにタスク・アドレス・テーブル１０５を追加する。
【０１０７】
タスク・アドレス・テーブル１０５は、タスクをレディ・キュー００１またはタイマ・キュー００２に登録するときに、タスクＩＤから呼び出される各タスクの実アドレスのテーブルである。
【０１０８】
本発明の第２の実施の形態の動作が、本発明の第１の実施の形態と異なるところは、タスクを操作するときにタスクＩＤからタスクアドレスを算出するところである。
【０１０９】
図３２にタスクＩＤから実行状態に移るまでの変換過程を示す。
【０１１０】
【発明の効果】
以上説明したように、本発明には以下の効果がある。
【０１１１】
第１の効果は、タスク検索および強制終了処理がなくなることにある。
【０１１２】
その理由は、タスク強制終了を自タスク終了システムコール発行時に行うためである。
【０１１３】
第２の効果は、ＯＳ中の割込み禁止時間が短くなることにある。
【０１１４】
その理由は、タスク検索および強制終了処理がなくなるためである。
【０１１５】
第３の効果は、タスク強制終了システムコールで指定タスクを複数個強制終了できることにある。
【０１１６】
その理由は、指定タスクの強制終了を自タスク終了システムコール発行時に行うため、従来のタスク強制終了処理より大幅に処理時間が短縮できるためである。
【０１１７】
本発明の第２の実施の形態の効果は、更に、リアルタイムＯＳが使用するＲＡＭを削減できる効果がある。
【０１１８】
その理由は、レディ・キュー００１とタイマ・キュー００２のタスクアドレス、それにタスク強制終了システムコールで指定するタスクアドレスをＩＤ化することにより、それぞれ半分以下のＲＡＭ容量で本発明を実現できるからである。
【図面の簡単な説明】
【図１】本発明のリアルタイムＯＳのメモリ領域の構成を示す図である。
【図２】本発明のリアルタイムＯＳのメモリ領域の例を示す図である。
【図３】本発明で使用するシステムコールについて、フローを用いて概略を説明する図である。
【図４】本発明で使用するシステムコールについて、フローを用いて概略を説明する図である。
【図５】本発明で使用するシステムコールについて、フローを用いて概略を説明する図である。
【図６】本発明で使用するシステムコールについて、フローを用いて概略を説明する図である。
【図７】本発明で使用するシステムコールについて、フローを用いて概略を説明する図である。
【図８】本発明で使用する遅延起動用のタイマ割り込み関数について、フローを用いて概略を説明する図である。
【図９】本実施の形態の全体の動作について詳細に説明する図である。
【図１０】本実施の形態のメモリ状態を示す図である。
【図１１】本実施の形態のメモリ状態を示す図である。
【図１２】本実施の形態のメモリ状態を示す図である。
【図１３】本実施の形態のメモリ状態を示す図である。
【図１４】本実施の形態のメモリ状態を示す図である。
【図１５】本実施の形態のメモリ状態を示す図である。
【図１６】本実施の形態のメモリ状態を示す図である。
【図１７】本実施の形態のメモリ状態を示す図である。
【図１８】本実施の形態のメモリ状態を示す図である。
【図１９】本実施の形態のメモリ状態を示す図である。
【図２０】本実施の形態のメモリ状態を示す図である。
【図２１】本実施の形態のメモリ状態を示す図である。
【図２２】本実施の形態のメモリ状態を示す図である。
【図２３】本実施の形態のメモリ状態を示す図である。
【図２４】本実施の形態のメモリ状態を示す図である。
【図２５】本実施の形態のメモリ状態を示す図である。
【図２６】本実施の形態のメモリ状態を示す図である。
【図２７】本実施の形態のメモリ状態を示す図である。
【図２８】本実施の形態のメモリ状態を示す図である。
【図２９】本実施の形態のメモリ状態を示す図である。
【図３０】本実施の形態のメモリ状態を示す図である。
【図３１】本実施の形態のメモリ状態を示す図である。
【図３２】本発明の第２の実施の形態のタスクＩＤから実行状態に移るまでの変換過程を示す図である。
【図３３】従来のリアルタイムＯＳのメモリ領域の例を示す図である。
【図３４】従来のシステムコールについて、フローを用いて概略を説明する図である。
【図３５】従来のシステムコールについて、フローを用いて概略を説明する図である。
【図３６】従来のシステムコールについて、フローを用いて概略を説明する図である。
【図３７】従来のシステムコールについて、フローを用いて概略を説明する図である。
【図３８】従来のシステムコールについて、フローを用いて概略を説明する図である。
【図３９】従来の遅延起動用のタイマ割り込み関数について、フローを用いて概略を説明する図である。
【図４０】従来の全体の動作について詳細に説明する図である。
【図４１】従来のメモリ状態を示す図である。
【図４２】従来のメモリ状態を示す図である。
【図４３】従来のメモリ状態を示す図である。
【図４４】従来のメモリ状態を示す図である。
【図４５】従来のメモリ状態を示す図である。
【図４６】従来のメモリ状態を示す図である。
【図４７】従来のメモリ状態を示す図である。
【図４８】従来のメモリ状態を示す図である。
【図４９】従来のメモリ状態を示す図である。
【図５０】従来のメモリ状態を示す図である。
【図５１】従来のメモリ状態を示す図である。
【図５２】従来のメモリ状態を示す図である。
【図５３】従来のメモリ状態を示す図である。
【符号の説明】
００１    レディ・キュー
００２    タイマ・キュー００２
００３    実行中タスク・アドレス
００４    レディ・キュー先頭ポインタ
００５    レディ・キュー空先頭ポインタ
００６    タイマ・キュー先頭ポインタ
００７    タイマ・キュー空先頭ポインタ
１０１    強制終了タスク用メモリ
１０２、１０３    強制終了タスク用カウンタ
１０４    タスク・カウンタ
１０５    タスク・アドレス・テーブル
【図１】
0003717722.tif 000002
【図２】
0003717722.tif 000003
【図３】
0003717722.tif 000004
【図４】
0003717722.tif 000005
【図５】
0003717722.tif 000006
【図６】
0003717722.tif 000007
【図７】
0003717722.tif 000008
【図８】
0003717722.tif 000009
【図９】
0003717722.tif 000010
【図１０】
0003717722.tif 000011
【図１１】
0003717722.tif 000012
【図１２】
0003717722.tif 000013
【図１３】
0003717722.tif 000014
【図１４】
0003717722.tif 000015
【図１５】
0003717722.tif 000016
【図１６】
0003717722.tif 000017
【図１７】
0003717722.tif 000018
【図１８】
0003717722.tif 000019
【図１９】
0003717722.tif 000020
【図２０】
0003717722.tif 000021
【図２１】
0003717722.tif 000022
【図２２】
0003717722.tif 000023
【図２３】
0003717722.tif 000024
【図２４】
0003717722.tif 000025
【図２５】
0003717722.tif 000026
【図２６】
0003717722.tif 000027
【図２７】
0003717722.tif 000028
【図２８】
0003717722.tif 000029
【図２９】
0003717722.tif 000030
【図３０】
0003717722.tif 000031
【図３１】
0003717722.tif 000032
【図３２】
0003717722.tif 000033
【図３３】
0003717722.tif 000034
【図３４】
0003717722.tif 000035
【図３５】
0003717722.tif 000036
【図３６】
0003717722.tif 000037
【図３７】
0003717722.tif 000038
【図３８】
0003717722.tif 000039
【図３９】
0003717722.tif 000040
【図４０】
0003717722.tif 000041
【図４１】
0003717722.tif 000042
【図４２】
0003717722.tif 000043
【図４３】
0003717722.tif 000044
【図４４】
0003717722.tif 000045
【図４５】
0003717722.tif 000046
【図４６】
0003717722.tif 000047
【図４７】
0003717722.tif 000048
【図４８】
0003717722.tif 000049
【図４９】
0003717722.tif 000050
【図５０】
0003717722.tif 000051
【図５１】
0003717722.tif 000052
【図５２】
0003717722.tif 000053
【図５３】
0003717722.tif 000054