JP2005071141A - スタック管理方法及び装置並びにスタック管理プログラム - Google Patents

スタック管理方法及び装置並びにスタック管理プログラム Download PDF

Info

Publication number
JP2005071141A
JP2005071141A JP2003301136A JP2003301136A JP2005071141A JP 2005071141 A JP2005071141 A JP 2005071141A JP 2003301136 A JP2003301136 A JP 2003301136A JP 2003301136 A JP2003301136 A JP 2003301136A JP 2005071141 A JP2005071141 A JP 2005071141A
Authority
JP
Japan
Prior art keywords
stack
block
task
data
stored
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
JP2003301136A
Other languages
English (en)
Inventor
Shiro Nishioka
史朗 西岡
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Renesas Micro Systems Co Ltd
Original Assignee
Renesas Micro Systems Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Renesas Micro Systems Co Ltd filed Critical Renesas Micro Systems Co Ltd
Priority to JP2003301136A priority Critical patent/JP2005071141A/ja
Publication of JP2005071141A publication Critical patent/JP2005071141A/ja
Withdrawn legal-status Critical Current

Links

Images

Abstract

【課題】 タスク構成が大きく変わらない限りタスク数が増加してもスタックの総容量を増加する必要がないと共に、高いスタック利用効率が得られるスタック管理方法を提供する。
【解決手段】 中断中の全タスクが共用可能なタスクスタックを設け、そのタスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにする。あるタスクの実行を中断するために前記共有スタック内のデータを前記タスクスタックに退避する際には、前記共有スタック内のデータ量に応じて未使用の前記ブロックに記憶させ、当該ブロックの識別データと当該タスク用の識別データを記憶する。前記ブロック識別データと前記タスク識別データを用いて前記データを前記共有スタックに復帰する。
【選択図】 図1

Description

