(57)【要約】【課題】  タスク構成が大きく変わらない限りタスク数が増加してもスタックの総容量を増加する必要がないと共に、高いスタック利用効率が得られるスタック管理方法を提供する。【解決手段】  中断中の全タスクが共用可能なタスクスタックを設け、そのタスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにする。あるタスクの実行を中断するために前記共有スタック内のデータを前記タスクスタックに退避する際には、前記共有スタック内のデータ量に応じて未使用の前記ブロックに記憶させ、当該ブロックの識別データと当該タスク用の識別データを記憶する。前記ブロック識別データと前記タスク識別データを用いて前記データを前記共有スタックに復帰する。【選択図】    図１
2005071141.tif 000002
【特許請求の範囲】
【請求項１】
実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、
前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにし、
前記データが記憶されていない未使用の前記ブロックを未使用ブロック管理領域で管理し、
あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを使用ブロック管理領域で管理し、
一つの前記ブロックとそれに続く一つの前記ブロックとの関連を次ブロック管理領域で管理し、
あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰することを特徴とするスタック管理方法。
【請求項２】
複数の前記ブロックに一連のブロック番号を付し、前記未使用ブロック管理領域によって未使用の前記ブロックの前記ブロック番号を管理する請求項１に記載のスタック管理方法。
【請求項３】
複数の前記ブロックに一連のブロック番号を付し、前記使用ブロック管理領域によって、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する請求項１に記載のスタック管理方法。
【請求項４】
複数の前記ブロックに一連のブロック番号を付し、前記次ブロック管理領域によって一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する請求項１に記載のスタック管理方法。
【請求項５】
前記共有スタックに記憶されている前記データの量を、前記共有スタックのスタックポインタによって認識する請求項１〜４のいずれか１項に記載のスタック管理方法。
【請求項６】
前記共有スタックの記憶領域を所定の記憶容量を持つ複数の記憶部に分けると共に、各記憶部にチェックデータ格納部を設け、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納する請求項１〜４のいずれか１項に記載のスタック管理方法。
【請求項７】
実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして機能する、中断中の全タスクが共用可能なタスクスタックであって、その記憶領域は所定のブロック長を持つ複数のブロックから構成されていて前記データを前記ブロックに分けて記憶するようになっているものと、
前記データが記憶されていない未使用の前記ブロックを管理する未使用ブロック管理領域と、
あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを管理する使用ブロック管理領域と、
一つの前記ブロックとそれに続く一つの前記ブロックとの関連を管理する次ブロック管理領域とを備え、
あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰することを特徴とするスタック管理装置。
【請求項８】
複数の前記ブロックに一連のブロック番号を付してあり、前記未使用ブロック管理領域によって未使用の前記ブロックの前記ブロック番号を管理する請求項７に記載のスタック管理装置。
【請求項９】
複数の前記ブロックに一連のブロック番号を付してあり、前記使用ブロック管理領域によって、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する請求項７に記載のスタック管理装置。
【請求項１０】
複数の前記ブロックに一連のブロック番号を付してあり、前記次ブロック管理領域によって一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する請求項７に記載のスタック管理装置。
【請求項１１】
前記共有スタックに記憶されている前記データの量を、前記共有スタックのスタックポインタによって認識する請求項７〜１０のいずれか１項に記載のスタック管理装置。
【請求項１２】
前記共有スタックの記憶領域を所定の記憶容量を持つ複数の記憶部に分けると共に、各記憶部にチェックデータ格納部を設け、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納する請求項７〜１０のいずれか１項に記載のスタック管理装置。
【請求項１３】
実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、
前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにし、
前記データが記憶されていない未使用の前記ブロックを未使用ブロック管理領域で管理し、
あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを使用ブロック管理領域で管理し、
一つの前記ブロックとそれに続く一つの前記ブロックとの関連を次ブロック管理領域で管理し、
あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰する
というステップをコンピュータに実行させることを特徴とするスタック管理プログラム。
【請求項１４】
複数の前記ブロックに一連のブロック番号を付し、前記未使用ブロック管理領域によって未使用の前記ブロックの前記ブロック番号を管理する請求項１３に記載のスタック管理プログラム。
【請求項１５】
複数の前記ブロックに一連のブロック番号を付し、前記使用ブロック管理領域によって、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する請求項１３に記載のスタック管理プログラム。
【請求項１６】
複数の前記ブロックに一連のブロック番号を付し、前記次ブロック管理領域によって一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する請求項１３に記載のスタック管理プログラム。
【請求項１７】
前記共有スタックに記憶されている前記データの量を、前記共有スタックのスタックポインタによって認識する請求項１３〜１６のいずれか１項に記載のスタック管理プログラム。
【請求項１８】
前記共有スタックの記憶領域を所定の記憶容量を持つ複数の記憶部に分けると共に、各記憶部にチェックデータ格納部を設け、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納する請求項１３〜１６のいずれか１項に記載のスタック管理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オペレーティングシステム（以下、ＯＳという）で使用されるスタックの管理技術に関し、さらに言えば、マルチタスク制御のＯＳの一つであるリアルタイム・オペレーティングシステム（以下、ＲＴＯＳという）で使用されるスタックを管理する方法及びその装置、並びにそのためのプログラムに関する。ここで、「スタック」とは、割り込み信号等を受けて実行中のタスクを中断して他のタスクを実行する際に、中断したタスクの再開に必要なデータ（待避データ）を一時的に保持するために使用されるデータ記憶領域をいう。
【背景技術】
【０００２】
近年、ソフトウェアはますます高機能化・大規模化しており、それに伴ってＲＴＯＳで実行されるタスクの数も飛躍的に増加している。従来のスタック管理方法・装置では、タスク数の増加がそのままＲＴＯＳで使用されるスタック容量の増加を招いており、種々の問題を生じている。
【０００３】
従来のこの種のスタック管理装置の一例を図１２に示す。この例は、特開２００１−４３０９３号公報に開示されているものである。図１２より明らかなように、この従来のスタック管理装置は、ＲＴＯＳ５００による制御の下で、共有スタック１００とＲＴＯＳスタック２００とコンテキストデータ３００を使用する。
【０００４】
説明を簡単にするため、ここでは、ｄｅｌａｙ命令とｗａｉｔ命令を含むタスク１、ｗａｉｔ命令のみを含むタスク２、ｄｅｌａｙ命令とｗａｉｔ命令を含むタスク３を、図示しないＣＰＵ（Central Processing Unit、中央処理装置）で実行する場合について説明する。
【０００５】
共有スタック１００は、ＣＰＵで実行中のタスクや割り込み処理が使用するスタック（データ記憶領域）であり、必要に応じてタスク１〜タスク３で共用される。共有スタック１００は従来より公知のものである。
【０００６】
ＲＴＯＳスタック２００は、あるタスクの実行が一時的に中断された場合に、そのタスクの実行を後に再開できるようにするために、共有スタック１００中の必要データを一時的に退避しておくためのスタックである。
【０００７】
図１２の例では、ｄｅｌａｙ命令（あるタスクの実行を一時中断させ、次の命令を受け取るとそのタスクの実行を再開させる命令）と、ｗａｉｔ命令（予め定義された「待ち条件」を満足するとそのタスクの実行開始を待機させ、予め定義された「待ち解除条件」を満足するとそのタスクを先頭から実行させる命令）が記述されているタスク１と３については、ＲＴＯＳスタック２００がそれぞれ確保されている。しかし、ｗａｉｔ命令を含むがｄｅｌａｙ命令を含まないタスク２については、ＲＴＯＳスタック２００は確保されていない。
【０００８】
このように、ＲＴＯＳスタック２００は、タスク中に含まれる命令に応じてタスク毎に生成されており、従って各ＲＴＯＳスタック２００は対応するタスクによって専有されている。なお、タスク毎に確保されるＲＴＯＳスタック２００の容量は、当該タスクが使用する可能性のある最大値に設定される。
【０００９】
コンテキストデータ３００は、あるタスクの実行が一時的に中断された場合に、当該タスクが使用している汎用レジスタの内容や当該タスクの再開アドレス等を退避しておくための領域である。コンテキストデータ３００は、全タスクに対してそれぞれ生成されており、従って、ＲＴＯＳスタック２００と同様に、各コンテキストデータ３００は対応するタスクによって専有されている。
【００１０】
図１２に示す従来のスタック管理装置では、例えばタスク１の実行を一時的に中断させる場合、ＲＴＯＳ２００が、共有スタック１００に記憶されているデータをタスク１用のＲＴＯＳスタック２００に退避させると共に、汎用レジスタ等の各レジスタの内容（データ）をタスク１用のコンテキストデータ３００に退避させる。そして、中断中のタスク１の実行を後に再開する際には、タスク１用のＲＴＯＳスタック２００からそこに退避していたデータを読み出して共有スタック１００に復帰させると共に、タスク１用のコンテキストデータ３００からそこに退避していたデータを読み出して各レジスタに復帰させる。その後、タスク１の実行を再開する。
【００１１】
このように制御することにより、例えばタスク１の中断後に共有スタック１００内のデータやレジスタ中のデータが他のタスク（例えばタスク３）用のものに書き換えられても、再開前にＲＴＯＳスタック２００とコンテキストデータ３００に退避されていたデータを呼び出すことができるため、タスク１の実行を再開することが可能となる。
【００１２】
また、特開平７−１７５６７０号公報には、従来のタスク管理装置の例が開示されている。当該公報に開示されたタスク管理装置は、その段落（０００６）に記載されている通り、「ＲＡＭの少ない組み込み型マイコンシステムにおいても、小粒度のタスク制御を行うことが可能なタスク制御装置を提供する」ことを目的とする。そして、その段落（０００７）と（０００８）によれば、このタスク管理装置は、
少なくとも、実行状態、実行可能状態、待機状態の３状態を持ち、並行もしくは並列に動作するタスク群と、
タスクの状態やコンテキスト等のタスク情報を保持するタスク制御テーブル群と、
タスクが使用するスタック群と、
実行可能状態のタスクのタスク制御テーブルが、メッセージ到着順等の順序で繋がれる待ち行列と、
実行状態のタスクが発行するメッセージ送信命令を解釈し、待機状態から実行可能状態にするタスクを決定するメッセージ送信処理手段と、
実行状態のタスクが発行するメッセージ受信命令によって、このタスクのコンテキストをタスク制御テーブルに退避し、このタスクを待機状態とするメッセージ受信処理手段と、
実行状態のタスクが発行する特殊メッセージ受信命令によって、このタスクのタスク制御テーブルとスタックとを開放し、特殊な待機状態である特殊待機状態とし、他の特殊待機状態のタスクと、タスク制御テーブルとスタックを共有させる特殊メッセージ受信処理手段と、
メッセージ送信処理手段が決定した待機状態のタスクが特殊待機状態でない場合に、このタスクのタスク制御テーブルを待ち行列に繋いで実行可能状態とする実行可能遷移手段と、
メッセージ送信処理手段が決定した待機状態のタスクが特殊待機状態である場合に、このタスクのタスク制御テーブルとスタックとを確保し、タスク制御テーブルを待ち行列に繋いで実行可能状態とする特殊実行可能遷移手段と、
タスク制御テーブルをもとにコンテキストを回復し、タスク制御テーブルを待ち行列から外して実行状態とする実行遷移手段と
を備えている。
【００１３】
そして、このような構成を持つことにより、特殊メッセージ受信処理手段は、実行状態のタスクが発行する特殊メッセージ受信命令によって、このタスクの制御テーブルとスタックとを開放し、特殊待機状態として、他の特殊待機状態のタスクと、タスク制御テーブルとスタックとを共有させる。特殊実行可能遷移手段は、待機状態のタスクが特殊待機状態である場合に、このタスクのタスク制御テーブルとスタックとを確保し、タスク制御テーブルを待ち行列に繋いで実行可能状態とする。実行遷移手段は、タスク制御テーブルをもとにコンテキストを回復し、タスク制御テーブルを待ち行列から外して実行状態とする。こうして、各タスクがタスク制御テーブルとスタックを多重に使用することを可能としている。
【特許文献１】特開２００１−４３０９３号公報（図１３）
【特許文献２】特開平７−１７５６７０号公報（図１）
【発明の開示】
【発明が解決しようとする課題】
【００１４】
図１２に示した従来のスタック管理装置（特開２００１−４３０９３号公報参照）では、以下のような問題点がある。
【００１５】
第一の問題点は、ｄｅｌａｙ命令が記述されているタスク毎にＲＴＯＳスタック２００を用意する必要があるため、その種タスクの総数が増加するとスタックの総容量を増加さえる必要があることである。換言すれば、タスク数の増加がある度にスタックの総容量を増加しなければならないことである。
【００１６】
ユーザがプログラムを作成する場合、コンピュータ・システムの主記憶領域を構成するメモリ（ＲＡＭ、Random-Access Memory）の容量が制限されているのが通常であるから、当該ＲＡＭをどの様にして効率的に使用するかを検討する必要がある。この場合、ＲＴＯＳ５００側が多量のＲＡＭを使用すればするほど、それだけユーザの使用できるＲＡＭの量が減少するから、タスク数の増加に応じてスタック総容量の増加が必要な点は、プログラム作成上の大きな障害となる。また、タスクの変更や追加を行う度にユーザ側で使用可能なＲＡＭ容量を検討しなければならないとすると、それだけユーザの負担が増加し、従ってＲＴＯＳ５００を使用するメリットが減少する。よって、タスクの総数が増加してもスタック用記憶領域の必要容量が変わらないことが望ましい。
【００１７】
第二の問題点は、タスク中断時にＲＴＯＳスタック２００内に無駄な領域（確保されたが実際には使用されない領域）が生じることがあり、ＲＴＯＳスタック２００（ＲＡＭ）の使用効率は必ずしも高くないことである。これは、あるタスクのためにＲＴＯＳスタック２００を確保する際には、そのタスクが使用する可能性のある最大容量を確保しなければならないからである。
【００１８】
例えば、タスク１が図１３の左端に示すように記述されている場合、そこにはｄｅｌａｙ命令が二つ含まれているから、それらに対応して（ａ）、（ｂ）の２箇所で実行が中断される可能性がある。この場合、（ｂ）の箇所で当該タスクの実行が中断されることを考慮して、確保するＲＴＯＳスタック２００の容量を図１３の右端に示すように決定しなければならない。このため、（ａ）の箇所で当該タスクの実行が中断される場合は、図１３の中央に示すように、当該ＲＴＯＳスタック２００の一部しか使用しないことになり、その結果、ＲＴＯＳスタック２００の（ｃ）の部分が無駄になるのである。
【００１９】
第三の問題点は、何らかの原因であるＲＴＯＳスタック２００の最大容量が必要量に対して１バイト（byte）でも不足すると、「スタック容量オーバー」を理由とするエラーが発生し、その結果、当該タスクに係るプログラムの実行を停止せざるを得ないことが多いことである。これは、ＲＴＯＳスタック２００の最大容量が必要量に対して１バイトでも不足すれば、当該プログラム全体が暴走する恐れがあるため、これを防止する必要があるからである。
【００２０】
プログラムの暴走を回避するために、ＲＴＯＳスタック２００の最大容量を少し多く設定する（余裕を持たせる）ことは可能である。しかし、このようにしても、ＲＴＯＳスタック２００の必要量を見積もる手段がないため、その最大容量は推測によって多めの値に決定せざるを得ない。その結果、莫大な容量のＲＡＭを無駄にするという事態を招く恐れがある。
【００２１】
他方、特開平７−１７５６７０号公報に開示された従来のタスク管理装置では、各タスク間でタスク制御テーブルとスタックとを多重に使用する（共用する）ことによって、スタックの必要容量を減少させている。しかし、スタックの必要容量は、全タスクの中で最も多量のスタックを使用するものを考慮して決定しなければならない。よって、このタスク管理装置においても、ＲＡＭの使用効率は必ずしも高くない、という問題点がある。これは、図１２に示した従来のスタック管理装置における第二の問題点と同じである。
【００２２】
さらに、特開平７−１７５６７０号公報に開示されたタスク管理装置では、図１２に示した従来のスタック管理装置の第三の問題点、すなわちスタックの最大容量が必要量に対して不足すると、当該タスクに係るプログラムの実行を停止せざるを得ない、という問題点が残存していることも明らかである。
【００２３】
本発明は上述した従来例の問題点を考慮してなされたものであり、その目的とするところは、タスク構成が大きく変わらない限りタスク数が増加してもスタックの総容量を増加する必要がないと共に、高いスタック利用効率が得られるスタック管理方法及び装置並びにスタック管理プログラムを提供することにある。
【００２４】
本発明の他の目的は、必要に応じて最適な容量のスタックを確保できるスタック管理方法及び装置並びにスタック管理プログラムを提供することにある。
【００２５】
本発明のさらに他の目的は、スタック容量が必要量に対して不足した場合にもプログラムの実行を可能とすることができるスタック管理方法及び装置並びにスタック管理プログラムを提供することにある。
【００２６】
ここに明記しない本発明の他の目的は、以下の説明及び添付図面から明らかであろう。
【課題を解決するための手段】
【００２７】
（１）  本発明のスタック管理方法は、
実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、
前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにし、
前記データが記憶されていない未使用の前記ブロックを未使用ブロック管理領域で管理し、
あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを使用ブロック管理領域で管理し、
一つの前記ブロックとそれに続く一つの前記ブロックとの関連を次ブロック管理領域で管理し、
あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰することを特徴とするものである。
【００２８】
（２）  本発明のスタック管理方法では、実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶する。この場合、退避した前記データを共有スタックに正しく復帰するためには、各々の前記ブロックに記憶された前記データ間の関連を保持しておく必要があるが、その機能は次ブロック管理領域が行っている。従って、本発明のスタック管理方法では、タスク構成が大きく変わらない限り、実行可能なタスク数が増加してもスタックの総容量を増加する必要がない。
【００２９】
また、あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させる。このため、必要に応じて最適な容量のスタックを確保できると共に、高いスタック利用効率が得られる。
【００３０】
さらに、前記データを前記タスクスタックに退避する際に、前記共有スタック中に記憶されている前記データの量に応じて未使用の前記ブロックを選択するので、その段階で前記共有スタック中の前記データの量が前記タスクスタックの残存記憶容量を越えているか否かを判定できる。よって、その判定結果によりスタック容量が必要量に対して不足していることが分かった場合には、当該タスクの中断を実施しないように構成する等により、当該タスクに係るプログラムの実行を可能とすることができる。
【００３１】
（３）  本発明のスタック管理方法の好ましい例では、複数の前記ブロックに一連のブロック番号を付し、前記未使用ブロック管理領域によって未使用の前記ブロックの前記ブロック番号を管理する。この例では、未使用の前記ブロックの管理が容易に実現できる、という利点がある。
【００３２】
本発明のスタック管理方法の他の好ましい例では、複数の前記ブロックに一連のブロック番号を付し、前記使用ブロック管理領域によって、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する。この例では、使用中の前記ブロックの管理が容易に実現できる、という利点がある。
【００３３】
本発明のスタック管理方法のさらに他の好ましい例では、複数の前記ブロックに一連のブロック番号を付し、前記次ブロック管理領域によって一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する。この例では、二つの前記ブロック間の関連の管理が容易に実現できる、という利点がある。
【００３４】
本発明のスタック管理方法のさらに他の好ましい例では、前記共有スタックに記憶されている前記データの量を、前記共有スタックのスタックポインタによって認識する。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に、前記共有スタック中に記憶されているデータ量を新しい構成を付加することなく容易に認識できる、という利点がある。
【００３５】
本発明のスタック管理方法のさらに他の好ましい例では、前記共有スタックの記憶領域を所定の記憶容量を持つ複数の記憶部に分けると共に、各記憶部にチェックデータ格納部を設ける。そして、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納する。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に前記記憶部の各々について前記チェックデータの値が変化しているか否かを調べることにより、前記共有スタック中に記憶されているデータ量を認識できる、という利点がある。
【００３６】
（４）  本発明のスタック管理装置は、
実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして機能する、中断中の全タスクが共用可能なタスクスタックであって、その記憶領域は所定のブロック長を持つ複数のブロックから構成されていて前記データを前記ブロックに分けて記憶するようになっているものと、
前記データが記憶されていない未使用の前記ブロックを管理する未使用ブロック管理領域と、
あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを管理する使用ブロック管理領域と、
一つの前記ブロックとそれに続く一つの前記ブロックとの関連を管理する次ブロック管理領域とを備え、
あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰することを特徴とするものである。
【００３７】
（５）  本発明のスタック管理装置では、本発明のスタック管理方法で上述したのと同じ理由により、それと同じ効果が得られることが明らかである。
【００３８】
（６）  本発明のスタック管理装置の好ましい例では、複数の前記ブロックには一連のブロック番号が付してあり、前記未使用ブロック管理領域が未使用の前記ブロックの前記ブロック番号を管理する。この例では、未使用の前記ブロックの管理が容易に実現できる、という利点がある。
【００３９】
本発明のスタック管理装置の他の好ましい例では、複数の前記ブロックに一連のブロック番号が付してあり、前記使用ブロック管理領域が、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する。この例では、使用中の前記ブロックの管理が容易に実現できる、という利点がある。
【００４０】
本発明のスタック管理装置のさらに他の好ましい例では、複数の前記ブロックに一連のブロック番号が付してあり、前記次ブロック管理領域が一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する。この例では、二つの前記ブロック間の関連の管理が容易に実現できる、という利点がある。
【００４１】
本発明のスタック管理装置のさらに他の好ましい例では、前記共有スタックに記憶されている前記データの量が、前記共有スタックのスタックポインタによって認識される。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に、前記共有スタック中に記憶されているデータ量を新しい構成を付加することなく容易に認識できる、という利点がある。
【００４２】
本発明のスタック管理装置のさらに他の好ましい例では、前記共有スタックの記憶領域が所定の記憶容量を持つ複数の記憶部に分けられていると共に、各記憶部にはチェックデータ格納部が設けられている。そして、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納するように構成されている。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に前記記憶部の各々について前記チェックデータの値が変化しているか否かを調べることにより、前記共有スタック中に記憶されているデータ量を認識できる、という利点がある。
【００４３】
（７）  本発明のスタック管理プログラムは、
実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、
前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにし、
前記データが記憶されていない未使用の前記ブロックを未使用ブロック管理領域で管理し、
あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを使用ブロック管理領域で管理し、
一つの前記ブロックとそれに続く一つの前記ブロックとの関連を次ブロック管理領域で管理し、
あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰する
というステップをコンピュータに実行させる
ことを特徴とするものである。
【００４４】
（８）  本発明のスタック管理プログラムでは、本発明のスタック管理方法で上述したのと同じ理由により、それと同じ効果が得られることが明らかである。
【００４５】
（９）  本発明のスタック管理プログラムの好ましい例では、複数の前記ブロックには一連のブロック番号が付してあり、前記未使用ブロック管理領域が未使用の前記ブロックの前記ブロック番号を管理する。この例では、未使用の前記ブロックの管理が容易に実現できる、という利点がある。
【００４６】
本発明のスタック管理プログラムの他の好ましい例では、複数の前記ブロックに一連のブロック番号が付してあり、前記使用ブロック管理領域が、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する。この例では、使用中の前記ブロックの管理が容易に実現できる、という利点がある。
【００４７】
本発明のスタック管理プログラムのさらに他の好ましい例では、複数の前記ブロックに一連のブロック番号が付してあり、前記次ブロック管理領域が一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する。この例では、二つの前記ブロック間の関連の管理が容易に実現できる、という利点がある。
【００４８】
本発明のスタック管理プログラムのさらに他の好ましい例では、前記共有スタックに記憶されている前記データの量が、前記共有スタックのスタックポインタによって認識される。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に、前記共有スタック中に記憶されているデータ量を新しい構成を付加することなく容易に認識できる、という利点がある。
【００４９】
本発明のスタック管理プログラムのさらに他の好ましい例では、前記共有スタックの記憶領域が所定の記憶容量を持つ複数の記憶部に分けられると共に、各記憶部にはチェックデータ格納部が設けられる。そして、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納するように構成される。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に前記記憶部の各々について前記チェックデータの値が変化しているか否かを調べることにより、前記共有スタック中に記憶されているデータ量を認識できる、という利点がある。
【発明の効果】
【００５０】
本発明のスタック管理方法および装置並びにスタック管理プログラムによれば、（ａ）タスク構成が大きく変わらない限りタスク数が増加してもスタックの総容量を増加する必要がないと共に、高いスタック利用効率が得られる、（ｂ）必要に応じて最適な容量のスタックを確保できる、（ｃ）スタック容量が必要量に対して不足した場合にもプログラムの実行を可能とすることができる、という効果が得られる。
【発明を実施するための最良の形態】
【００５１】
以下、本発明に係るスタック管理装置の好適な実施の形態について、添付図面を参照して詳細に説明する。
【００５２】
（スタック管理装置の構成）
図１は本発明の一実施形態に係るスタック管理装置の概略構成を示す概念図、図３は同スタック管理装置の詳細構成を示す概念図である。
【００５３】
本実施形態に係るスタック管理装置は、図１に示すように、共有スタック１０と、本発明の特徴であるタスクスタック２０とを備えている。両スタック１０と２０は、ＲＴＯＳ５０による制御の下で動作する。
【００５４】
共有スタック１０は、実行中のタスクや割り込み処理が使用するスタック領域であって、各タスクで共用される。共有スタック１０は、一端（図３では下端）から他端（図３では上端）に向かってアドレスが規定され、その一端（図３では下端）を介して順にデータの書き込みと読み出しを可能とした記憶領域１１と、記憶領域１１の使用部分（データ格納部分）と未使用部分（データ未格納部分）の境界を示すスタックポインタ１２を有している。スタックポインタ１２は、記憶領域１１の使用部分の最終アドレスを表示する。よって、スタックポインタ１２が示す値（すなわち最終アドレス）を読み取ることにより、その時に共有スタック１０に格納されているデータの総容量を知ることができる。
【００５５】
タスクスタック２０は、あるタスクの実行が一時的に中断される場合にそのタスクの実行の再開に必要なデータを、共有スタック１０の中から一時的に退避しておくためのスタック領域である。タスクスタック２０も各タスクで共用される。タスクスタック２０は、図３に示すように、１４個のブロックに分割された記憶領域（すなわち１４個のデータ記憶用ブロックを持つ記憶領域）２１と、次ブロック管理領域２３と、先頭ブロック管理領域２４と、未使用ブロック管理領域２５とを備えている。
【００５６】
記憶領域２１の各データ記憶用ブロックには、それらブロックを識別するために０〜１３のブロック番号２２がそれぞれ付されている。ブロック０〜ブロック１３には、共有スタック１０から退避されるデータが適宜分割して記憶される。
【００５７】
次ブロック管理領域２３は、データ記憶用ブロックの各々についてその次ブロックとして関連付けられているブロックの番号を示す領域である。図３の初期状態では、ブロック０〜１３の次ブロック管理領域２３には、１、２、３、・・・・、１３、ＦＦの制御コードがそれぞれ付されている。
【００５８】
ブロック０について見ると、その次ブロック管理領域２３に「１」という値が付されているが、これはブロック０に続いてブロック１が存在していることを示す。同様に、ブロック１〜１２の次ブロック管理領域２３に付されている「２」〜「１３」の値は、ブロック１〜１２に続いてブロック２〜１３がそれぞれ存在していることを示す。ブロック１３の次ブロック管理領域２３には「ＦＦ」の値が付されているが、これはブロック１３がタスクスタック２０の記憶領域２１中の最終ブロックであり、それ以上に記憶領域は存在しないことを示すものである。
【００５９】
先頭ブロック管理領域２４は、使用中の（すなわち退避データが記憶されている）一連のブロックの先頭ブロックを管理する領域であり、退避されたデータが記憶されているデータ記憶用ブロックの先頭を示す先頭ブロックポインタ２４ａと、退避されたデータに対応するタスクを識別するためのタスクＩＤ（タスク番号）を表示するタスクＩＤ表示部２４ｂとを有する。先頭ブロックポインタ２４ａとタスクＩＤ表示部２４ｂの総数は、同時に起動できる最大タスク数に応じてそれぞれ変化する。例えば、本実施形態に係るスタック管理装置が同時に起動するタスク数が最大４個のコンピュータ・システムで使用される場合には、図３に示すように、３個の先頭ブロックポインタ２４ａが用意され、それらに先頭ブロックポインタ番号「０」、「１」、「２」が順に付される。また、３個の先頭ブロックポインタ２４ａに対応して、３個のタスクＩＤ表示部２４ｂが用意される。図３の初期状態では、各先頭ブロックポインタ２４ａに「ＦＦ」が表示され、各タスクＩＤ表示部２４ｂに「Ｔａｓｋ  ＩＤ」が表示されている。これらは、いずれも退避しているタスクが存在しないことを示す。
【００６０】
未使用ブロック管理領域２５は、未使用の（すなわち退避データが記憶されていない）データ記憶用ブロックを管理するための領域であり、一連の未使用ブロックの先頭のブロック番号を表示する。図３の初期状態では「０」が表示されており、未使用ブロックの先頭がブロック０であることを示している。
【００６１】
共有スタック１０とタスクスタック２０は、実際には、コンピュータ・システムの主記憶領域を構成するメモリ（ＲＡＭ）上に形成されるのが通常であるが、それ以外のデータ記憶領域にも形成可能であることは言うまでもない。
【００６２】
（スタック管理装置の動作）
次に、以上の構成を持つスタック管理装置の動作について、図２に示したフローチャートと図４〜図１０に示した概念図を参照しながら説明する。
【００６３】
（タスク中断時の動作）
最初に、同時に起動可能なタスク数が最大４個のコンピュータ・システムにおいて、図４に示す状態で共有スタック１０の記憶領域１１を使用しながら実行中のタスク１を中断する場合の動作について説明する。実行可能な他のタスクは、タスク２、タスク３、タスク４であるとする。
【００６４】
このようなタスク１の実行を中断する場合、最初に、中断後にタスク１がその実行を再開するために必要なデータ（共通スタック１０の記憶内容、図示しないレジスタのアドレス・内容等）を退避するのに必要な記憶容量を計算する。ここでは、共通スタック１０に設けられたスタックポインタ１２を用いて計算する（図２のステップＳ１）。
【００６５】
実行中のタスク１は共有スタック１０の記憶領域１１を使用しているが、その時の記憶領域１１の使用部分の最終アドレスは、スタックポインタ１１によって知ることができる。よって、この時にタスクスタック２０に必要な記憶容量（共有スタック１０からのデータ退避量）は、現在のスタックポインタ１２の値を用いて容易に計算することが可能である。
【００６６】
次に、タスクスタック２０の記憶領域２１の各データ記憶用ブロックの長さ（ブロック長すなわち、１ブロックに記憶できるデータ量）を考慮し、共有スタック１０からの退避データを記憶するのに必要な当該ブロックの総数を算出する（図２のステップＳ２）。すなわち、ステップＳ１で得た必要記憶容量をデータ記憶用ブロックのブロック長で割ることにより、必要なブロック数を算出するのである。ここでは、演算の結果、タスクスタック２０にブロック３個分の記憶容量が必要と判定した、と仮定する。
【００６７】
次に、共有スタック１０からの退避データ全体をタスクスタック２０中に安全に記憶することができるか否かを判定するため、退避データ全体を記憶するのに必要と判定されたデータ記憶用ブロックの総数が、未使用として現存しているデータ記憶用ブロックの総数よりも大きいか否かを判定する（図２のステップＳ３）。その判定結果がＹＥＳであれば、タスクスタック２０の記憶可能容量を超えるから、「タスクスタック容量オーバー」のエラー処理へ進む（図２のステップＳ１２）。ステップＳ３での判定結果がＮＯであれば、ステップＳ４に進み、未使用領域があるか否かを判定する（図２のステップＳ４）。ここでは、先頭ブロック管理領域２４に未使用領域があると表示されているか否かを調べることにより、これを判定する。
【００６８】
ステップＳ４での判定結果がＮＯであれば、同時に起動できる最大タスク数を越えるから、「同時に起動できるタスク数オーバー」のエラー処理に進む（図２のステップＳ１３）。その判定結果がＹＥＳであれば、ステップＳ５に進む。
【００６９】
ここでは、図３に示すように、タスクスタック２０中に退避データが未だ存在していないから、未使用ブロックが１４個ある。従って、ステップＳ３ではタスクスタック２０の記憶容量にはまだ余裕があると判定し、ステップＳ４に進む。また、図３に示すように、先頭ブロック管理領域２４に未使用領域があると表示されているから、ステップＳ４では当該データを安全にタスクスタック２０中に退避することが可能であると判定し、ステップＳ５に進む。
【００７０】
ＲＴＯＳ５０は、タスクスタック２０に未使用のブロックが１４個残っていることを次のようにして認識する。すなわち、ＲＴＯＳ５０はまず、未使用ブロック管理領域２５に表示されるブロック番号「０」を読み取り、未使用ブロックの先頭はブロック０であることを認識する。次に、ブロック０から次ブロック管理領域２５の検索を開始し、次ブロック管理領域２５に終了ブロックを示す制御コード「ＦＦ」が格納されているブロック番号（つまり１３）が現れると、検索を終了する。こうしてその時に存在する未使用ブロックの総数をカウントし、未使用のブロックが１４個あることを認識するのである（図４（ａ）を参照）。
【００７１】
ＲＴＯＳ５０はまた、先頭ブロック管理領域２４に表示されている値を読み取り、３個の先頭ブロックポインタ２４ａが表示する値はいずれも「ＦＦ」であり、タスクＩＤ表示部２４ｂの値はいずれも「ＴａｓｋＩＤ」であることを認識する。この「ＴａｓｋＩＤ」は、対応するタスクが存在しないことを意味するから、ＲＴＯＳ５０は、同時に起動できる最大タスク数（＝４）をオーバーしていない、と判断する。その結果、１４個の未使用ブロックに対して３ブロック分のデータを共有スタック１０から退避することになるから、タスクスタック２０には当該データを安全に退避できる、と判定し、次のステップＳ５へ進むのである。
【００７２】
続いて、図５（ａ）に示すように、共有スタック１０の記憶領域１１に記憶されている全データのうちの１ブロック分（ここでは、記憶領域１１の最下段のラインに記憶されたデータ）を、記憶領域２１のブロック０にコピーすることにより、タスクスタック２０に退避させる（図２のステップＳ５）。そして、図５（ｂ）に示すように、先頭ブロック管理領域２４の先頭ブロックポインタ２４ａの一つ（先頭ブロックポインタ番号：０）を、未使用ブロック管理領域２５の値「０」で更新し、さらに、同領域２４の対応するタスクＩＤ表示部２４ｂに「タスク１」を設定する（図２のステップＳ６）。
【００７３】
次に、図２のステップＳ７では、共有スタック１０中の全データの退避が完了したか否かを判定する。ここでは、全データの退避は完了していないので、ステップＳ５の直前に戻り、ステップＳ５〜Ｓ７を繰り返す。すなわち、図６（ａ）に示すように、共有スタック１０の記憶領域１１に残っているデータのうちの１ブロック分（ここでは、記憶領域１１の最下段より一つ上のラインに記憶されたデータ）を、記憶領域２１のブロック１にコピーすることにより、タスクスタック２０に退避させる。さらに、図６（ｂ）に示すように、共有スタック１０の記憶領域１１に残っているデータのうちの最後の１ブロック分（ここでは、記憶領域１１の最下段より二つ上のラインに記憶されたデータ）を、記憶領域２１のブロック２にコピーすることにより、タスクスタック２０に退避させる。
【００７４】
そして、ブロック２にコピー（退避）したデータが最後であることを識別できるように、図６（ｃ）に示すように、ブロック２の次ブロック管理領域２３ｂに、終了ブロックを示す制御コード「ＦＦ」を書き込む。さらに、ブロック０〜ブロック２が使用中であり、ブロック３〜ブロック１３が未使用であることを示すために、図６（ｄ）に示すように、未使用ブロック管理領域２５の値を「０」から「３」に更新する。
【００７５】
以上のようにして、タスク１の実行中に共有スタック１０内に記憶されていたデータ全体が、タスクスタック２０の記憶領域２１のブロック０とブロック１とブロック２にこの順に退避される。この時の状態は、タスクスタック２０の各部分の状態は、図６に示すようになり、ブロック３→ブロック４→ブロック５→・・・・→ブロック１３が未使用で残っている。なお、共有スタック１０の記憶領域１１は、実行中の他のタスク（例えばタスク２）や割り込み処理によって使用されるから、タスク１の実行中に共有スタック１０内に記憶されていたデータは他のデータに書き換えられて消滅する。
【００７６】
上述したように、本実施形態のスタック管理装置では、図２のステップＳ３において、退避データ全体を記憶するのに必要と判定されたデータ記憶用ブロックの総数が、未使用として現存しているデータ記憶用ブロックの総数よりも大きいと判定されると、タスクスタック２０の記憶可能容量を超えるから、「タスクスタック容量オーバー」のエラー処理へ進むようになっている（ステップＳ１２）。また、ステップＳ４において、先頭ブロック管理領域２４に未使用領域があると表示されていないと判定されると、同時に起動できる最大タスク数を越えるから、「同時に起動できるタスク数オーバー」のエラー処理に進むようになっている（ステップＳ１３）。このような場合、従来のスタック管理装置では、プログラムの暴走を避けるために当該コンピュータ・システムを停止せざるを得ない場合が多かった。しかし、本実施形態のスタック管理装置では、共有スタック１０中のデータを退避する前にタスクスタック２０の使用状況を確認し、使用状況が適当でない場合には「タスクスタック容量オーバー」のエラー処理あるいは「タスク数オーバー」のエラー処理を実行するようにしているため、これらエラー処理の内容を適宜設定することにより、コンピュータ・システムの停止を避けることが可能となる、という利点がある。また、ユーザの希望に応じてそれらエラー処理の内容を設定することにより、ユーザの希望に応じた対応が選択できるという利点もある。
【００７７】
さらに、上述した本実施形態のスタック管理方法では、タスクスタック２０の残存記憶容量を確認するために、図４（ａ）で示したように、未使用ブロック管理領域２５の値（図４では「０」）に基づいて、ブロック０〜ブロック１３の次ブロック管理領域２３の値を順に検索している。このため、共有スタック１０のデータ退避前に、未使用（残存）ブロックの総数を容易かつ確実に知ることができる、という利点がある。
【００７８】
（タスク再開時の動作）
続いて、同時に起動するタスク数が最大４個の上述したコンピュータ・システムにおいて、図７に示す状態でタスクタック２０の記憶領域２１を使用しながらタスク１とタスク２が実行を中断している場合に、タスク１の実行を再開する場合の動作について説明する。
【００７９】
まず最初に、中断中のタスクを復帰させるか否かを判断する（図２のステップＳ８）。その判断結果がＮＯの場合は直ちに処理を終了する。ここでは、その判断結果がＹＥＳであるから、タスク１に係るデータを１ブロック分タスクスタックから共有スタックへコピーして復帰させる（図２のステップＳ９）。すると、当該ブロックは未使用となるので、当該ブロックに対応する次ブロック管理領域２３の値を未使用ブロック管理領域２５の値に更新する（図２のステップＳ１０）。このタスクスタックから共有スタックへ１ブロック分のデータのコピーと、コピーしたブロックに対応する次ブロック管理領域２３の値の更新は、再開するタスク１に係るタスクタック２０内の全データが復帰するまで（図２のステップＳ１１）繰り返される。そして、再開するタスク１に係る退避データ全体のコピーが完了すると、未使用ブロック管理領域２５の値を更新すると共に、タスク１で使用していた先頭ブロックポインタ２４ａを「ＦＦ」で更新し、当該先頭ブロックポインタ２４ａを開放する。こうして動作を終了する。
【００８０】
この動作を図８〜図１０に基づいて説明すると、次の通りである。
【００８１】
ＲＴＯＳ５０は、最初に、図８（ａ）に示すように、先頭ブロック管理領域２４においてタスク１が使用している先頭ブロックポインタ２４ａの値「０」を読み取り、タスク１の退避データが格納されているタスクタック２０の記憶領域２１の先頭ブロックが「ブロック０」であることを認識する。そこで、続いて、図８（ｂ）に示すように、ブロック０に格納されている退避データを共有スタック１０の記憶領域１１（最下段の記憶部１３）にコピーして復帰させる（ステップＳ９）。そして、ブロック０に係る次ブロック管理領域２３の値「１」を読み取ることにより、ブロック０のデータの続きがブロック１に続いていることを認識する。そこで、図９（ａ）に示すように、ブロック１に格納されている退避データを共有スタック１０の記憶領域１１（最下段より一つ上の記憶部１３）にコピーする。また、図９（ｂ）に示すように、ブロック０に係る次ブロック管理領域２３の値「１」を、その直前の未使用ブロック管理領域２５の値「５」に更新する。そして、未使用ブロック管理領域２５の値は「０」に更新する。
【００８２】
次に、ＲＴＯＳ５０は、ブロック１に係る次ブロック管理領域２３の値「２」を読み取ることにより、ブロック１のデータの続きがブロック２に続いていることが判るので、図９（ｃ）に示すように、ブロック２に格納されている退避データを共有スタック１０の記憶領域１１（最下段より二つ上の記憶部１３）にコピーする。そして、ブロック１に対応する次ブロック管理領域２３の値「２」を未使用ブロック管理領域２５の値「０」に更新する。そして、未使用ブロック管理領域２５の値は「１」に更新される。
【００８３】
この時、ＲＴＯＳ５０は、ブロック２に対応する次ブロック管理領域２３の値「ＦＦ」を読み取ることにより、ブロック２が最終ブロックであることが判るから、ブロック２に格納されている退避データを共有スタック１０の記憶領域１１にコピーする動作を終了すると、全データの復帰が終了したと判断する。そして、この時にはブロック０とブロック１に加えてブロック２も未使用となるので、図１０（ａ）に示すように、ブロック２に対応する次ブロック管理領域２３の値を未使用ブロック管理領域２５の値「２」に更新する。また、図１０（ｂ）に示すように、タスク１が使用していた先頭ブロックポインタ２４ａを開放する。
【００８４】
こうしてタスク１の退避データ全体の共有スタック１０への復帰が完了した時には、ブロック０〜ブロック２が未使用（ブロック３とブロック４は未だタスク２に係る退避データが使用中）となるので、この時のタスクスタック２０内の全未使用ブロックは、ブロック２→ブロック１→ブロック０→ブロック５→ブロック６→・・・・→ブロック１３となる。図１０では、この状態を反映して、ブロック０の次ブロック管理領域２３の値が「１」とされ、ブロック２の次ブロック管理領域２３の値が「１」とされ、ブロック１の次ブロック管理領域２３の値が「０」とされ、ブロック０の次ブロック管理領域２３の値が「５」とされている。未使用ブロックの先頭ブロック番号を示す未使用ブロック管理領域２５の値は「２」とされている。先頭ブロック管理領域２４では、タスク２に係る退避データを保存していることを示すために、先頭ブロックポインタ２４ａの値は「３」に設定され、タスクＩＤ表示部２４ｂは「タスク２」に設定されている。
【００８５】
以上詳述したところから明らかなように、本発明の上記実施形態のスタック管理装置では、中断中の全タスクで共用するタスクスタック２０を設け、タスクスタック２０の記憶領域２１を所定のブロック長を持つ複数のブロックから構成して、共有スタック１０に記憶されているデータを前記ブロックに分けて記憶するようにしている。そして、共有スタック１０中のデータを必要に応じてタスクスタック２０に退避させ、またタスクスタック２０に記憶されている退避データを必要に応じて共有スタック１０に復帰できるようにしている。このため、新しくタスクを追加する場合であっても、そのタスク追加によってスタック構成が大きく変化しない限り、スタックの総容量を増加する必要がない。また、同時に動作するタスクの数が増加した場合であっても、より少ないＲＡＭで対応が可能である。
【００８６】
また、タスクスタック２０の記憶領域２１を所定のブロック長を持つ複数のブロックに分割し、ブロック単位でデータの退避・復帰を可能にしたので、ブロック長をユーザ側で任意に設定可能とすることにより、本実施形態のスタック管理装置が適用されるシステムやデバイスに応じて、最適なブロック長を設定できる。
【００８７】
また、最初から一定量のスタックを確保するのではなく、実行中のタスクを中断する毎に必要なスタック量を計算して確保するため、従来例に関して図１３で示したようなスタックの無駄が生じない。その結果、高いスタック利用効率が得られる。
【００８８】
さらに、ステップＳ３において、退避データ全体を記憶するのに必要と判定されたデータ記憶用ブロックの総数が、未使用として現存しているデータ記憶用ブロックの総数よりも大きいか否かを判定し、その判定結果がＹＥＳであれば、「タスクスタック容量オーバー」のエラー処理へ進むようにしている（ステップＳ１２）。そして、ステップＳ４において、先頭ブロック管理領域２４に未使用領域があると表示されているか否かを判定し、その判定結果がＮＯであれば、「タスク数オーバー」のエラー処理に進むようにしている（ステップＳ１３）。よって、タスクスタック２０の残存記憶容量が必要量に対して不足する場合にも、それに起因して実際にエラーが発生する前に、「タスクスタック容量オーバー」のエラー処理あるいは「タスク数オーバー」のエラー処理においてプログラムの実行を停止しないよう対策を採ることができるので、プログラムの実行が可能となる。また、このようなエラーが生じる場合の対応は、ユーザ側で任意に設定することが可能である。
【００８９】
例えば、（ｉ）タスク切り替えによって上記のようなエラーが生じることが判った場合、現在実行中のタスク（例えばタスク１）を中断せずにそのまま継続して実行させることができる。これは、実行中のタスクを中断しようとしても、「タスクスタック容量オーバー」あるいは「タスク数オーバー」となるために中断ができないのであるから、タスクの切り替え処理を行わず、現在実行中のタスクをそのまま継続する、という対応を行うものである。あるいは、（ｉｉ）タスク切り替えによって上記のようなエラーが生じることが判った場合、既に中断状態にあるいくつかのタスクのうち任意のタスク（好ましくは優先順位の低い一つあるいは二つ以上のタスク）の起動を中止することによってタスクスタック２０の記憶領域２１を空け、その空いた部分を用いて現在実行中のタスク（例えばタスク１）の退避データを保存させるようにすることも可能である。この場合、現在実行中のタスク（例えばタスク１）は中断されるが、既に中断状態にあった特定のタスクの起動を中止するので、中止したタスクに対応する機能が削減されることになる。なお、（ｉ）（ｉｉ）のような対応は、従来のスタック管理装置では不可能であり、本発明によって初めて可能となったものである。
【００９０】
タスク切り替えによって上記のようなエラーが生じることが判った場合に、（ｉｉｉ）システムの停止処理を行ってから当該システムを再起動させることもできる。（ｉｉｉ）のような対応は、従来のスタック管理装置でも可能ではあったが、従来のスタック管理装置では上記のようなエラーが実際に生じてからユーザに対応を迫るものであった。これに対し、本発明では、上記のようなエラーが実際に生じる前にそれを検知し、ユーザに対応を問い合わせるものであるから、この点で両者は異なる。
【００９１】
さらに、スタックポインタ１２を使用して共有スタック１０の使用量を必要時に認識でき、また、図４（ａ）に示した手法で未使用ブロック管理領域２５を検索することにより、タスクスタック２０の使用量を必要時に認識できるので、スタック容量を必要に応じて必要なだけ確保できるという効果もある。
【００９２】
本発明の上記実施形態に係るスタック管理装置と、図１２と図１３に示した従来のスタック管理装置の効果の差異を具体例で説明すると、次のようになる。
【００９３】
ｄｅｌａｙ命令を含むタスク数が５０、同時に起動可能なタスク数がｎ、一つのタスクで使用されるスタックの容量（タスク毎のスタック容量）が６４バイトとすると、従来のスタック管理装置で必要とされる総スタック容量Ｍは、
Ｍ＝総タスク数×タスク毎のスタック容量＝５０×６４＝３２００（バイト）
である。これは、この従来のスタック管理装置では、ｄｅｌａｙ命令を含むタスク毎にＲＴＯＳスタック２００が設けられるからである。
【００９４】
これに対し、本発明の上記実施形態に係るスタック管理装置で必要とされる総スタック容量Ｍは、タスクスタック２０の記憶領域２１のブロック長が１６バイト、タスクスタック制御用ＲＡＭの容量が２９バイトであるとすると、
Ｍ＝（ｎ−１）×ブロック長×ブロック数＋タスクスタック制御用ＲＡＭの容量＝（ｎ−１）×１６×（６４／１６）＋２９＝（ｎ−１）×６４＋２９（バイト）
である。ｎ＝５であればＭ＝２８５（バイト）となる。ただし、ブロック数の計算は（タスク毎のスタック容量／ブロック長）で行い、小数点以下を切り上げる。
【００９５】
このように、本発明の上記実施形態に係るスタック管理装置によれば、総スタック容量Ｍを大幅に減少できることが分かる。
【００９６】
なお、「タスクスタック制御用ＲＡＭの容量」とは、タスクスタック２０の制御に必要なデータ、すなわち次ブロック管理領域２３や先頭ブロック管理領域２４、未使用ブロック管理領域２５に係るデータを記憶するためのＲＡＭの容量である。
【００９７】
（変形例）
上述した実施形態は本発明を具体化した例を示すものである。したがって、本発明はこの実施形態に限定されるものではなく、本発明の趣旨を外れることなく種々の変形が可能であることは言うまでもない。例えば、上記実施形態では、スタックポインタ１２を使用して共有スタック１０の記憶領域１１の使用量を判断しているが、次のような方法も考えられる。
【００９８】
すなわち、図１１に示すように、共有スタック１０の記憶領域１１を適当な記憶容量（例えば１６バイト）毎に分けて複数の記憶部（記憶ライン）１３を形成する。同一ラインの記憶部１３の各々には、チェックデータ格納部１４を形成する。そして、タスクが起動される毎に、各ラインの記憶部１３に００、０１、０２、・・・・、０Ｄ、０Ｅ、１０、１１、・・・・・のように順に異なる値を設定していくと共に、各ラインのチェックデータ格納部１４にはチェックデータを初期値として格納する。チェックデータとしては、例えば、各ラインの記憶部１３に設定された値（ｘ０、ｘ１、ｘ２、・・・・、ｘＤ、ｘＥ）の和（ｘ０＋ｘ１＋ｘ２＋・・・・＋ｘＤ＋ｘＥ）の反転値を設定することができる。その結果、必要に応じて各ラインの記憶部１３のチェックデータの値を確認することにより、その値が初期値から変化していれば当該ラインの記憶部１３の１バイト目〜１５バイト目までのいずれかの値が変化していることを意味するから、当該ラインの記憶部１３はいずれかのタスクによって使用中である、と判定できる。他方、各ラインの記憶部１３のチェックデータの値が変化していなければ、当該ラインの記憶部１３は未使用である、と判定することができる。このような方法によっても、タスクが使用中の共有スタック１０のスタック量を確認することができる。
【００９９】
また、未使用ブロック管理領域２５と先頭ブロック管理領域２４と次ブロック管理領域２３の構成も上記実施形態に示されたものに限定されず、任意に変更することが可能である。
【図面の簡単な説明】
【０１００】
【図１】本発明の一実施形態に係るスタック管理装置の全体構成を示す概念図である。
【図２】図１に示した本発明の実施形態に係るスタック管理装置の動作を示すフローチャートである。
【図３】図１に示した本発明の実施形態に係るスタック管理装置で使用されるタスクスタックの構成の詳細を示す概念図である。
【図４】図１に示した本発明の実施形態に係るスタック管理装置において、タスク中断時のタスクスタックの動作を示す概念図である。
【図５】図１に示した本発明の実施形態に係るスタック管理装置において、タスク中断時のタスクスタックの動作を示す概念図で、図４の続きである。
【図６】図１に示した本発明の実施形態に係るスタック管理装置において、タスク中断時のタスクスタックの動作を示す概念図で、図５の続きである。
【図７】図１に示した本発明の実施形態に係るスタック管理装置において、タスク復帰時のタスクスタックの動作を示す概念図である。
【図８】図１に示した本発明の実施形態に係るスタック管理装置において、タスク復帰時のタスクスタックの動作を示す概念図で、図７の続きである。
【図９】図１に示した本発明の実施形態に係るスタック管理装置において、タスク復帰時のタスクスタックの動作を示す概念図で、図８の続きである。
【図１０】図１に示した本発明の実施形態に係るスタック管理装置において、タスク復帰時のタスクスタックの動作を示す概念図で、図９の続きである。
【図１１】図１に示した本発明の実施形態に係るスタック管理装置で使用される共有スタックの変形例の詳細構成を示す概念図である。
【図１２】ＲＴＯＳスタックを利用した従来のスタック管理装置で使用されるスタックの全体構成を示す概念図である。
【図１３】図１２の従来のスタック管理装置におけるスタック確保の方法を示す概念図である。
【符号の説明】
【０１０１】
１０  共有スタック
１１  共有スタックの記憶領域
１２  共有スタックのスタックポインタ
１３  共有スタックの同一ラインの記憶部
１４  共有スタックのチェックデータ格納部
２０  タスクスタック
２１  タスクスタックの記憶領域
２２  タスクスタックの記憶領域のブロック番号
２３  タスクスタックの次ブロック管理領域
２４  タスクスタックの先頭ブロック管理領域
２４ａ  先頭ブロック管理領域の先頭ブロックポインタ
２４ｂ  先頭ブロック管理領域のタスクＩＤ表示部
２５  タスクスタックの未使用ブロック管理領域
【図１】
2005071141.tif 000003
【図２】
2005071141.tif 000004
【図３】
2005071141.tif 000005
【図４】
2005071141.tif 000006
【図５】
2005071141.tif 000007
【図６】
2005071141.tif 000008
【図７】
2005071141.tif 000009
【図８】
2005071141.tif 000010
【図９】
2005071141.tif 000011
【図１０】
2005071141.tif 000012
【図１１】
2005071141.tif 000013
【図１２】
2005071141.tif 000014
【図１３】
2005071141.tif 000015