(57)【要約】  この発明はデジタルシグナルプロセッサ上で複数タスクを実施する実施に関する。この目的のため、ブロッキング関数は、プロセッサのハードウェアスタックを使用しないように、構成される。それぞれの関数呼び出しは、その代わりに、前記関数を実行すべく正しいルーチンへの分岐を実行する一つのインラインアセンブリコードと置換される。ブロッキング関数のブロッキング条件に遭遇した場合には、タスク切替えが行われ他のタスクが再開できる。タスク切替えをしなければならないかもしれないときにハードウェアスタックを使用しないのに、異なるタスクによって実行される関数呼び出しの間で、ハードウェアスタックの内容が混同することが避けられる。【選択図】図１
2008537248.tif 000002
【特許請求の範囲】
【請求項１】
ハードウェアスタックを備えるデジタルシグナルプロセッサ上で複数タスクを実施する方法であって、
第一のタスクと、ブロッキング関数を実行するためのコードへの分岐との、それぞれのリターンアドレスを保存するステップと、
前記ブロッキング関数に対するブロッキング条件が存在するかどうかを決定するステップと、
ブロッキング条件が存在すると決定された場合には、プロセッサの共有リソースを保存ステップと、
少なくとも１つの第二のタスクへと切替わるステップとを有する方法。
【請求項２】
前記少なくとも１つの第二のタスクから戻った後、前記ブロッキング条件を再度チェックし、前記ブロッキング条件がまだ存在する場合には、前記少なくとも１つの第二のタスクへと切替えるステップをさらに含む、請求項１記載の方法。
【請求項３】
前記ブロッキング条件がもはや存在しない場合には、前記共有リソースを復元し、前記第一のタスクの前記リターンアドレスに分岐し、前記第一のタスクの実行を継続するステップをさらに含む、請求項２記載の方法。
【請求項４】
前記決定ステップにおいて、前記ブロッキング条件が存在しない場合には、前記第一のタスクの前記リターンアドレスへ分岐し、前記第一タスクを実行するステップをさらに含む、請求項１から３いずれか１つに記載の方法。
【請求項５】
コンピュータプログラム製品であって、コード手段を備え、前記コード手段からは見えないハードウェアスタックを備えた、少なくとも１つのプロセッサを有するコンピュータシステム上で実行されるとき、前記コード手段が請求項１から４いずれか１つに記載の方法を用いて、タスク切替えにおいてブロッキング関数のブロッキング同期を行うように構成された、コンピュータプログラム製品。
【請求項６】
コンピュータシステムで実行されるコード手段からは見えないハードウェアスタックを備えるプロセッサとメモリとを有し、前記プロセッサは前記メモリに保存されたコード手段を実行できるコンピュータシステムであって、前記コード手段が複数タスクを含み、請求項１から４いずれか１つに記載の方法を用いて、前記複数タスクにおいて用いられるブロッキング関数のブロッキング同期を行うように構成される、コンピュータシステム。
【請求項７】
コード手段を含むデータキャリアであって、前記コード手段がコード手段からは見えないハードウェアスタックを備えるプロセッサを有するコンピュータシステム上で実行されるとき、請求項１から４いずれか１つによる方法を用いるように構成された、データキャリア。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、請求項１によるハードウェアスタックを備えるデジタルシグナルプロセッサ上でのマルチタスクの実施方法、請求項５によるコンピュータプログラム製品、請求項６によるコンピュータシステム、及び請求項７によるデータキャリアに関する。
【背景技術】
【０００２】
近年、マルチメディアアプリケーションが、マルチプロセッサを備えるハードウェア環境を有するコンシューマ製品において、ますます実施されている。このようなマルチプロセッサの一部として、多くの場合に１以上のデジタルシグナルプロセッサ（ＤＳＰ）を用いて、計算量の多い作業を高速化している。伝統的に、ＤＳＰは単一プログラムの実行に適している。これは、１つの単一プログラムで容易に記述できる、静的なアプリケーションに適している。しかしながら、新しいアルゴリズムは、例えばデータに依存して動作が動的であり、従って、アプリケーションは通信タスクのグラフとして開発される。タスクは、十分に高い設計生産性を実現するため、設計と統合が容易でなければならない。
【０００３】
データ交換のために、タスクは、タスク間通信用の特別な関数を介し、お互いに通信をする。例えば、このような関数は、Ｆｉｒｓｔ−ｉｎ−Ｆｉｒｓｔ−ｏｕｔ（ＦＩＦＯ）バッファからのデータ読出し、及びＦＩＦＯバッファへのデータ書込みをする機構を提供できる。これを行うため、ａ）同期、及びｂ）データ転送用の、２種類の基本動作が必要になる。同期動作は、十分なデータ又は空きが、それぞれバッファ内で利用可能であるかチェックし、該当する場合には、新しいデータ又は空きが、それぞれ利用可能であることを信号で伝える。データ転送動作は、バッファへ／バッファから、データを移動する。この動作は様々な方法で関数に組み込まれても良い。
【０００４】
同期動作の意味を、異なる種類とすることができる。基本的に、データ又は空きそれぞれをチェックする同期動作は、データ又は空きそれぞれが利用可能になるまで、論理的にブロッキングとすることができる。しかしながら、プロセッサハードウェアをより活用するためには、あるタスクが必要なデータ又は空きを利用できない場合には、他のタスクが実行機会を取得すべきである。このように、データ又は空きの利用可能性をチェックする、同期動作を実施する関数は、タスクに真／偽の値を直接戻すことができる。もし戻り値が偽なら、タスク切替えが必要になる。これはノンブロッキング同期と呼ばれる。
【０００５】
第一のアプローチとして、アプリケーションは、ノンブロッキング同期関数が偽の値を戻す場合、すなわち、例えばデータ又は空きそれぞれが利用可能でないことを伝える場合に、タスクから戻ることによってタスクスケジューラに制御を戻すタスク間通信用に、ノンブロッキング同期を用いるタスクを含むことができる。しかしながら、これは、データ依存の通信動作を伴うタスクに対し、複雑なコード構造を生じさせる。なぜなら次にタスクが予定されている時に、実行するポイントを再計算しなければならないからである。
【０００６】
第二のアプローチによると、ブロッキング同期関数が用いられ、コード構造は単純化される。なぜならタスクは、論理的に、同期関数呼び出しが戻るまで待機するからである。より単純なコード構造は、タスクがより設計しやすくなり、従って、ブロッキング同期を用いることにより、設計生産性が増加することを意味する。ここで、問題はブロッキング同期関数の実装である。なぜなら関数呼び出しがブロックする場合には、デッドロックを回避するとともにＤＳＰを有効利用するため、タスク切替えが発生しなければならないからである。さらに、実際のＤＳＰはタスク切替えをサポートしない。さらに、実際のＤＳＰは関数呼び出しのオーバーヘッドを減少させるために多くの場合ハードウェアスタックを備えている。しかしながら、ソフトウェアからは見えないハードウェアスタックの使用は、ブロッキング関数呼び出しに対する、ソフトウェア制御によるタスク切替えを妨げる。この問題を以下により詳細に説明する。
【０００７】
例えば、共通アセンブリ命令セット（ＡＩＣ）の、アセンブリ命令ＧＯＳＵＢに一致する関数呼び出しが実行される場合に、ハードウェアスタックが用いられる。呼び出された関数の第一命令の実行を開始する前に、プログラムカウンタ（ＰＣ）の現在値がハードウェアスタックにプッシュされる。さらに、スタックが、プロセッサのスタックレジスタセグメントそれぞれにおいて、上方向に増加する場合には、ハードウェアスタックポインタは、これに応じて増加（インクリメント）される。この時にのみ、呼び出された関数の第一命令のアドレスがＰＣにコピーされ、呼び出された関数のコードがフェッチされて実行を開始することができる。実行後、呼び出された関数は戻り、これは、例えば、共通ＡＩＳのアセンブリ命令ＲＴＣに一致する。そして、スタックポインタはこれに応じて減少（デクリメント）され、この関数呼び出し前のプログラムカウンタの値がハードウェアスタックからポップされ、すなわち、ＰＣにコピーされる。続いて、この関数呼び出しの後に、呼び出しコードは実行を続ける。呼び出された関数のブロッキングによるタスク切替えの場合には、ハードウェアスタックの内容は複数タスクの間で混同してしまうことがある。
【発明の開示】
【発明が解決しようとする課題】
【０００８】
以下、２つのタスクＡ及びＢを備えるシナリオ例を用いてこの問題を説明する。はじめに、実行されるのはタスクＡであり、ハードウェアスタックは空であるとする。従って、スタックポインタは０である。ここで、タスクＡは、タスクＡのリターンアドレスをハードウェアスタックの位置０にプッシュし、スタックポインタを１にインクリメントする、関数ｆ１を呼ぶ。ここで、ある理由により、呼び出された関数ｆ１がブロックされると、タスクＢへのタスク切替えが行われ、タスクＢに実行機会が与えられる。タスクＢの実行中、タスクＢのリターンアドレスをハードウェアスタックの位置１にプッシュし、従って、スタックポインタを２にインクリメントする、関数ｆ２が呼び出される。ある理由により、呼び出された関数ｆ２もまたブロックされ、従って、タスクＡに戻るタスク切替えが行われる。ここで、関数ｆ１はもはやブロックされておらず、従って実行されるものとすると、実行後、関数ｆ１は戻り、すなわち、スタックの位置２の値がＰＣにコピーされる。しかしながら、スタック位置２の値はタスクＢのリターンアドレスであって、タスクＡのものではない。関数ｆ１がタスクＡに呼ばれているため、これは明らかに誤りである。
【０００９】
結果として、タスク切替えがＤＳＰのハードウェアスタックから独立していないことが示される。汎用プロセッサでは、複数タスクは通常ブロッキング関数で実行され、ハードウェアスタックを用いないため、前述の問題は存在しない。しかしながら、多くの場合にハードウェアスタックを有するＤＳＰでは、タスク切替えは上記のように問題を生じやすい。
【００１０】
従って、この発明の目的は、ハードウェアスタックのデータ整合性に関する問題を起こさずに、タスク切替えを可能にする方法を提供することにある。特に、この発明の目的は、デジタルシグナルプロセッサ（ＤＳＰ）上でのタスク切替えを提供することにある。
【課題を解決するための手段】
【００１１】
この発明の全て、又は特定の目的は、請求項１記載の方法により解決される。従って、この発明は、ブロッキング同期関数によってハードウェアスタックを備えるデジタルシグナルプロセッサ上で複数タスクを実施する方法であり、この方法は、
第一のタスクと、ブロッキング関数を実行するためのコードへの分岐との、それぞれのリターンアドレスを保存するステップと、
前記ブロッキング関数に対するブロッキング条件が存在するかどうか決定するステップと、
ブロッキング条件が存在すると決定された場合には、プロセッサの共有リソースを保存ステップと、
少なくとも１つの第二のタスクへと切替えるステップとを有する。
【００１２】
この発明の全体的な発明思想は、ハードウェアスタックを使用しないようにブロッキング関数を実現することにある。換言すると、それぞれの関数呼び出しを、基本的に、プログラムカウンタをセーブし、前記関数を実行する正確なルーチンにジャンプする、一つのインラインアセンブリコードにより変更する。すなわち、サブルーチン呼び出しの代わりに分岐命令を使用するため、プロセッサによってハードウェアスタックは使用されない。ここで、ブロッキング条件に遭遇すると、他のタスクを再開するためにタスク切替えが可能となり、有利である。タスク切替えをしなければならないかもしれない場合にハードウェアスタックを使用しないのに、異なるタスクによって実行される関数呼び出しの間での、ハードウェアスタックの内容混同という上記問題は、この発明による方法により克服される。
【００１３】
前記少なくとも１つの第二のタスクから戻った後、前記ブロッキング条件を再度チェックし、前記ブロッキング条件がまだ存在する場合には、前記少なくとも１つの第二のタスクへと切替えるステップをさらに含むことにより、この発明の方法は、前記第一タスクとこの方法が実施される任意のタスクとの間に、前記タスク切替えと再チェックを含むループによって自律的なタスク切替えインターフェースを提供し、有利である。前記第一タスクが、前記ブロッキング関数の前記ブロッキング条件によって、まだブロックされている場合には、他のタスクへの他のタスク切替えが行われる。前記ブロッキング条件がもはや存在しない場合には、前記第一タスクの前記共有リソースが復元される。そして、前記第一タスクの前記リターンアドレスへと分岐され、前記第一タスクの実行が継続される。
【００１４】
前記決定ステップにおいて、前記ブロッキング条件が存在しないと決定された場合には、前記第一タスクの前記リターンアドレスへと分岐され、前記第一タスクの実行が継続される。
【００１５】
ＤＳＰ内には、複数タスクをスケジュールするスケジューラがある。前記スケジューラは、例えばレディキューによって、複数タスクを管理できる。前記複数タスクはお互いと通信できる。すなわち、タスク間通信向けの特別な関数を介し、共通に使用される及び／又は処理されるデータを交換する。このように、前記複数タスクから構成されるアプリケーションの効率は、ハードウェアスタックを備えるデジタルシグナルプロセッサを有するコンピュータシステム上で実行される場合は、前記複数タスク間のタスク切替えによって改善することができる。
【００１６】
この発明による方法は、コード手段を備える、コンピュータプログラム製品の一部、又はその中で有利に使用することができ、前記コード手段は、前記コード手段からは見えないハードウェアスタックを備える少なくとも１つのプロセッサを有するコンピュータシステム上で実行できる。このように、この発明によるブロッキング関数のブロッキング同期の使用によって、このようなコンピュータシステムにおいてタスク切替えを容易に利用することができる。従って、この発明は、コンピュータシステム及びメモリ上で実行されるコード手段からは見えないハードウェアスタックを備えるプロセッサを有し、前記プロセッサが前記メモリ内に保存されたコード手段を実行できるコンピュータシステムにおいて使用することができる。最後に、データキャリアがなお重要であり、このデータキャリアは、コード手段からは見えないハードウェアスタックを備えるプロセッサを有するコンピュータシステム上で実行されるとき、本発明の方法を用いて、前記コンピュータシステムが複数タスク間のタスク切替えによって前記複数のタスクを処理できるように構成されたコード手段を含むことができる。
【発明を実施するための最良の形態】
【００１７】
この発明は、以下の添付図面と共に、この発明の実施形態の詳細な説明を考慮することで、より完全に理解される。
【００１８】
図１はこの発明によるタスク切替えの実施を示したフロー図を示す。
【００１９】
この発明の好適な実施形態では、発明された方法は複数種類のコードセグメントによって実施される。この発明は様々な変更例及び代替例に改変することができるが、ここではこの発明の特定の実施例を示す。しかしながら、一般的妥当性のため、実施形態の説明には擬似的なコードを使うことに留意されたい。この実施形態は、この発明により、どのようにして複数タスクが、ＤＳＰのようにソフトウェアからは見えないハードウェアスタックを通常使う、プロセッサ上で実施できるかを示す。この発明は複数のコードセグメントをブロッキング関数の実施に使用するが、この発明を記述された特定の実施形態に限定する意図はないことを理解されたい。それどころか、添付の特許請求の範囲に規定するように、この発明の範囲に含まれる全ての変更物、均等物、及び代替物を含むことを意図している。とりわけ、ブロッキング関数に対する所与の例は、データの利用可能性をチェックする同期関数であることに留意されたい。
【００２０】
以下に、ＤＳＰ上でこの発明を実施するためのコードセグメントを紹介する。第一に、現在のタスク「Ｃｕｒｒｅｎｔ  ｔａｓｋ」のコード中では、ブロッキング条件でブロックしてタスク切替えを生じさせうるような、所定の関数に対する関数呼び出しの代わりに、インラインアセンブリコードセグメントが用いられる。このインラインアセンブリは、ここではタイプＡ又は略してコードＡという。
【００２１】
Temp_pc=PC+2;
GOTO Check data available;
Continue;
【００２２】
このコードＡはインラインアセンブリコードの一つであり、このコードによって、関数呼び出しの代わりに、それぞれの関数コードへの分岐が行われる。従って、それぞれの所定のブロッキング関数ごとに別々のタイプＡコード、すなわち、ブロックするかもしれず、そのブロック時に他のタスクへの切替えが行われる任意の関数が存在することはいうまでもない。変数「Ｔｅｍｐ＿ｐｃ」は一時的なプログラムカウンタとして用いられ、この値「ＰＣ＋２」は「Ｃｏｎｔｉｎｕｅ」命令の位置を示し、従って、呼び出しコードにジャンプして戻るために使用されるため、呼び出しコードの実行が継続できる。これに関連し、命令「Ｔｅｍｐ＿ｐｃ＝ＰＣ＋２」の実行中、割込みを無効にすることが有益であることを、発明者が発見したことは、注目に値する。割込みは、変数「Ｔｅｍｐ＿ｐｃ」を設定した後に、再び有効にできる。命令「ＧＯＴＯ  Ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」は、（もともと呼び出されている）関数の実際のコードであって次に説明される、「Ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」という名のコードへのジャンプである。
【００２３】
コード「Ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」は、先行技術に準じて呼び出される関数を実行するコードである。「Ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」は、ここではタイプＢ又は略してコードＢという。
【００２４】
Check data available : 
If (enough tokens)
GOTO Temp_pc; 
Else 
GOSUB Save state;
Current_task->return_point = Re check data available; 
GOTO Task switch;
【００２５】
基本的に、コードＢの実行により、ブロッキング条件に遭遇したかどうかが決定される。もし遭遇しない場合には、実行は、「Ｔｅｍｐ＿ｐｃ」が示す位置にジャンプして戻ることにより継続され、その他の場合には、次に説明される「Ｓａｖｅ  Ｓｔａｔｅ」コードを呼び出し、さらに下で説明されるそれぞれの「Ｒｅ  ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」コードを示す変数「Ｃｕｒｒｅｎｔ＿ｔａｓｋ−＞ｒｅｔｕｒｎ＿ｐｏｉｎｔ」を設定することによって、タスク切替えが準備される。再び、他のタスクへのタスク切替えを開始できる、それぞれの可能なブロッキング関数ごとに別々のコードＢが存在することに留意されたい。
【００２６】
コード「Ｓａｖｅ  Ｓｔａｔｅ」に関し、このコードは全レジスタ状態をメモリ中に保存するために使われる。コード「Ｓａｖｅ  Ｓｔａｔｅ」は、ここではタイプＣのコード又は略してコードＣという。
【００２７】
Save_state:
Save all registers in memory; 
Return;
【００２８】
コードＣは、次のコード「Ｔａｓｋ  ｓｗｉｔｃｈ」によって制御される、他のタスクへの切替え準備の第一段階として、プロセッサの共有リソースの内容を保存する、状態保存コードである。
【００２９】
コード「Ｔａｓｋ  ｓｗｉｔｃｈ」は、所定のブロッキング関数によって止められているタスク間の同期タスク切替えのための一種のインターフェースを提供する。コード「Ｔａｓｋ  ｓｗｉｔｃｈ」は、ここではタイプＤのコード又は略してコードＤという。
【００３０】
Task switch:
Current_task->parameters = parameters;
Current task = scheduler_get_next_task; 
Parameters = Current_task->parameters;
GOTO Current_task->return_point;
【００３１】
基本的に、コードＤは、他のタスク、例えばスケジューラによって管理されるレディキュー内の次のタスクへと制御を与える、タスク切替えコードである。タスク切替え前、「Ｃｕｒｒｅｎｔ  ｔａｓｋ」の実パラメータは「Ｃｕｒｒｅｎｔ＿ｔａｓｋ−＞ｐａｒａｍｅｔｅｒｓ」として保存される。このパラメータは、Ｔｅｍｐ＿ｐｃのそれぞれの値もまた含むことに留意されたい。そして「Ｃｕｒｒｅｎｔ  ｔａｓｋ」は他のタスクへと変更できる。他のタスク、すなわち新しい「Ｃｕｒｒｅｎｔ  ｔａｓｋ」、のパラメータは、それぞれの「Ｃｕｒｒｅｎｔ＿ｔａｓｋ−＞ｐａｒａｍｅｔｅｒｓ」から復元される。次に、それぞれの「Ｃｕｒｒｅｎｔ＿ｔａｓｋ−＞ｒｅｔｕｒｎ＿ｐｏｉｎｔ」へのジャンプが行われる。「Ｃｕｒｒｅｎｔ  ｔａｓｋ」に対して上述したように、変数「Ｃｕｒｒｅｎｔ＿ｔａｓｋ−＞ｒｅｔｕｒｎ＿ｐｏｉｎｔ」は、次に説明する「Ｒｅ  ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」のアドレスに設定されている。
【００３２】
コード「Ｒｅ  ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」は、ブロッキング関数のブロッキング条件、すなわちこの実施形態では関数「Ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」について再チェックを行うものである。コード「Ｒｅ  ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」は、ここではタイプＥのコード又は略してコードＥという。
【００３３】
Re check data available:
If (enough tokens)
GOSUB Restore state; 
GOTO Temp_pc; 
Else 
GOTO Task switch;
【００３４】
つまり、コードＥは、タスク切替え発生後、それぞれの「Ｃｕｒｒｅｎｔ  ｔａｓｋ」のそれぞれのブロッキング関数のブロッキング条件を再チェックするコードである。基本的に、これはそれぞれのコードＢと同様の特徴を有する。ブロッキング条件がもはや存在しない場合には、次に説明するコード「Ｒｅｓｔｏｒｅ  ｓｔａｔｅ」が呼ばれ、「Ｔｅｍｐ＿ｐｃ」が示す位置、即ちタイプＡコード中の「Ｃｏｎｔｉｎｕｅ」命令へのジャンプによってもとのタスクの継続実行が開始される。ブロッキング条件がまだ存在する場合には、コードＤへのジャンプ、すなわち「タスク切替え」が存在し、再び他のタスクを起動することができる。このように、両コードＤ及びＥは、それぞれの「Ｃｕｒｒｅｎｔ  ｔａｓｋ」内で、タスク切替えと、ブロッキング理由（条件）の再チェックとの間のサイクルを構成する。
【００３５】
コード「Ｒｅｓｔｏｒｅ  ｓｔａｔｅ」はメモリから全レジスタの状態を復元する。コード「Ｒｅｓｔｏｒｅ  ｓｔａｔｅ」は、ここではタイプＦのコード又は略してコードＦという。
【００３６】
Restore state:
Restore all registers from memory; 
Return;
【００３７】
コードＦは、プロセッサの共有リソースの中身を復元する、状態復元コードである。
【００３８】
この発明によるコードＣ、Ｄ及びＦは、全ての所定のブロッキング関数の間で共有してもよく、すなわち全体的に同一にしてもよい。コードＡ、Ｂ及びＥだけは、それぞれのブロッキング関数に対して個別に幾分調整できる。
【００３９】
以下に、上で議論したコードＡ、Ｂ、Ｃ、Ｄ、Ｅ及びＦの実行を、図１のフロー図を参照して説明する。「Ｃｕｒｒｅｎｔ  ｔａｓｋ」Ｔ１でコードＡが実行される場合には、プログラムカウンタＰＣの値によって設定される一時的なプログラムカウンタ「Ｔｅｍｐ＿ｐｃ」は、２増加される。そして、対応するコードＢへのジャンプが行われる。
コードＢの出力は、
ａ）図１中のＹＥＳを意味する、ブロッキング条件に遭遇しないか、
ｂ）図１中のＮＯを意味する、ブロッキング条件に遭遇するか
のいずれかである。
【００４０】
ａ）の場合には、一時的なプログラムカウンタ「Ｔｅｍｐ＿ｐｃ」が示す、コードＡの終わりへのジャンプが行われ、タスクは継続する。すなわち呼ばれているもとの関数が実行する。
ｂ）の場合には、コードＣが実行され、従って、Ｃｕｒｒｅｎｔ  ｔａｓｋ  Ｔ１の全ての関連する値、すなわち、プロセッサの共有リソースの内容がメモリに保存される。
そして、コードＤへのジャンプが行われる。コードＤはタスク切替えの理由(条件)に関する情報も保存する。「Ｔｅｍｐ＿ｐｃ」の値も、変数「Ｃｕｒｒｅｎｔ＿ｔａｓｋ−＞ｐａｒａｍｅｔｅｒｓ」内に保存されるパラメータに属することも注目に値する。この後、コードＤは他のタスクＴ２をレディリストからフェッチし、それを新しい「Ｃｕｒｒｅｎｔ  ｔａｓｋ」にする。他のタスクＴ２から戻った後、コードＤは「Ｃｕｒｒｅｎｔ＿ｔａｓｋ−＞ｒｅｔｕｒｎ  ｐｏｉｎｔ」にジャンプし、これは、コードＥ及びこの実施形態では関数「ｒｅ  ｃｈｅｃｋ  ｄａｔａ  ａｖａｉｌａｂｌｅ」であり、すなわちもとの「Ｃｕｒｒｅｎｔ  ｔａｓｋ」Ｔ１から他のタスクＴ２への第一タスク切替えの理由に基づくものである。
【００４１】
コードＥはコードＢに類似するコードを実行する。
再び、２つの出力の可能性があり、
ｃ）図1中のＹＥＳを意味する、ブロッキング条件はもはや存在しないか、
ｄ）図1中のＮＯを意味する、ブロッキング条件はまだ存在するか、
どちらかである。
ｃ）の場合には、メモリから共有リソース、すなわちプロセッサレジスタを復元する、タイプＦのコードが呼ばれ、そして、もとの「Ｃｕｒｒｅｎｔ  ｔａｓｋ」中のもとのコードＡの終わり、すなわち「Ｔｅｍｐ＿ｐｃ」の値で表される位置へと戻るジャンプが行われる。もとの「Ｃｕｒｒｅｎｔ  ｔａｓｋ」は継続できる。
ｄ）の場合には、他のタスク切替えのためコードＤへのジャンプが行われる。この場合には、復元する必要のある共有リソースはない。なぜならこれらの値はすでに変数「Ｃｕｒｒｅｎｔ＿ｔａｓｋ−＞ｐａｒａｍｅｔｅｒｓ」に保存されているからである。
【００４２】
この発明は、デジタルシグナルプロセッサ上で複数タスクを実施する方法を開示する。この目的のため、ブロッキング関数は、プロセッサのハードウェアスタックを使用しないように、構成される。それぞれの関数呼び出しは、その代わりに、前記関数を実行するための正しいルーチンへの分岐を実行する、一つのインラインアセンブリコードと置換される。ブロッキング関数のブロッキング条件に遭遇した場合には、タスク切替えを行い、他のタスクを再開することができる。タスク切替えをしなければならないかもしれないときにハードウェアスタックを使用しないのに、異なるタスクによって実行される関数呼び出し間でハードウェアスタックの内容が混同することが避けられる。
【００４３】
概して、ハードウェアスタックを備えるデジタルシグナルプロセッサ上での複数タスクを可能にするこの発明による方法は、関数呼び出しの際にソフトウェアからは見えないハードウェアスタックを使用する、いずれのプロセッサにも通常適用可能である。この発明による方法を実装することで、ＤＳＰのようなプロセッサ、例えばフィリップスセミコンダクターズのＥｐｉｃｓ７ｂプロセッサ、上でタスク切替えが可能になる。さらに、タスクが切替えられた場合及びタスクが再び戻された場合に、ハードウェアスタックが同一の内容を有することを保証するため、ブロッキング呼び出しはタスクのメイン関数内でのみ使用されることは、注目する価値がある。
【図面の簡単な説明】
【００４４】
【図１】この発明によるタスク切替えの実施を示したフロー図を示す。
【図１】
2008537248.tif 000003
【国際調査報告】
2008537248.tif 000004
2008537248.tif 000005
2008537248.tif 000006