本発明は、オペレーティングシステム(以下、OSという)で使用されるスタックの管理技術に関し、さらに言えば、マルチタスク制御のOSの一つであるリアルタイム・オペレーティングシステム(以下、RTOSという)で使用されるスタックを管理する方法及びその装置、並びにそのためのプログラムに関する。ここで、「スタック」とは、割り込み信号等を受けて実行中のタスクを中断して他のタスクを実行する際に、中断したタスクの再開に必要なデータ(待避データ)を一時的に保持するために使用されるデータ記憶領域をいう。
近年、ソフトウェアはますます高機能化・大規模化しており、それに伴ってRTOSで実行されるタスクの数も飛躍的に増加している。従来のスタック管理方法・装置では、タスク数の増加がそのままRTOSで使用されるスタック容量の増加を招いており、種々の問題を生じている。
従来のこの種のスタック管理装置の一例を図12に示す。この例は、特開2001−43093号公報に開示されているものである。図12より明らかなように、この従来のスタック管理装置は、RTOS500による制御の下で、共有スタック100とRTOSスタック200とコンテキストデータ300を使用する。
説明を簡単にするため、ここでは、delay命令とwait命令を含むタスク1、wait命令のみを含むタスク2、delay命令とwait命令を含むタスク3を、図示しないCPU(Central Processing Unit、中央処理装置)で実行する場合について説明する。
共有スタック100は、CPUで実行中のタスクや割り込み処理が使用するスタック(データ記憶領域)であり、必要に応じてタスク1〜タスク3で共用される。共有スタック100は従来より公知のものである。
RTOSスタック200は、あるタスクの実行が一時的に中断された場合に、そのタスクの実行を後に再開できるようにするために、共有スタック100中の必要データを一時的に退避しておくためのスタックである。
図12の例では、delay命令(あるタスクの実行を一時中断させ、次の命令を受け取るとそのタスクの実行を再開させる命令)と、wait命令(予め定義された「待ち条件」を満足するとそのタスクの実行開始を待機させ、予め定義された「待ち解除条件」を満足するとそのタスクを先頭から実行させる命令)が記述されているタスク1と3については、RTOSスタック200がそれぞれ確保されている。しかし、wait命令を含むがdelay命令を含まないタスク2については、RTOSスタック200は確保されていない。
このように、RTOSスタック200は、タスク中に含まれる命令に応じてタスク毎に生成されており、従って各RTOSスタック200は対応するタスクによって専有されている。なお、タスク毎に確保されるRTOSスタック200の容量は、当該タスクが使用する可能性のある最大値に設定される。
コンテキストデータ300は、あるタスクの実行が一時的に中断された場合に、当該タスクが使用している汎用レジスタの内容や当該タスクの再開アドレス等を退避しておくための領域である。コンテキストデータ300は、全タスクに対してそれぞれ生成されており、従って、RTOSスタック200と同様に、各コンテキストデータ300は対応するタスクによって専有されている。
図12に示す従来のスタック管理装置では、例えばタスク1の実行を一時的に中断させる場合、RTOS200が、共有スタック100に記憶されているデータをタスク1用のRTOSスタック200に退避させると共に、汎用レジスタ等の各レジスタの内容(データ)をタスク1用のコンテキストデータ300に退避させる。そして、中断中のタスク1の実行を後に再開する際には、タスク1用のRTOSスタック200からそこに退避していたデータを読み出して共有スタック100に復帰させると共に、タスク1用のコンテキストデータ300からそこに退避していたデータを読み出して各レジスタに復帰させる。その後、タスク1の実行を再開する。
このように制御することにより、例えばタスク1の中断後に共有スタック100内のデータやレジスタ中のデータが他のタスク(例えばタスク3)用のものに書き換えられても、再開前にRTOSスタック200とコンテキストデータ300に退避されていたデータを呼び出すことができるため、タスク1の実行を再開することが可能となる。
また、特開平7−175670号公報には、従来のタスク管理装置の例が開示されている。当該公報に開示されたタスク管理装置は、その段落(0006)に記載されている通り、「RAMの少ない組み込み型マイコンシステムにおいても、小粒度のタスク制御を行うことが可能なタスク制御装置を提供する」ことを目的とする。そして、その段落(0007)と(0008)によれば、このタスク管理装置は、
少なくとも、実行状態、実行可能状態、待機状態の3状態を持ち、並行もしくは並列に動作するタスク群と、
タスクの状態やコンテキスト等のタスク情報を保持するタスク制御テーブル群と、
タスクが使用するスタック群と、
実行可能状態のタスクのタスク制御テーブルが、メッセージ到着順等の順序で繋がれる待ち行列と、
実行状態のタスクが発行するメッセージ送信命令を解釈し、待機状態から実行可能状態にするタスクを決定するメッセージ送信処理手段と、
実行状態のタスクが発行するメッセージ受信命令によって、このタスクのコンテキストをタスク制御テーブルに退避し、このタスクを待機状態とするメッセージ受信処理手段と、
実行状態のタスクが発行する特殊メッセージ受信命令によって、このタスクのタスク制御テーブルとスタックとを開放し、特殊な待機状態である特殊待機状態とし、他の特殊待機状態のタスクと、タスク制御テーブルとスタックを共有させる特殊メッセージ受信処理手段と、
メッセージ送信処理手段が決定した待機状態のタスクが特殊待機状態でない場合に、このタスクのタスク制御テーブルを待ち行列に繋いで実行可能状態とする実行可能遷移手段と、
メッセージ送信処理手段が決定した待機状態のタスクが特殊待機状態である場合に、このタスクのタスク制御テーブルとスタックとを確保し、タスク制御テーブルを待ち行列に繋いで実行可能状態とする特殊実行可能遷移手段と、
タスク制御テーブルをもとにコンテキストを回復し、タスク制御テーブルを待ち行列から外して実行状態とする実行遷移手段と
を備えている。
そして、このような構成を持つことにより、特殊メッセージ受信処理手段は、実行状態のタスクが発行する特殊メッセージ受信命令によって、このタスクの制御テーブルとスタックとを開放し、特殊待機状態として、他の特殊待機状態のタスクと、タスク制御テーブルとスタックとを共有させる。特殊実行可能遷移手段は、待機状態のタスクが特殊待機状態である場合に、このタスクのタスク制御テーブルとスタックとを確保し、タスク制御テーブルを待ち行列に繋いで実行可能状態とする。実行遷移手段は、タスク制御テーブルをもとにコンテキストを回復し、タスク制御テーブルを待ち行列から外して実行状態とする。こうして、各タスクがタスク制御テーブルとスタックを多重に使用することを可能としている。
特開2001−43093号公報(図13) 特開平7−175670号公報(図1)
図12に示した従来のスタック管理装置(特開2001−43093号公報参照)では、以下のような問題点がある。
第一の問題点は、delay命令が記述されているタスク毎にRTOSスタック200を用意する必要があるため、その種タスクの総数が増加するとスタックの総容量を増加さえる必要があることである。換言すれば、タスク数の増加がある度にスタックの総容量を増加しなければならないことである。
ユーザがプログラムを作成する場合、コンピュータ・システムの主記憶領域を構成するメモリ(RAM、Random-Access Memory)の容量が制限されているのが通常であるから、当該RAMをどの様にして効率的に使用するかを検討する必要がある。この場合、RTOS500側が多量のRAMを使用すればするほど、それだけユーザの使用できるRAMの量が減少するから、タスク数の増加に応じてスタック総容量の増加が必要な点は、プログラム作成上の大きな障害となる。また、タスクの変更や追加を行う度にユーザ側で使用可能なRAM容量を検討しなければならないとすると、それだけユーザの負担が増加し、従ってRTOS500を使用するメリットが減少する。よって、タスクの総数が増加してもスタック用記憶領域の必要容量が変わらないことが望ましい。
第二の問題点は、タスク中断時にRTOSスタック200内に無駄な領域(確保されたが実際には使用されない領域)が生じることがあり、RTOSスタック200(RAM)の使用効率は必ずしも高くないことである。これは、あるタスクのためにRTOSスタック200を確保する際には、そのタスクが使用する可能性のある最大容量を確保しなければならないからである。
例えば、タスク1が図13の左端に示すように記述されている場合、そこにはdelay命令が二つ含まれているから、それらに対応して(a)、(b)の2箇所で実行が中断される可能性がある。この場合、(b)の箇所で当該タスクの実行が中断されることを考慮して、確保するRTOSスタック200の容量を図13の右端に示すように決定しなければならない。このため、(a)の箇所で当該タスクの実行が中断される場合は、図13の中央に示すように、当該RTOSスタック200の一部しか使用しないことになり、その結果、RTOSスタック200の(c)の部分が無駄になるのである。
第三の問題点は、何らかの原因であるRTOSスタック200の最大容量が必要量に対して1バイト(byte)でも不足すると、「スタック容量オーバー」を理由とするエラーが発生し、その結果、当該タスクに係るプログラムの実行を停止せざるを得ないことが多いことである。これは、RTOSスタック200の最大容量が必要量に対して1バイトでも不足すれば、当該プログラム全体が暴走する恐れがあるため、これを防止する必要があるからである。
プログラムの暴走を回避するために、RTOSスタック200の最大容量を少し多く設定する(余裕を持たせる)ことは可能である。しかし、このようにしても、RTOSスタック200の必要量を見積もる手段がないため、その最大容量は推測によって多めの値に決定せざるを得ない。その結果、莫大な容量のRAMを無駄にするという事態を招く恐れがある。
他方、特開平7−175670号公報に開示された従来のタスク管理装置では、各タスク間でタスク制御テーブルとスタックとを多重に使用する(共用する)ことによって、スタックの必要容量を減少させている。しかし、スタックの必要容量は、全タスクの中で最も多量のスタックを使用するものを考慮して決定しなければならない。よって、このタスク管理装置においても、RAMの使用効率は必ずしも高くない、という問題点がある。これは、図12に示した従来のスタック管理装置における第二の問題点と同じである。
さらに、特開平7−175670号公報に開示されたタスク管理装置では、図12に示した従来のスタック管理装置の第三の問題点、すなわちスタックの最大容量が必要量に対して不足すると、当該タスクに係るプログラムの実行を停止せざるを得ない、という問題点が残存していることも明らかである。
本発明は上述した従来例の問題点を考慮してなされたものであり、その目的とするところは、タスク構成が大きく変わらない限りタスク数が増加してもスタックの総容量を増加する必要がないと共に、高いスタック利用効率が得られるスタック管理方法及び装置並びにスタック管理プログラムを提供することにある。
本発明の他の目的は、必要に応じて最適な容量のスタックを確保できるスタック管理方法及び装置並びにスタック管理プログラムを提供することにある。
本発明のさらに他の目的は、スタック容量が必要量に対して不足した場合にもプログラムの実行を可能とすることができるスタック管理方法及び装置並びにスタック管理プログラムを提供することにある。
ここに明記しない本発明の他の目的は、以下の説明及び添付図面から明らかであろう。
(1) 本発明のスタック管理方法は、
実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、
前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにし、
前記データが記憶されていない未使用の前記ブロックを未使用ブロック管理領域で管理し、
あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを使用ブロック管理領域で管理し、
一つの前記ブロックとそれに続く一つの前記ブロックとの関連を次ブロック管理領域で管理し、
あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰することを特徴とするものである。
(2) 本発明のスタック管理方法では、実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶する。この場合、退避した前記データを共有スタックに正しく復帰するためには、各々の前記ブロックに記憶された前記データ間の関連を保持しておく必要があるが、その機能は次ブロック管理領域が行っている。従って、本発明のスタック管理方法では、タスク構成が大きく変わらない限り、実行可能なタスク数が増加してもスタックの総容量を増加する必要がない。
また、あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させる。このため、必要に応じて最適な容量のスタックを確保できると共に、高いスタック利用効率が得られる。
さらに、前記データを前記タスクスタックに退避する際に、前記共有スタック中に記憶されている前記データの量に応じて未使用の前記ブロックを選択するので、その段階で前記共有スタック中の前記データの量が前記タスクスタックの残存記憶容量を越えているか否かを判定できる。よって、その判定結果によりスタック容量が必要量に対して不足していることが分かった場合には、当該タスクの中断を実施しないように構成する等により、当該タスクに係るプログラムの実行を可能とすることができる。
(3) 本発明のスタック管理方法の好ましい例では、複数の前記ブロックに一連のブロック番号を付し、前記未使用ブロック管理領域によって未使用の前記ブロックの前記ブロック番号を管理する。この例では、未使用の前記ブロックの管理が容易に実現できる、という利点がある。
本発明のスタック管理方法の他の好ましい例では、複数の前記ブロックに一連のブロック番号を付し、前記使用ブロック管理領域によって、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する。この例では、使用中の前記ブロックの管理が容易に実現できる、という利点がある。
本発明のスタック管理方法のさらに他の好ましい例では、複数の前記ブロックに一連のブロック番号を付し、前記次ブロック管理領域によって一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する。この例では、二つの前記ブロック間の関連の管理が容易に実現できる、という利点がある。
本発明のスタック管理方法のさらに他の好ましい例では、前記共有スタックに記憶されている前記データの量を、前記共有スタックのスタックポインタによって認識する。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に、前記共有スタック中に記憶されているデータ量を新しい構成を付加することなく容易に認識できる、という利点がある。
本発明のスタック管理方法のさらに他の好ましい例では、前記共有スタックの記憶領域を所定の記憶容量を持つ複数の記憶部に分けると共に、各記憶部にチェックデータ格納部を設ける。そして、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納する。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に前記記憶部の各々について前記チェックデータの値が変化しているか否かを調べることにより、前記共有スタック中に記憶されているデータ量を認識できる、という利点がある。
(4) 本発明のスタック管理装置は、
実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして機能する、中断中の全タスクが共用可能なタスクスタックであって、その記憶領域は所定のブロック長を持つ複数のブロックから構成されていて前記データを前記ブロックに分けて記憶するようになっているものと、
前記データが記憶されていない未使用の前記ブロックを管理する未使用ブロック管理領域と、
あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを管理する使用ブロック管理領域と、
一つの前記ブロックとそれに続く一つの前記ブロックとの関連を管理する次ブロック管理領域とを備え、
あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰することを特徴とするものである。
(5) 本発明のスタック管理装置では、本発明のスタック管理方法で上述したのと同じ理由により、それと同じ効果が得られることが明らかである。
(6) 本発明のスタック管理装置の好ましい例では、複数の前記ブロックには一連のブロック番号が付してあり、前記未使用ブロック管理領域が未使用の前記ブロックの前記ブロック番号を管理する。この例では、未使用の前記ブロックの管理が容易に実現できる、という利点がある。
本発明のスタック管理装置の他の好ましい例では、複数の前記ブロックに一連のブロック番号が付してあり、前記使用ブロック管理領域が、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する。この例では、使用中の前記ブロックの管理が容易に実現できる、という利点がある。
本発明のスタック管理装置のさらに他の好ましい例では、複数の前記ブロックに一連のブロック番号が付してあり、前記次ブロック管理領域が一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する。この例では、二つの前記ブロック間の関連の管理が容易に実現できる、という利点がある。
本発明のスタック管理装置のさらに他の好ましい例では、前記共有スタックに記憶されている前記データの量が、前記共有スタックのスタックポインタによって認識される。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に、前記共有スタック中に記憶されているデータ量を新しい構成を付加することなく容易に認識できる、という利点がある。
本発明のスタック管理装置のさらに他の好ましい例では、前記共有スタックの記憶領域が所定の記憶容量を持つ複数の記憶部に分けられていると共に、各記憶部にはチェックデータ格納部が設けられている。そして、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納するように構成されている。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に前記記憶部の各々について前記チェックデータの値が変化しているか否かを調べることにより、前記共有スタック中に記憶されているデータ量を認識できる、という利点がある。
(7) 本発明のスタック管理プログラムは、
実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、
前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにし、
前記データが記憶されていない未使用の前記ブロックを未使用ブロック管理領域で管理し、
あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを使用ブロック管理領域で管理し、
一つの前記ブロックとそれに続く一つの前記ブロックとの関連を次ブロック管理領域で管理し、
あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰する
というステップをコンピュータに実行させる
ことを特徴とするものである。
(8) 本発明のスタック管理プログラムでは、本発明のスタック管理方法で上述したのと同じ理由により、それと同じ効果が得られることが明らかである。
(9) 本発明のスタック管理プログラムの好ましい例では、複数の前記ブロックには一連のブロック番号が付してあり、前記未使用ブロック管理領域が未使用の前記ブロックの前記ブロック番号を管理する。この例では、未使用の前記ブロックの管理が容易に実現できる、という利点がある。
本発明のスタック管理プログラムの他の好ましい例では、複数の前記ブロックに一連のブロック番号が付してあり、前記使用ブロック管理領域が、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する。この例では、使用中の前記ブロックの管理が容易に実現できる、という利点がある。
本発明のスタック管理プログラムのさらに他の好ましい例では、複数の前記ブロックに一連のブロック番号が付してあり、前記次ブロック管理領域が一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する。この例では、二つの前記ブロック間の関連の管理が容易に実現できる、という利点がある。
本発明のスタック管理プログラムのさらに他の好ましい例では、前記共有スタックに記憶されている前記データの量が、前記共有スタックのスタックポインタによって認識される。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に、前記共有スタック中に記憶されているデータ量を新しい構成を付加することなく容易に認識できる、という利点がある。
本発明のスタック管理プログラムのさらに他の好ましい例では、前記共有スタックの記憶領域が所定の記憶容量を持つ複数の記憶部に分けられると共に、各記憶部にはチェックデータ格納部が設けられる。そして、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納するように構成される。この例では、前記共有スタックに記憶されているデータを前記タスクスタックに退避する際に前記記憶部の各々について前記チェックデータの値が変化しているか否かを調べることにより、前記共有スタック中に記憶されているデータ量を認識できる、という利点がある。
本発明のスタック管理方法および装置並びにスタック管理プログラムによれば、(a)タスク構成が大きく変わらない限りタスク数が増加してもスタックの総容量を増加する必要がないと共に、高いスタック利用効率が得られる、(b)必要に応じて最適な容量のスタックを確保できる、(c)スタック容量が必要量に対して不足した場合にもプログラムの実行を可能とすることができる、という効果が得られる。
以下、本発明に係るスタック管理装置の好適な実施の形態について、添付図面を参照して詳細に説明する。
(スタック管理装置の構成)
図1は本発明の一実施形態に係るスタック管理装置の概略構成を示す概念図、図3は同スタック管理装置の詳細構成を示す概念図である。
本実施形態に係るスタック管理装置は、図1に示すように、共有スタック10と、本発明の特徴であるタスクスタック20とを備えている。両スタック10と20は、RTOS50による制御の下で動作する。
共有スタック10は、実行中のタスクや割り込み処理が使用するスタック領域であって、各タスクで共用される。共有スタック10は、一端(図3では下端)から他端(図3では上端)に向かってアドレスが規定され、その一端(図3では下端)を介して順にデータの書き込みと読み出しを可能とした記憶領域11と、記憶領域11の使用部分(データ格納部分)と未使用部分(データ未格納部分)の境界を示すスタックポインタ12を有している。スタックポインタ12は、記憶領域11の使用部分の最終アドレスを表示する。よって、スタックポインタ12が示す値(すなわち最終アドレス)を読み取ることにより、その時に共有スタック10に格納されているデータの総容量を知ることができる。
タスクスタック20は、あるタスクの実行が一時的に中断される場合にそのタスクの実行の再開に必要なデータを、共有スタック10の中から一時的に退避しておくためのスタック領域である。タスクスタック20も各タスクで共用される。タスクスタック20は、図3に示すように、14個のブロックに分割された記憶領域(すなわち14個のデータ記憶用ブロックを持つ記憶領域)21と、次ブロック管理領域23と、先頭ブロック管理領域24と、未使用ブロック管理領域25とを備えている。
記憶領域21の各データ記憶用ブロックには、それらブロックを識別するために0〜13のブロック番号22がそれぞれ付されている。ブロック0〜ブロック13には、共有スタック10から退避されるデータが適宜分割して記憶される。
次ブロック管理領域23は、データ記憶用ブロックの各々についてその次ブロックとして関連付けられているブロックの番号を示す領域である。図3の初期状態では、ブロック0〜13の次ブロック管理領域23には、1、2、3、・・・・、13、FFの制御コードがそれぞれ付されている。
ブロック0について見ると、その次ブロック管理領域23に「1」という値が付されているが、これはブロック0に続いてブロック1が存在していることを示す。同様に、ブロック1〜12の次ブロック管理領域23に付されている「2」〜「13」の値は、ブロック1〜12に続いてブロック2〜13がそれぞれ存在していることを示す。ブロック13の次ブロック管理領域23には「FF」の値が付されているが、これはブロック13がタスクスタック20の記憶領域21中の最終ブロックであり、それ以上に記憶領域は存在しないことを示すものである。
先頭ブロック管理領域24は、使用中の(すなわち退避データが記憶されている)一連のブロックの先頭ブロックを管理する領域であり、退避されたデータが記憶されているデータ記憶用ブロックの先頭を示す先頭ブロックポインタ24aと、退避されたデータに対応するタスクを識別するためのタスクID(タスク番号)を表示するタスクID表示部24bとを有する。先頭ブロックポインタ24aとタスクID表示部24bの総数は、同時に起動できる最大タスク数に応じてそれぞれ変化する。例えば、本実施形態に係るスタック管理装置が同時に起動するタスク数が最大4個のコンピュータ・システムで使用される場合には、図3に示すように、3個の先頭ブロックポインタ24aが用意され、それらに先頭ブロックポインタ番号「0」、「1」、「2」が順に付される。また、3個の先頭ブロックポインタ24aに対応して、3個のタスクID表示部24bが用意される。図3の初期状態では、各先頭ブロックポインタ24aに「FF」が表示され、各タスクID表示部24bに「Task ID」が表示されている。これらは、いずれも退避しているタスクが存在しないことを示す。
未使用ブロック管理領域25は、未使用の(すなわち退避データが記憶されていない)データ記憶用ブロックを管理するための領域であり、一連の未使用ブロックの先頭のブロック番号を表示する。図3の初期状態では「0」が表示されており、未使用ブロックの先頭がブロック0であることを示している。
共有スタック10とタスクスタック20は、実際には、コンピュータ・システムの主記憶領域を構成するメモリ(RAM)上に形成されるのが通常であるが、それ以外のデータ記憶領域にも形成可能であることは言うまでもない。
(スタック管理装置の動作)
次に、以上の構成を持つスタック管理装置の動作について、図2に示したフローチャートと図4〜図10に示した概念図を参照しながら説明する。
(タスク中断時の動作)
最初に、同時に起動可能なタスク数が最大4個のコンピュータ・システムにおいて、図4に示す状態で共有スタック10の記憶領域11を使用しながら実行中のタスク1を中断する場合の動作について説明する。実行可能な他のタスクは、タスク2、タスク3、タスク4であるとする。
このようなタスク1の実行を中断する場合、最初に、中断後にタスク1がその実行を再開するために必要なデータ(共通スタック10の記憶内容、図示しないレジスタのアドレス・内容等)を退避するのに必要な記憶容量を計算する。ここでは、共通スタック10に設けられたスタックポインタ12を用いて計算する(図2のステップS1)。
実行中のタスク1は共有スタック10の記憶領域11を使用しているが、その時の記憶領域11の使用部分の最終アドレスは、スタックポインタ11によって知ることができる。よって、この時にタスクスタック20に必要な記憶容量(共有スタック10からのデータ退避量)は、現在のスタックポインタ12の値を用いて容易に計算することが可能である。
次に、タスクスタック20の記憶領域21の各データ記憶用ブロックの長さ(ブロック長すなわち、1ブロックに記憶できるデータ量)を考慮し、共有スタック10からの退避データを記憶するのに必要な当該ブロックの総数を算出する(図2のステップS2)。すなわち、ステップS1で得た必要記憶容量をデータ記憶用ブロックのブロック長で割ることにより、必要なブロック数を算出するのである。ここでは、演算の結果、タスクスタック20にブロック3個分の記憶容量が必要と判定した、と仮定する。
次に、共有スタック10からの退避データ全体をタスクスタック20中に安全に記憶することができるか否かを判定するため、退避データ全体を記憶するのに必要と判定されたデータ記憶用ブロックの総数が、未使用として現存しているデータ記憶用ブロックの総数よりも大きいか否かを判定する(図2のステップS3)。その判定結果がYESであれば、タスクスタック20の記憶可能容量を超えるから、「タスクスタック容量オーバー」のエラー処理へ進む(図2のステップS12)。ステップS3での判定結果がNOであれば、ステップS4に進み、未使用領域があるか否かを判定する(図2のステップS4)。ここでは、先頭ブロック管理領域24に未使用領域があると表示されているか否かを調べることにより、これを判定する。
ステップS4での判定結果がNOであれば、同時に起動できる最大タスク数を越えるから、「同時に起動できるタスク数オーバー」のエラー処理に進む(図2のステップS13)。その判定結果がYESであれば、ステップS5に進む。
ここでは、図3に示すように、タスクスタック20中に退避データが未だ存在していないから、未使用ブロックが14個ある。従って、ステップS3ではタスクスタック20の記憶容量にはまだ余裕があると判定し、ステップS4に進む。また、図3に示すように、先頭ブロック管理領域24に未使用領域があると表示されているから、ステップS4では当該データを安全にタスクスタック20中に退避することが可能であると判定し、ステップS5に進む。
RTOS50は、タスクスタック20に未使用のブロックが14個残っていることを次のようにして認識する。すなわち、RTOS50はまず、未使用ブロック管理領域25に表示されるブロック番号「0」を読み取り、未使用ブロックの先頭はブロック0であることを認識する。次に、ブロック0から次ブロック管理領域25の検索を開始し、次ブロック管理領域25に終了ブロックを示す制御コード「FF」が格納されているブロック番号(つまり13)が現れると、検索を終了する。こうしてその時に存在する未使用ブロックの総数をカウントし、未使用のブロックが14個あることを認識するのである(図4(a)を参照)。
RTOS50はまた、先頭ブロック管理領域24に表示されている値を読み取り、3個の先頭ブロックポインタ24aが表示する値はいずれも「FF」であり、タスクID表示部24bの値はいずれも「TaskID」であることを認識する。この「TaskID」は、対応するタスクが存在しないことを意味するから、RTOS50は、同時に起動できる最大タスク数(=4)をオーバーしていない、と判断する。その結果、14個の未使用ブロックに対して3ブロック分のデータを共有スタック10から退避することになるから、タスクスタック20には当該データを安全に退避できる、と判定し、次のステップS5へ進むのである。
続いて、図5(a)に示すように、共有スタック10の記憶領域11に記憶されている全データのうちの1ブロック分(ここでは、記憶領域11の最下段のラインに記憶されたデータ)を、記憶領域21のブロック0にコピーすることにより、タスクスタック20に退避させる(図2のステップS5)。そして、図5(b)に示すように、先頭ブロック管理領域24の先頭ブロックポインタ24aの一つ(先頭ブロックポインタ番号:0)を、未使用ブロック管理領域25の値「0」で更新し、さらに、同領域24の対応するタスクID表示部24bに「タスク1」を設定する(図2のステップS6)。
次に、図2のステップS7では、共有スタック10中の全データの退避が完了したか否かを判定する。ここでは、全データの退避は完了していないので、ステップS5の直前に戻り、ステップS5〜S7を繰り返す。すなわち、図6(a)に示すように、共有スタック10の記憶領域11に残っているデータのうちの1ブロック分(ここでは、記憶領域11の最下段より一つ上のラインに記憶されたデータ)を、記憶領域21のブロック1にコピーすることにより、タスクスタック20に退避させる。さらに、図6(b)に示すように、共有スタック10の記憶領域11に残っているデータのうちの最後の1ブロック分(ここでは、記憶領域11の最下段より二つ上のラインに記憶されたデータ)を、記憶領域21のブロック2にコピーすることにより、タスクスタック20に退避させる。
そして、ブロック2にコピー(退避)したデータが最後であることを識別できるように、図6(c)に示すように、ブロック2の次ブロック管理領域23bに、終了ブロックを示す制御コード「FF」を書き込む。さらに、ブロック0〜ブロック2が使用中であり、ブロック3〜ブロック13が未使用であることを示すために、図6(d)に示すように、未使用ブロック管理領域25の値を「0」から「3」に更新する。
以上のようにして、タスク1の実行中に共有スタック10内に記憶されていたデータ全体が、タスクスタック20の記憶領域21のブロック0とブロック1とブロック2にこの順に退避される。この時の状態は、タスクスタック20の各部分の状態は、図6に示すようになり、ブロック3→ブロック4→ブロック5→・・・・→ブロック13が未使用で残っている。なお、共有スタック10の記憶領域11は、実行中の他のタスク(例えばタスク2)や割り込み処理によって使用されるから、タスク1の実行中に共有スタック10内に記憶されていたデータは他のデータに書き換えられて消滅する。
上述したように、本実施形態のスタック管理装置では、図2のステップS3において、退避データ全体を記憶するのに必要と判定されたデータ記憶用ブロックの総数が、未使用として現存しているデータ記憶用ブロックの総数よりも大きいと判定されると、タスクスタック20の記憶可能容量を超えるから、「タスクスタック容量オーバー」のエラー処理へ進むようになっている(ステップS12)。また、ステップS4において、先頭ブロック管理領域24に未使用領域があると表示されていないと判定されると、同時に起動できる最大タスク数を越えるから、「同時に起動できるタスク数オーバー」のエラー処理に進むようになっている(ステップS13)。このような場合、従来のスタック管理装置では、プログラムの暴走を避けるために当該コンピュータ・システムを停止せざるを得ない場合が多かった。しかし、本実施形態のスタック管理装置では、共有スタック10中のデータを退避する前にタスクスタック20の使用状況を確認し、使用状況が適当でない場合には「タスクスタック容量オーバー」のエラー処理あるいは「タスク数オーバー」のエラー処理を実行するようにしているため、これらエラー処理の内容を適宜設定することにより、コンピュータ・システムの停止を避けることが可能となる、という利点がある。また、ユーザの希望に応じてそれらエラー処理の内容を設定することにより、ユーザの希望に応じた対応が選択できるという利点もある。
さらに、上述した本実施形態のスタック管理方法では、タスクスタック20の残存記憶容量を確認するために、図4(a)で示したように、未使用ブロック管理領域25の値(図4では「0」)に基づいて、ブロック0〜ブロック13の次ブロック管理領域23の値を順に検索している。このため、共有スタック10のデータ退避前に、未使用(残存)ブロックの総数を容易かつ確実に知ることができる、という利点がある。
(タスク再開時の動作)
続いて、同時に起動するタスク数が最大4個の上述したコンピュータ・システムにおいて、図7に示す状態でタスクタック20の記憶領域21を使用しながらタスク1とタスク2が実行を中断している場合に、タスク1の実行を再開する場合の動作について説明する。
まず最初に、中断中のタスクを復帰させるか否かを判断する(図2のステップS8)。その判断結果がNOの場合は直ちに処理を終了する。ここでは、その判断結果がYESであるから、タスク1に係るデータを1ブロック分タスクスタックから共有スタックへコピーして復帰させる(図2のステップS9)。すると、当該ブロックは未使用となるので、当該ブロックに対応する次ブロック管理領域23の値を未使用ブロック管理領域25の値に更新する(図2のステップS10)。このタスクスタックから共有スタックへ1ブロック分のデータのコピーと、コピーしたブロックに対応する次ブロック管理領域23の値の更新は、再開するタスク1に係るタスクタック20内の全データが復帰するまで(図2のステップS11)繰り返される。そして、再開するタスク1に係る退避データ全体のコピーが完了すると、未使用ブロック管理領域25の値を更新すると共に、タスク1で使用していた先頭ブロックポインタ24aを「FF」で更新し、当該先頭ブロックポインタ24aを開放する。こうして動作を終了する。
この動作を図8〜図10に基づいて説明すると、次の通りである。
RTOS50は、最初に、図8(a)に示すように、先頭ブロック管理領域24においてタスク1が使用している先頭ブロックポインタ24aの値「0」を読み取り、タスク1の退避データが格納されているタスクタック20の記憶領域21の先頭ブロックが「ブロック0」であることを認識する。そこで、続いて、図8(b)に示すように、ブロック0に格納されている退避データを共有スタック10の記憶領域11(最下段の記憶部13)にコピーして復帰させる(ステップS9)。そして、ブロック0に係る次ブロック管理領域23の値「1」を読み取ることにより、ブロック0のデータの続きがブロック1に続いていることを認識する。そこで、図9(a)に示すように、ブロック1に格納されている退避データを共有スタック10の記憶領域11(最下段より一つ上の記憶部13)にコピーする。また、図9(b)に示すように、ブロック0に係る次ブロック管理領域23の値「1」を、その直前の未使用ブロック管理領域25の値「5」に更新する。そして、未使用ブロック管理領域25の値は「0」に更新する。
次に、RTOS50は、ブロック1に係る次ブロック管理領域23の値「2」を読み取ることにより、ブロック1のデータの続きがブロック2に続いていることが判るので、図9(c)に示すように、ブロック2に格納されている退避データを共有スタック10の記憶領域11(最下段より二つ上の記憶部13)にコピーする。そして、ブロック1に対応する次ブロック管理領域23の値「2」を未使用ブロック管理領域25の値「0」に更新する。そして、未使用ブロック管理領域25の値は「1」に更新される。
この時、RTOS50は、ブロック2に対応する次ブロック管理領域23の値「FF」を読み取ることにより、ブロック2が最終ブロックであることが判るから、ブロック2に格納されている退避データを共有スタック10の記憶領域11にコピーする動作を終了すると、全データの復帰が終了したと判断する。そして、この時にはブロック0とブロック1に加えてブロック2も未使用となるので、図10(a)に示すように、ブロック2に対応する次ブロック管理領域23の値を未使用ブロック管理領域25の値「2」に更新する。また、図10(b)に示すように、タスク1が使用していた先頭ブロックポインタ24aを開放する。
こうしてタスク1の退避データ全体の共有スタック10への復帰が完了した時には、ブロック0〜ブロック2が未使用(ブロック3とブロック4は未だタスク2に係る退避データが使用中)となるので、この時のタスクスタック20内の全未使用ブロックは、ブロック2→ブロック1→ブロック0→ブロック5→ブロック6→・・・・→ブロック13となる。図10では、この状態を反映して、ブロック0の次ブロック管理領域23の値が「1」とされ、ブロック2の次ブロック管理領域23の値が「1」とされ、ブロック1の次ブロック管理領域23の値が「0」とされ、ブロック0の次ブロック管理領域23の値が「5」とされている。未使用ブロックの先頭ブロック番号を示す未使用ブロック管理領域25の値は「2」とされている。先頭ブロック管理領域24では、タスク2に係る退避データを保存していることを示すために、先頭ブロックポインタ24aの値は「3」に設定され、タスクID表示部24bは「タスク2」に設定されている。
以上詳述したところから明らかなように、本発明の上記実施形態のスタック管理装置では、中断中の全タスクで共用するタスクスタック20を設け、タスクスタック20の記憶領域21を所定のブロック長を持つ複数のブロックから構成して、共有スタック10に記憶されているデータを前記ブロックに分けて記憶するようにしている。そして、共有スタック10中のデータを必要に応じてタスクスタック20に退避させ、またタスクスタック20に記憶されている退避データを必要に応じて共有スタック10に復帰できるようにしている。このため、新しくタスクを追加する場合であっても、そのタスク追加によってスタック構成が大きく変化しない限り、スタックの総容量を増加する必要がない。また、同時に動作するタスクの数が増加した場合であっても、より少ないRAMで対応が可能である。
また、タスクスタック20の記憶領域21を所定のブロック長を持つ複数のブロックに分割し、ブロック単位でデータの退避・復帰を可能にしたので、ブロック長をユーザ側で任意に設定可能とすることにより、本実施形態のスタック管理装置が適用されるシステムやデバイスに応じて、最適なブロック長を設定できる。
また、最初から一定量のスタックを確保するのではなく、実行中のタスクを中断する毎に必要なスタック量を計算して確保するため、従来例に関して図13で示したようなスタックの無駄が生じない。その結果、高いスタック利用効率が得られる。
さらに、ステップS3において、退避データ全体を記憶するのに必要と判定されたデータ記憶用ブロックの総数が、未使用として現存しているデータ記憶用ブロックの総数よりも大きいか否かを判定し、その判定結果がYESであれば、「タスクスタック容量オーバー」のエラー処理へ進むようにしている(ステップS12)。そして、ステップS4において、先頭ブロック管理領域24に未使用領域があると表示されているか否かを判定し、その判定結果がNOであれば、「タスク数オーバー」のエラー処理に進むようにしている(ステップS13)。よって、タスクスタック20の残存記憶容量が必要量に対して不足する場合にも、それに起因して実際にエラーが発生する前に、「タスクスタック容量オーバー」のエラー処理あるいは「タスク数オーバー」のエラー処理においてプログラムの実行を停止しないよう対策を採ることができるので、プログラムの実行が可能となる。また、このようなエラーが生じる場合の対応は、ユーザ側で任意に設定することが可能である。
例えば、(i)タスク切り替えによって上記のようなエラーが生じることが判った場合、現在実行中のタスク(例えばタスク1)を中断せずにそのまま継続して実行させることができる。これは、実行中のタスクを中断しようとしても、「タスクスタック容量オーバー」あるいは「タスク数オーバー」となるために中断ができないのであるから、タスクの切り替え処理を行わず、現在実行中のタスクをそのまま継続する、という対応を行うものである。あるいは、(ii)タスク切り替えによって上記のようなエラーが生じることが判った場合、既に中断状態にあるいくつかのタスクのうち任意のタスク(好ましくは優先順位の低い一つあるいは二つ以上のタスク)の起動を中止することによってタスクスタック20の記憶領域21を空け、その空いた部分を用いて現在実行中のタスク(例えばタスク1)の退避データを保存させるようにすることも可能である。この場合、現在実行中のタスク(例えばタスク1)は中断されるが、既に中断状態にあった特定のタスクの起動を中止するので、中止したタスクに対応する機能が削減されることになる。なお、(i)(ii)のような対応は、従来のスタック管理装置では不可能であり、本発明によって初めて可能となったものである。
タスク切り替えによって上記のようなエラーが生じることが判った場合に、(iii)システムの停止処理を行ってから当該システムを再起動させることもできる。(iii)のような対応は、従来のスタック管理装置でも可能ではあったが、従来のスタック管理装置では上記のようなエラーが実際に生じてからユーザに対応を迫るものであった。これに対し、本発明では、上記のようなエラーが実際に生じる前にそれを検知し、ユーザに対応を問い合わせるものであるから、この点で両者は異なる。
さらに、スタックポインタ12を使用して共有スタック10の使用量を必要時に認識でき、また、図4(a)に示した手法で未使用ブロック管理領域25を検索することにより、タスクスタック20の使用量を必要時に認識できるので、スタック容量を必要に応じて必要なだけ確保できるという効果もある。
本発明の上記実施形態に係るスタック管理装置と、図12と図13に示した従来のスタック管理装置の効果の差異を具体例で説明すると、次のようになる。
delay命令を含むタスク数が50、同時に起動可能なタスク数がn、一つのタスクで使用されるスタックの容量(タスク毎のスタック容量)が64バイトとすると、従来のスタック管理装置で必要とされる総スタック容量Mは、
M=総タスク数×タスク毎のスタック容量=50×64=3200(バイト)
である。これは、この従来のスタック管理装置では、delay命令を含むタスク毎にRTOSスタック200が設けられるからである。
これに対し、本発明の上記実施形態に係るスタック管理装置で必要とされる総スタック容量Mは、タスクスタック20の記憶領域21のブロック長が16バイト、タスクスタック制御用RAMの容量が29バイトであるとすると、
M=(n−1)×ブロック長×ブロック数+タスクスタック制御用RAMの容量=(n−1)×16×(64/16)+29=(n−1)×64+29(バイト)
である。n=5であればM=285(バイト)となる。ただし、ブロック数の計算は(タスク毎のスタック容量/ブロック長)で行い、小数点以下を切り上げる。
このように、本発明の上記実施形態に係るスタック管理装置によれば、総スタック容量Mを大幅に減少できることが分かる。
なお、「タスクスタック制御用RAMの容量」とは、タスクスタック20の制御に必要なデータ、すなわち次ブロック管理領域23や先頭ブロック管理領域24、未使用ブロック管理領域25に係るデータを記憶するためのRAMの容量である。
(変形例)
上述した実施形態は本発明を具体化した例を示すものである。したがって、本発明はこの実施形態に限定されるものではなく、本発明の趣旨を外れることなく種々の変形が可能であることは言うまでもない。例えば、上記実施形態では、スタックポインタ12を使用して共有スタック10の記憶領域11の使用量を判断しているが、次のような方法も考えられる。
すなわち、図11に示すように、共有スタック10の記憶領域11を適当な記憶容量(例えば16バイト)毎に分けて複数の記憶部(記憶ライン)13を形成する。同一ラインの記憶部13の各々には、チェックデータ格納部14を形成する。そして、タスクが起動される毎に、各ラインの記憶部13に00、01、02、・・・・、0D、0E、10、11、・・・・・のように順に異なる値を設定していくと共に、各ラインのチェックデータ格納部14にはチェックデータを初期値として格納する。チェックデータとしては、例えば、各ラインの記憶部13に設定された値(x0、x1、x2、・・・・、xD、xE)の和(x0+x1+x2+・・・・+xD+xE)の反転値を設定することができる。その結果、必要に応じて各ラインの記憶部13のチェックデータの値を確認することにより、その値が初期値から変化していれば当該ラインの記憶部13の1バイト目〜15バイト目までのいずれかの値が変化していることを意味するから、当該ラインの記憶部13はいずれかのタスクによって使用中である、と判定できる。他方、各ラインの記憶部13のチェックデータの値が変化していなければ、当該ラインの記憶部13は未使用である、と判定することができる。このような方法によっても、タスクが使用中の共有スタック10のスタック量を確認することができる。
また、未使用ブロック管理領域25と先頭ブロック管理領域24と次ブロック管理領域23の構成も上記実施形態に示されたものに限定されず、任意に変更することが可能である。
本発明の一実施形態に係るスタック管理装置の全体構成を示す概念図である。 図1に示した本発明の実施形態に係るスタック管理装置の動作を示すフローチャートである。 図1に示した本発明の実施形態に係るスタック管理装置で使用されるタスクスタックの構成の詳細を示す概念図である。 図1に示した本発明の実施形態に係るスタック管理装置において、タスク中断時のタスクスタックの動作を示す概念図である。 図1に示した本発明の実施形態に係るスタック管理装置において、タスク中断時のタスクスタックの動作を示す概念図で、図4の続きである。 図1に示した本発明の実施形態に係るスタック管理装置において、タスク中断時のタスクスタックの動作を示す概念図で、図5の続きである。 図1に示した本発明の実施形態に係るスタック管理装置において、タスク復帰時のタスクスタックの動作を示す概念図である。 図1に示した本発明の実施形態に係るスタック管理装置において、タスク復帰時のタスクスタックの動作を示す概念図で、図7の続きである。 図1に示した本発明の実施形態に係るスタック管理装置において、タスク復帰時のタスクスタックの動作を示す概念図で、図8の続きである。 図1に示した本発明の実施形態に係るスタック管理装置において、タスク復帰時のタスクスタックの動作を示す概念図で、図9の続きである。 図1に示した本発明の実施形態に係るスタック管理装置で使用される共有スタックの変形例の詳細構成を示す概念図である。 RTOSスタックを利用した従来のスタック管理装置で使用されるスタックの全体構成を示す概念図である。 図12の従来のスタック管理装置におけるスタック確保の方法を示す概念図である。
符号の説明
10 共有スタック
11 共有スタックの記憶領域
12 共有スタックのスタックポインタ
13 共有スタックの同一ラインの記憶部
14 共有スタックのチェックデータ格納部
20 タスクスタック
21 タスクスタックの記憶領域
22 タスクスタックの記憶領域のブロック番号
23 タスクスタックの次ブロック管理領域
24 タスクスタックの先頭ブロック管理領域
24a 先頭ブロック管理領域の先頭ブロックポインタ
24b 先頭ブロック管理領域のタスクID表示部
25 タスクスタックの未使用ブロック管理領域

