(57)【要約】【課題】マルチタスクシステムにおいて、メイン関数からサブ関数を呼び出す場合のようにタスク処理途中で通信する可能性がある場合や同時に起動する可能性のあるタスク間での処理においても、タスクスタック領域の共用化が行え、システム全体でメモリ使用量を削減できるようにする。【解決手段】タスクＴ１内のメイン関数ｆ１からサブ関数ｆ２を呼び出すに際して、タスクＴ１専用の実行環境スタックＳＴ１における現在のタスク実行環境情報をコンテキスト退避領域Ｂ１に退避させ、実行環境テーブルＡ０からサブ関数の実行環境情報を関数用実行環境スタックＳＰｆにストアした上でサブ関数を呼び出し、サブ関数から処理が戻ってきた直後に、コンテキスト退避領域Ｂ１に退避させておいたタスク実行環境情報をタスク専用の実行環境スタックＳＴ１にストアさせ、メイン関数ｆ１にリターンする。【選択図】図１
2007257257.tif 000002
【特許請求の範囲】
【請求項１】
マルチタスクＯＳにおいて、タスク内のメイン関数からサブ関数を呼び出すに際して、タスク専用の実行環境スタックにおける現在のタスク実行環境情報をコンテキスト退避領域に退避させる第１のステップと、
実行環境テーブルから前記サブ関数の実行環境情報を関数用実行環境スタックにストアさせる第２のステップと、
前記サブ関数を呼び出す第３のステップと、
前記サブ関数から処理が戻ってきたときに、前記第１のステップで前記コンテキスト退避領域に退避させておいた前記タスク実行環境情報を前記タスク専用の実行環境スタックタスクにストアさせる第４のステップとを備えるマルチタスクシステムにおけるタスク実行環境切替え方法。
【請求項２】
前記第２のステップの直前に、前記実行環境テーブルのタスク実行環境情報を他タスクとは排他的に使用する排他状態に移行させ、
前記第４ステップの直後に、前記排他状態を解除する請求項１に記載のタスク実行環境切替え方法。
【請求項３】
前記第１のステップにおいて、前記実行環境テーブルの各タスク実行環境情報に設けた他タスクが使用中のフラグがセットされている場合は前記タスクを待ち状態に移行させ、前記フラグがセットされていない場合に前記フラグをセットすることで前記排他状態に移行させ、
前記排他状態の解除は、前記フラグをクリアすることである請求項２に記載のタスク実行環境切替え方法。
【請求項４】
前記排他状態への移行をタスクディスパッチ禁止状態に変更することで実行し、前記排他状態の解除をタスクディスパッチ許可状態とすることで実行する請求項２に記載のタスク実行環境切替え方法。
【請求項５】
前記排他状態への移行を割り込み禁止状態に変更することで実行し、前記排他状態の解除を割り込み許可状態とすることで実行する請求項２に記載のタスク実行環境切替え方法。
【請求項６】
前記タスク実行環境はスタックレジスタであり、前記タスク実行環境情報は前記サブ関数で使用するスタック領域アドレスである請求項１から請求項５までのいずれかに記載のタスク実行環境切替え方法。
【請求項７】
前記コンテキスト退避領域は、スタック領域アドレスを指す請求項１から請求項６までのいずれかに記載のタスク実行環境切替え方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチタスクＯＳ（Operating System）のタスク実行環境情報の切替え方法にかかわり、特には、複数タスク間でのスタックメモリ共用やその他のＣＰＵ資源の排他制御を行うための技術に関する。
【背景技術】
【０００２】
図６は、従来の技術におけるマルチタスクシステムの処理方法を示すフローチャートである。これは、複数のタスクに同一スタック領域を共用させ、個々の共用スタック領域に対しては、タスクの実行開始から終了までを単位として、共用スタック領域に対するタスクの割り付けを排他的に制御するものである。この従来技術の特徴は、タスク間でのスタックメモリ共用を行う際の処理割り付けの単位を、“タスクの実行開始から終了まで”としていることである。
【０００３】
図６を用いて、従来の技術におけるマルチタスク処理システムのスタック制御の動作を説明する。
【０００４】
タスクの実行が要求されたとき、まずステップＳ４１において、スタック領域を共用する他のタスクが共用スタック領域を使用しているか否かを判定する。その結果、他のタスクが共用スタック領域を使用中でなければ、ステップＳ４２に進んで、当該タスクを実行可能にする。一方、他のタスクが共用スタック領域を使用中であれば、ステップＳ４３に進んで、当該タスクの実行可能な状態への遷移を遅延させる。これにより、共用スタック領域のメモリ利用効率を向上させることができる（例えば、特許文献１参照）。
【０００５】
特許文献１のオペレーティングシステムは、同一の優先度を有する複数のタスクに１つのスタック領域を割り当てるようなスタック管理機能を備えている。したがって、１つのスタック領域は同一優先度を持つ複数のタスクに共用される。ただし、１つのスタック領域を共通利用する複数のタスクは、それらが同時に実行されないもので、かつ、それらの実行順序が予め決定できるタスクとされる。例えば、３つのタスクＡ，ＢおよびＣに１つのスタック領域を共用させる場合、タスクＡの実行終了後にタスクＢが実行され、タスクＢの実行終了後にタスクＣが実行されるといった具合である。つまり、共用スタック領域は、排他的に実行される１つのタスクのみに割り付けられる。また、１つのタスクに対して１つのスタック領域を専用として割り当てることも可能となっている。例えば、１０個のタスクを管理するとき、ＯＳは、２つのタスクにそれぞれ専用のスタック領域を割り当て、ある同一の優先度を有する４つのタスクに１つの共用スタック領域を割り当て、他の同一の優先度を有する４つのタスクに１つの共用スタック領域を割り当てる。結果的に、タスクは１０個あるのに対して、全スタック領域の数は４つとされる。したがって、タスクの総数がｎ個（ｎは正の整数）に対して、スタック領域の総数ｍ（ｍは正の整数）を、ｍ＜ｎとして、ＲＡＭ（Random Access Memory）の全メモリ容量に対する全スタック領域の割合を低減することができる。その結果、内蔵ＲＡＭの記憶容量が制限されるシングルチップコンピュータでもマルチタスクのＯＳプログラムを搭載することが可能となる。
【特許文献１】特開平６−１６８１４５号公報（第３−４頁、第１図）
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかし、上記従来の技術にあっては、複数タスク間でのスタックメモリ共用を行う際の処理割り付けの単位を、タスクの実行開始から終了までとしているために、次のような課題がある。例えば、メイン関数からサブ関数を呼び出す場合のようにタスク処理途中で通信する可能性がある場合や、同時に起動する可能性のあるタスク間での処理の場合に対して、タスクスタック領域の共用が行えない。このような場合、他タスクの処理とは排他的な処理に使用するスタックについては、これを個別に確保する必要があり、メモリを削減することができない。
【０００７】
本発明は、このような事情に鑑みて創作したものであり、メイン関数からサブ関数を呼び出す場合のようにタスク処理途中で通信する可能性がある場合や同時に起動する可能性のあるタスク間での処理の場合においても、タスクスタック領域の共用が行え、システム全体でメモリ使用量を削減できるようにすることを目的としている。
【課題を解決するための手段】
【０００８】
本発明によるマルチタスクシステムにおけるタスク実行環境切替え方法は、
マルチタスクＯＳにおいて、タスク内のメイン関数からサブ関数を呼び出すに際して、タスク専用の実行環境スタックにおける現在のタスク実行環境情報をコンテキスト退避領域に退避させる第１のステップと、
実行環境テーブルから前記サブ関数の実行環境情報を関数用実行環境スタックにストアさせる第２のステップと、
前記サブ関数を呼び出す第３のステップと、
前記サブ関数から処理が戻ってきたときに、前記第１のステップで前記コンテキスト退避領域に退避させておいた前記タスク実行環境情報を前記タスク専用の実行環境スタックタスクにストアさせる第４のステップとを備えるものである。
【０００９】
これは、関数の開始から終了までを１つの単位として複数タスク間でのスタック領域を共用するものである。この点において、従来の技術の場合の、タスクの実行開始から終了までを単位としてスタック領域を共用するものと相違する。すなわち、タスク単位より細かい関数単位でタスク間のスタック共用を行うことが特徴である。
【００１０】
具体的には、ＯＳが管理する各タスクごとに専用の実行環境スタックが割り当てられる一方、関数の開始から終了までを１つの単位として共用の関数用実行環境スタックが割り当てられている。サブ関数の呼び出し要求があったときに、共用の関数用実行環境スタックが使用中か判断し、使用中の場合はタスクを実行待ち状態に移行させ、使用中で無い場合は現在のタスク実行環境情報をコンテキスト退避領域へ退避させ、サブ関数に割り当てられた共用の関数用実行環境スタックを使用中にし、サブ関数の実行環境情報を関数用実行環境スタックに代入し、それを用いてサブ関数を呼び出す。サブ関数から処理が戻ってきたときに、退避させておいたタスク実行環境情報をタスク専用の実行環境スタックに代入し、サブ関数呼び出し直前のタスク実行環境情報へ戻す。
【００１１】
以上の結果、本発明によれば、タスク処理途中で通信する可能性がある場合や同時に起動する可能性のあるタスク間においても、スタック領域の共用化が行え、システム全体でメモリ使用量を削減することができる。
【００１２】
上記において、前記第２のステップの直前に、前記実行環境テーブルのタスク実行環境情報を他タスクとは排他的に使用する排他状態に移行させ、前記第４ステップの直後に、前記排他状態を解除するという態様がある。
【００１３】
これには、次のようないくつかの態様がある。
【００１４】
前記第１のステップにおいて、前記実行環境テーブルの各タスク実行環境情報に設けた他タスクが使用中のフラグがセットされている場合は前記タスクを待ち状態に移行させ、前記フラグがセットされていない場合に前記フラグをセットすることで前記排他状態に移行させ、前記排他状態の解除は、前記フラグをクリアすることである。
【００１５】
この場合、前記第１ステップにおいて、前記フラグがセットされている場合はサブ関数が呼ばれずにエラーを返すものとする。
【００１６】
また、前記排他状態への移行をタスクディスパッチ禁止状態に変更することで実行し、前記排他状態の解除をタスクディスパッチ許可状態とすることで実行するのでもよい。ディスパッチ（dispatch）とは、ＯＳが処理する複数のタスクに対するＣＰＵの割り当て（スケジューリング）のことである。
【００１７】
また、前記排他状態への移行を割り込み禁止状態に変更することで実行し、前記排他状態の解除を割り込み許可状態とすることで実行するのでもよい。
【００１８】
このほか、ディスパッチ・割り込みを根本的に抑止するＣＰＵロック状態にして排他状態へ移行するのでもよい。
【００１９】
以下のような排他状態への移行を利用する態様においては、サブ関数呼び出しの確認やタスクの待ち状態移行の必要がないため、処理効率が高いものとなる。
【００２０】
また上記において、前記タスク実行環境はスタックレジスタであり、前記タスク実行環境情報は前記サブ関数で使用するスタック領域アドレスであるという態様がある。
【００２１】
また上記において、前記コンテキスト退避領域は、スタック領域アドレスを指すという態様がある。
【発明の効果】
【００２２】
本発明によれば、タスク単位より細かい関数単位でタスク間のスタック領域が共用可能となり、システム全体でメモリ使用量を削減することができる。したがって、小容量のメモリでマルチタスクシステムを稼動させることができるという利点がある。
【発明を実施するための最良の形態】
【００２３】
以下、本発明にかかわるマルチタスクシステムにおけるタスク実行環境切替え方法の実施の形態を図面に基づいて詳細に説明する。
【００２４】
（実施の形態１）
図１は本発明の実施の形態１におけるマルチタスクシステムの構成を示すブロック図である。このマルチタスクシステムにおいて、オペレーティングシステム（ＯＳ）１は、複数のタスクＴｉ（ｉ＝１，２…ｎ）を並列的に管理して、その実行を制御する。個々のタスクＴｉは、それぞれに専用の実行環境としてスタックＳＴｉ（ｉ＝１，２…ｎ）を備えている。タスクＴ１においては、メイン関数ｆ１がサブ関数ｆ２を呼び出すようになっている。
【００２５】
オペレーティングシステム１は、実行環境テーブルＡ０とコンテキスト退避領域Ｂ０を備えている。実行環境テーブルＡ０は、サブ関数ｆ２用実行環境情報Ａ１、サブ関数ｆ２′用実行環境情報Ａ２…を含む。サブ関数ｆ２用実行環境情報Ａ１は、タスクＴ１がサブ関数ｆ２を実行する際に使用する実行環境スタックのアドレス値を格納する。コンテキスト退避領域Ｂ０は、タスクＴ１退避領域Ｂ１、タスクＴ１退避領域Ｂ２…を含む。これらのタスク用退避領域は、スタックレジスタであるタスク専用の実行環境スタックＳＴ１を変更する前の現在のスタックレジスタ値を退避しておく。サブ関数用実行環境情報、タスク用退避領域は、それぞれ少なくとも１つあればよい。ＳＰｆは関数用実行環境スタックである。
【００２６】
図２は、タスクＴ１においてメイン関数ｆ１からサブ関数ｆ２を呼び出す処理の手順を示すフローチャートである。
【００２７】
まずステップＳ１において、実行環境テーブルＡ０におけるサブ関数ｆ２用実行環境情報Ａ１が使用中になっているか否かを確認する。未使用であればステップＳ２に処理を移し、使用中であればステップＳ１１へ処理を移す。
【００２８】
ステップＳ２において、タスク専用の実行環境スタックＳＴ１における現在のタスク実行環境情報をコンテキスト退避領域Ｂ０のタスクＴ１退避領域Ｂ１へ退避させて保存する。
【００２９】
次いでステップＳ３において、実行環境テーブルＡ０におけるサブ関数ｆ２用実行環境情報Ａ１をスタックレジスタである関数用実行環境スタックＳＰｆへストアする。これは、サブ関数ｆ２を実行するための準備である。
【００３０】
次いでステップＳ４において、実行環境テーブルＡ０におけるサブ関数ｆ２用実行環境情報Ａ１を使用中にする。実行環境情報Ａ１を使用中にすることに関しては、フラグをセットすればよい。例えば、実行環境テーブルＡ０（配列変数）の実行環境情報Ａ１の最下位ビットを“１”にすることで使用中にし、“０”にすることで未使用中にする。
【００３１】
次いでステップＳ５において、サブ関数ｆ２を呼び出し、ステップＳ６において、サブ関数ｆ２の処理を開始し、サブ関数ｆ２の処理の実行の終了を待って、ステップＳ７でサブ関数ｆ２からリターンする。
【００３２】
そして、ステップＳ８において、ステップＳ２でコンテキスト退避領域Ｂ０のタスクＴ１退避領域Ｂ１に退避しておいた実行環境情報をタスク専用の実行環境スタックＳＴ１へ代入する。
【００３３】
次いでステップＳ９において、実行環境テーブルＡ０におけるサブ関数ｆ２用実行環境情報Ａ１を未使用にする。例えば、実行環境情報Ａ１の最下位ビットを“０”にすることで未使用とする。未使用とした際には、必要に応じてサブ関数ｆ２用実行環境情報Ａ１の使用待ち状態になっているタスクを検索する。もし待ち状態のタスクが存在する場合は、そのタスクの待ち状態を解除する必要があるが、今回はその詳細な処理に関しては示さない。
【００３４】
最後に、ステップＳ１０で、メイン関数ｆ１へ処理を戻す。
【００３５】
一方、ステップＳ１の判断において、実行環境テーブルＡ０におけるサブ関数ｆ２用実行環境情報Ａ１が使用中であった場合は、ステップＳ１１に進んで、サブ関数ｆ２を呼び出せるか否かの確認を行う。サブ関数ｆ２を呼び出せると判断したときはステップＳ２に移行するが、呼び出せないと判断したときはステップＳ１２に進んで、メイン関数ｆ１へ処理を戻す。
【００３６】
図３は、サブ関数ｆ２を呼び出せるか否かの確認の手順を示すフローチャートである。以下、これについて説明する。
【００３７】
まずステップＳ２１において、タスクを待ち状態に移行させるかどうかの確認を行い、待ち状態に移行させない場合はステップＳ２２へ処理を移し、待ち状態に移行させる場合はステップＳ２３へ処理を移す。この場合、例えば、あるＯＳ内部の特定変数の値が“１”の場合は待ち状態へ移行させ、特定変数が“０”の場合は、待ち状態へ移行させない等の方法がある。
【００３８】
ステップＳ２１の確認で待ち状態に移行させないとした場合は、ステップＳ２２に進んで終了処理を行い、呼び出せない値を返す。一方、ステップＳ２１の確認で待ち状態に移行させるとした場合は、ステップＳ２３へ処理を移す。
【００３９】
ステップＳ２３において、タスクＴ１を待ち状態へ移行させる。この際に、サブ関数ｆ２用実行環境情報Ａ１を使用待ち状態にし、ＯＳ内部の待ちキューに繋ぎ、タスクＴ１の状態変数を変更し、ＯＳ内で管理されている他のタスクへの遷移処理を行う。ここでは、待ち状態に移行させる際の処理の詳細は示さない。
【００４０】
ステップＳ２３においてタスクＴ１を待ち状態へ移行させ、何かの要因によって待ち状態が解除されたら、ステップＳ２４へ処理を移す。
【００４１】
ステップＳ２４において、待ち状態が正常に解除されたかの確認を行い、正常に解除された場合はステップＳ２６へ処理を移すが、異常の場合はステップＳ２５へ処理を移す。待ち状態が正常に解除されたかの確認は、例えば、他タスクがサブ関数ｆ２用実行環境情報Ａ１の使用が終了し解放した場合に正常に解除とする。一方で、例えば、強制待ち解除要求などでタスクＴ１の待ち状態が解除された場合は、異常と判断する。
【００４２】
ステップＳ２４で異常と確認された場合は、ステップＳ２５に処理を移し、ステップＳ２５では終了処理を行い、呼び出せない値を返す。ステップＳ２４で正常と確認された場合は、ステップＳ２６へ処理を移し、終了処理を行い、呼び出せる値を返す。
【００４３】
ステップＳ１１の確認処理で、呼び出せないと確認した場合は、ステップＳ１２へ処理を移し、メイン関数ｆ１へ処理を戻す。この際に、メイン関数ｆ１にサブ関数ｆ２が呼び出せなかったことを伝えるため、例えばエラー値を返却する。ステップＳ１１の確認処理で呼び出せると判断した場合、ステップＳ２へ処理を移す。ここで、ステップＳ２以降の処理は、上記で説明した通りになる。
【００４４】
上記のステップＳ２において、コンテキスト退避領域Ｂ０がサブ関数ｆ２用実行環境情報Ａ１の値「（ＳＰ）＋４」を指した場合の関数用実行環境スタックＳＰｆの使われ方を図４に示す。サブ関数ｆ２用実行環境情報Ａ１の値は、サブ関数ｆ２処理用スタック領域２を指しており、戻りＳＰ保存領域３はサブ関数ｆ２用実行環境情報Ａ１の値「（ＳＰ）＋４」を指し、タスクＴ１で使用していた最終のアドレスをサブ関数ｆ２用のスタック領域の戻りＳＰ保存領域３に保存する。
【００４５】
以上のように本実施の形態によれば、関数の開始から終了までを１つの単位としてタスク間でのスタック領域を共用するもので、タスク単位より細かい関数単位でタスク間のスタック共用を行うので、タスク処理途中で通信する可能性がある場合や同時に起動する可能性のあるタスク間においても、スタック領域の共用化が行え、システム全体でメモリ使用量を削減することができる。
【００４６】
（実施の形態２）
図５は、本発明の実施の形態２におけるメイン関数ｆ１からサブ関数ｆ２の呼び出し処理のフローチャートを示している。実施の形態１の場合の図２と対比すると、ステップＳ４の使用中のフラグを立てたり、ステップＳ９の未使用中のフラグを立てる代わりに、ステップＳ３１において排他状態へ移行する点、およびステップＳ３８において排他状態を解除する点が異なっている。
【００４７】
まずステップＳ３１において、排他状態へ移行する。排他状態とは、例えば、タスクディスパッチ禁止状態や、割り込み禁止状態や、ＣＰＵロック状態のことを指す。
【００４８】
次いでステップＳ３２において、タスク専用の実行環境スタックＳＴ１における現在のタスク実行環境情報をコンテキスト退避領域Ｂ０のタスクＴ１退避領域Ｂ１へ退避させて保存する。
【００４９】
次いでステップＳ３３において、実行環境テーブルＡ０におけるサブ関数ｆ２用実行環境情報Ａ１を関数用実行環境スタックＳＰｆへストアする。
【００５０】
次いでステップＳ３４において、サブ関数ｆ２を呼び出し、ステップＳ３５において、サブ関数ｆ２の処理を開始し、サブ関数ｆ２の処理の実行の終了を待って、ステップＳ３６でサブ関数ｆ２からリターンする。
【００５１】
そして、ステップＳ３７において、ステップＳ３２でコンテキスト退避領域Ｂ０のタスクＴ１退避領域Ｂ１に退避しておいた実行環境情報をタスク専用の実行環境スタックＳＴ１へ代入する。
【００５２】
その後、ステップＳ３８で排他状態を解除する。排他状態を解除する際は、ステップＳ３１でタスクディスパッチ禁止状態にした場合は、タスクディスパッチ許可状態にする。また、ステップＳ３１で割り込み禁止状態にした場合は、割り込み許可状態にする。また、ステップＳ３１でＣＰＵロック状態にした場合は、ＣＰＵロック状態を解除させる。
【００５３】
最後に、ステップＳ３９で、メイン関数ｆ１へ処理を戻す。
【００５４】
以上のように本実施の形態においても、関数の開始から終了までを１つの単位としてタスク間でのスタック領域を共用するもので、タスク単位より細かい関数単位でタスク間のスタック共用を行うので、タスク処理途中で通信する可能性がある場合や同時に起動する可能性のあるタスク間においても、スタック領域の共用化が行え、システム全体でメモリ使用量を削減することができる。
【００５５】
加えて、図２の場合のサブ関数ｆ２を呼び出せるか否かの確認は必要でなく、タスクの待ち状態移行もないため、処理効率が高いものとなる。
【００５６】
（実施の形態３）
上記で説明した実施の形態１および実施の形態２では、サブ関数ｆ２用実行環境情報Ａ１をタスク実行環境情報としたが、これに代えて、サブ関数ｆ２用実行環境情報Ａ１をＣＰＵの動作モードとし、メイン関数ｆ１からサブ関数ｆ２の呼び出し処理の中でメイン関数ｆ１を実行中の動作モードをコンテキスト退避領域Ｂ０へ退避させて保存し、サブ関数ｆ２のＣＰＵ動作モードを切り替えるように構成してもよい。
【００５７】
また、複数のＣＰＵが存在するマルチプロセッサの場合、サブ関数ｆ２用実行環境情報Ａ１に特定のＣＰＵを指定し、メイン関数ｆ１からサブ関数ｆ２の呼び出し処理で使用ＣＰＵを切り替えるように構成してもよい。
【産業上の利用可能性】
【００５８】
本発明は、マルチタスクシステムにおけるタスク実行環境切替え方法において、タスク処理途中で通信する可能性がある場合や同時に起動する可能性のあるタスク間においても、スタック領域の共用化が行え、システム全体でメモリ使用量を削減する技術として有用である。
【図面の簡単な説明】
【００５９】
【図１】本発明の実施の形態１におけるマルチタスクシステムの構成を示すブロック図
【図２】本発明の実施の形態１におけるメイン関数からサブ関数の呼び出し処理のフローチャート
【図３】本発明の実施の形態１におけるサブ関数呼び出し確認処理のフローチャート
【図４】本発明の実施の形態１におけるコンテキスト退避領域がサブ関数用実行環境情報を指す際のスタック領域の使われ方を示した図
【図５】本発明の実施の形態２におけるメイン関数からサブ関数の呼び出す際に排他状態にする処理のフローチャート
【図６】従来の共用スタック領域を排他的に制御するフローチャート
【符号の説明】
【００６０】
１  ＯＳ（オペレーティングシステム）
Ａ０  実行環境テーブル領域
Ａ１  サブ関数ｆ２用実行環境情報
Ｂ０  コンテキスト退避領域
Ｂ１  タスクＴ１用退避領域
ｆ１  メイン関数
ｆ２  サブ関数
ＳＰｆ  関数用実行環境スタック
ＳＴ１  タスク専用の実行環境スタック
Ｔ１  タスク
【図１】
2007257257.tif 000003
【図２】
2007257257.tif 000004
【図３】
2007257257.tif 000005
【図４】
2007257257.tif 000006
【図５】
2007257257.tif 000007
【図６】
2007257257.tif 000008