Claims (18)

  1. 実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、
    前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにし、
    前記データが記憶されていない未使用の前記ブロックを未使用ブロック管理領域で管理し、
    あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを使用ブロック管理領域で管理し、
    一つの前記ブロックとそれに続く一つの前記ブロックとの関連を次ブロック管理領域で管理し、
    あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
    前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰することを特徴とするスタック管理方法。
  2. 複数の前記ブロックに一連のブロック番号を付し、前記未使用ブロック管理領域によって未使用の前記ブロックの前記ブロック番号を管理する請求項1に記載のスタック管理方法。
  3. 複数の前記ブロックに一連のブロック番号を付し、前記使用ブロック管理領域によって、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する請求項1に記載のスタック管理方法。
  4. 複数の前記ブロックに一連のブロック番号を付し、前記次ブロック管理領域によって一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する請求項1に記載のスタック管理方法。
  5. 前記共有スタックに記憶されている前記データの量を、前記共有スタックのスタックポインタによって認識する請求項1〜4のいずれか1項に記載のスタック管理方法。
  6. 前記共有スタックの記憶領域を所定の記憶容量を持つ複数の記憶部に分けると共に、各記憶部にチェックデータ格納部を設け、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納する請求項1〜4のいずれか1項に記載のスタック管理方法。
  7. 実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして機能する、中断中の全タスクが共用可能なタスクスタックであって、その記憶領域は所定のブロック長を持つ複数のブロックから構成されていて前記データを前記ブロックに分けて記憶するようになっているものと、
    前記データが記憶されていない未使用の前記ブロックを管理する未使用ブロック管理領域と、
    あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを管理する使用ブロック管理領域と、
    一つの前記ブロックとそれに続く一つの前記ブロックとの関連を管理する次ブロック管理領域とを備え、
    あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
    前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰することを特徴とするスタック管理装置。
  8. 複数の前記ブロックに一連のブロック番号を付してあり、前記未使用ブロック管理領域によって未使用の前記ブロックの前記ブロック番号を管理する請求項7に記載のスタック管理装置。
  9. 複数の前記ブロックに一連のブロック番号を付してあり、前記使用ブロック管理領域によって、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する請求項7に記載のスタック管理装置。
  10. 複数の前記ブロックに一連のブロック番号を付してあり、前記次ブロック管理領域によって一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する請求項7に記載のスタック管理装置。
  11. 前記共有スタックに記憶されている前記データの量を、前記共有スタックのスタックポインタによって認識する請求項7〜10のいずれか1項に記載のスタック管理装置。
  12. 前記共有スタックの記憶領域を所定の記憶容量を持つ複数の記憶部に分けると共に、各記憶部にチェックデータ格納部を設け、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納する請求項7〜10のいずれか1項に記載のスタック管理装置。
  13. 実行中のタスクを中断する際に共有スタックに記憶されているデータを退避するためのスタックとして、中断中の全タスクが共用可能なタスクスタックを設け、
    前記タスクスタックの記憶領域を所定のブロック長を持つ複数のブロックから構成して、前記データを前記ブロックに分けて記憶するようにし、
    前記データが記憶されていない未使用の前記ブロックを未使用ブロック管理領域で管理し、
    あるタスク用の前記データが記憶された使用中の前記ブロックの識別データと当該タスク用の識別データとを使用ブロック管理領域で管理し、
    一つの前記ブロックとそれに続く一つの前記ブロックとの関連を次ブロック管理領域で管理し、
    あるタスクの実行を中断するために前記共有スタックに記憶されているデータを前記タスクスタックに退避する際には、前記未使用ブロック管理領域を用いて、前記共有スタックに記憶されている前記データの量に応じて未使用の前記ブロックを選択して記憶させると共に、当該タスク用の前記データが記憶された前記ブロックの識別データと当該タスク用の識別データとを前記使用ブロック管理領域に記憶させ、
    前記タスクスタックに退避された前記データを前記共有スタックに復帰する際には、前記使用ブロック管理領域に記憶されている前記ブロックの識別データと前記タスク用の識別データとを用いて、前記データを前記共有スタックに復帰する
    というステップをコンピュータに実行させることを特徴とするスタック管理プログラム。
  14. 複数の前記ブロックに一連のブロック番号を付し、前記未使用ブロック管理領域によって未使用の前記ブロックの前記ブロック番号を管理する請求項13に記載のスタック管理プログラム。
  15. 複数の前記ブロックに一連のブロック番号を付し、前記使用ブロック管理領域によって、使用中の前記ブロックの識別データとして先頭の前記ブロックに係る前記ブロック番号を管理する請求項13に記載のスタック管理プログラム。
  16. 複数の前記ブロックに一連のブロック番号を付し、前記次ブロック管理領域によって一つの前記ブロックに関連のある他の一つの前記ブロックに係る前記ブロック番号を管理する請求項13に記載のスタック管理プログラム。
  17. 前記共有スタックに記憶されている前記データの量を、前記共有スタックのスタックポインタによって認識する請求項13〜16のいずれか1項に記載のスタック管理プログラム。
  18. 前記共有スタックの記憶領域を所定の記憶容量を持つ複数の記憶部に分けると共に、各記憶部にチェックデータ格納部を設け、タスクを起動する毎に、前記記憶部の各々に所定値を記憶すると共に前記チェックデータ格納部に所定のチェックデータを格納する請求項13〜16のいずれか1項に記載のスタック管理プログラム。
JP2003301136A 2003-08-26 2003-08-26 スタック管理方法及び装置並びにスタック管理プログラム Withdrawn JP2005071141A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2003301136A JP2005071141A (ja) 2003-08-26 2003-08-26 スタック管理方法及び装置並びにスタック管理プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2003301136A JP2005071141A (ja) 2003-08-26 2003-08-26 スタック管理方法及び装置並びにスタック管理プログラム

Publications (1)

Publication Number Publication Date
JP2005071141A true JP2005071141A (ja) 2005-03-17

Family

ID=34405846

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2003301136A Withdrawn JP2005071141A (ja) 2003-08-26 2003-08-26 スタック管理方法及び装置並びにスタック管理プログラム

Country Status (1)

Country Link
JP (1) JP2005071141A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008310695A (ja) * 2007-06-15 2008-12-25 Ntt Docomo Inc 移動通信端末
US8478956B2 (en) 2009-11-13 2013-07-02 Samsung Electronics Co., Ltd. Computing system and method controlling memory of computing system
US9448844B2 (en) 2009-11-13 2016-09-20 Samsung Electronics Co., Ltd. Computing system and method controlling memory of computing system
WO2024050965A1 (zh) * 2022-09-08 2024-03-14 深圳市正浩创新科技股份有限公司 任务执行方法、计算机可读介质及电子设备

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008310695A (ja) * 2007-06-15 2008-12-25 Ntt Docomo Inc 移動通信端末
US8478956B2 (en) 2009-11-13 2013-07-02 Samsung Electronics Co., Ltd. Computing system and method controlling memory of computing system
US9448844B2 (en) 2009-11-13 2016-09-20 Samsung Electronics Co., Ltd. Computing system and method controlling memory of computing system
WO2024050965A1 (zh) * 2022-09-08 2024-03-14 深圳市正浩创新科技股份有限公司 任务执行方法、计算机可读介质及电子设备

Similar Documents

Publication Publication Date Title
KR101782313B1 (ko) 예외 이벤트 처리 장치 및 방법
JP5405320B2 (ja) 仮想計算機制御装置、仮想計算機制御方法及び仮想計算機制御プログラム
US9798595B2 (en) Transparent user mode scheduling on traditional threading systems
JP4170364B2 (ja) プロセッサ
JP2005071141A (ja) スタック管理方法及び装置並びにスタック管理プログラム
JP2001256062A (ja) 割込処理方法およびその方法を用いた演算処理装置
JP2001290704A (ja) マルチプロセス制御装置及びマルチプロセス制御方法
JPH1139171A (ja) マルチタスク処理装置、マルチタスク処理制御方法及び制御プログラム記憶媒体
EP3428799A1 (en) Data access device and access error notification method
JPH0668725B2 (ja) データ処理システムにおける割込条件に応答する装置及び非同期割込条件に応答する方法
JP3726701B2 (ja) カーネル空間のデマンドページング・スワップアウト方式および方法
KR960014825B1 (ko) 정보처리시스템
JP2723847B2 (ja) マイクロプロセッサ
JPH08249201A (ja) データ処理装置
JPH0836553A (ja) マルチプロセッサシステムおよび同システムにおけるタスクスケジューリング方法
KR100489044B1 (ko) 복수 패키지 관리 방법
JP2006065658A (ja) 並列計算機システムおよびジョブ投入方法
JP2000163309A (ja) メモリ管理方法およびメモリ管理装置、並びに記録媒体
JP4116752B2 (ja) 計算機とその制御方法
JPH07230358A (ja) 多重化ボリューム装置
CN114741237A (zh) 一种任务切换方法、装置、设备及存储介质
JPS58142451A (ja) 割込制御方式
JPH01266640A (ja) 二重化ボリュームの等価性保証処理方式
JPH02245828A (ja) 実行中ジョブの凍結・再開装置
JPH11134202A (ja) タスク切替え装置

Legal Events

Date Code Title Description
A761 Written withdrawal of application

Free format text: JAPANESE INTERMEDIATE CODE: A761

Effective date: 20060524