(57)【要約】  タスク処理装置１００は、ＣＰＵ１５０、退避回路１２０、タスク制御回路２００を含む。タスク制御回路には、複数のＨＷＦ５００が接続される。タスクが補助処理の実行を要求すると、タスク処理装置１００は、ＨＷＦ５００に補助処理の実行を指示するとともに、実行中のタスクをＲＵＮ状態から別の状態に設定変更し、補助処理が完了したときに次の実行対象となるタスクを選択してＲＵＮ状態に設定する。
2009090684.tif 000002
【特許請求の範囲】
【請求項１】
タスク実行のためのデータを一時的に保持する処理レジスタと、
命令（instruction）およびオペランドをメモリから前記処理レジスタにロードし、前記処理レジスタの命令とオペランドにしたがってタスクを実行する実行制御回路と、
タスクの実行状態を示す状態データを保持する状態レジスタと、
タスクの実行状態を制御するタスク切換回路と、
前記状態データに基づいて、所定の選択条件によりタスクを選択するタスク選択回路と、
タスクの一部として所定の補助処理を実行する補助処理回路と、を備え、
前記実行制御回路は、所定のシステムコール命令を実行するとき、所定のシステムコール信号を前記タスク切換回路に送信し、
前記タスク選択回路は、実行可能に待機している状態を示すＲＥＡＤＹ（レディ）状態のタスクの中から次の実行対象となるタスクを選択し、
前記タスク切換回路は、前記システムコール信号を受信したときの前記タスク選択回路からの出力により次の実行対象となるタスクを選択し、前記処理レジスタのデータを所定の記憶領域に退避させるとともに、実行中のタスクについての状態データをタスク実行中を示すＲＵＮ（ラン）状態から別の状態に設定変更し、選択したタスクについて前記記憶領域に退避されていたデータを前記処理レジスタにロードするとともにそのタスクについての状態データをＲＥＡＤＹ状態からＲＵＮ状態に変更することにより、実行対象となるタスクを切り換え、
前記実行制御回路において、実行中のタスクが前記所定の補助処理を実行させるためのシステムコール命令として補助処理命令を実行するとき、
前記タスク切換回路が、前記補助処理回路に前記補助処理の実行を指示することを特徴とするタスク処理装置。
【請求項２】
前記タスク切換回路は、前記補助処理の実行指示に際し、前記補助処理命令を実行した第１のタスクの前記補助処理回路に対する占有権を設定した上で前記第１のタスクとは異なる第２のタスクをＲＵＮ状態に設定し、前記補助処理回路から前記補助処理の完了を示す補助完了信号が受信されたことを条件として、前記第１のタスクの占有権を解除することを特徴とする請求項１に記載のタスク処理装置。
【請求項３】
前記実行制御回路において、前記第１のタスクは前記補助処理回路の占有を要求するためのシステムコール命令として占有要求命令を実行し、
前記タスク切換回路は、前記補助処理回路について他のタスクによる占有権が設定されていないことを条件として前記第１のタスクの前記補助処理回路に対する占有権を設定し、
前記実行制御回路において、前記第１のタスクは、前記補助処理回路の占有権取得に成功したことを条件として前記補助処理命令を実行することを特徴とする請求項２に記載のタスク処理装置。
【請求項４】
前記タスク切換回路は、前記補助処理命令を実行した第１のタスクの状態レジスタに所定のデータを記録することにより、前記第１のタスクが前記補助処理回路の処理完了を待機中である旨を設定し、
前記タスク選択回路は、前記状態レジスタにおいて前記所定のデータを記録されているタスクを前記タスク切換回路に通知し、
前記タスク切換回路は、前記補助処理回路から前記補助処理の完了を示す補助完了信号が受信されたとき、前記タスク選択回路から通知された前記第１のタスクを再度ＲＵＮ状態に設定することを特徴とする請求項１に記載のタスク処理装置。
【請求項５】
前記補助処理回路は、複数種類の補助処理それぞれに対応して複数個設けられ、
前記実行制御回路において、実行中のタスクが補助処理の種類をパラメータとして前記補助処理命令を実行するとき、
前記タスク切換回路は、複数の補助処理回路のうちパラメータとして指定された補助処理に対応する補助処理回路を選択し、前記選択した補助処理回路に前記補助処理の実行を指示することを特徴とする請求項１に記載のタスク処理装置。
【請求項６】
前記タスク切換回路は、前記補助処理回路の選択に際し、前記補助処理命令を実行したタスクの状態レジスタに対して前記選択した補助処理回路を一意に識別する補助処理ＩＤを記録することにより、前記補助処理命令を実行したタスクが前記選択した補助処理回路の処理完了を待機中である旨を設定し、前記選択した補助処理回路から前記補助処理の完了を示す補助完了信号が受信されたときには前記選択した補助処理回路の補助処理ＩＤを前記タスク選択回路に通知し、
前記タスク選択回路は、前記通知された補助処理ＩＤが記録されているタスクを選択し、
前記タスク切換回路は、前記補助完了信号が受信されたとき、前記選択されたタスクを再度ＲＵＮ状態に設定することを特徴とする請求項５に記載のタスク処理装置。
【請求項７】
前記処理レジスタのデータを退避させるためのレジスタであって、複数のタスクに対してそれぞれ対応づけられる複数の退避レジスタ、を更に備え、
前記タスク切換回路は、前記所定のシステムコール信号を受信すると、実行中のタスクに対応づけられている前記退避レジスタに前記処理レジスタのデータを退避させ、次の実行対象となるタスクに対応づけられている前記退避レジスタのデータを前記処理レジスタにロードすることを特徴とする請求項１に記載のタスク処理装置。
【請求項８】
前記タスク切換回路は、前記補助処理回路から前記補助処理の完了を示す補助完了信号の受信に際して、前記補助処理の結果を示す戻り値を前記補助処理回路から取得し、前記補助処理命令を実行したタスクの退避レジスタに前記戻り値を書き込むことにより前記補助処理の結果を前記補助処理命令を実行したタスクに通知することを特徴とする請求項７に記載のタスク処理装置。
【請求項９】
前記タスク切換回路は、前記補助処理回路から前記補助処理の完了を示す補助完了信号を受信したときには、前記補助処理命令を実行したタスクを再度ＲＵＮ状態に設定することを特徴とする請求項１に記載のタスク処理装置。
【請求項１０】
前記タスク切換回路は、前記補助処理回路から前記補助処理の完了を示す補助完了信号が受信されたことを条件として次の実行対象となるタスクを選択してＲＵＮ状態に設定することにより、前記補助処理の実行中に前記実行制御回路においてタスクが実行されるのを抑止することを特徴とする請求項１に記載のタスク処理装置。
【請求項１１】
前記タスク切換回路は、前記補助処理命令が実行されるとき、前記実行制御回路に対して停止要求信号を送信し、
前記実行制御回路は、前記停止要求信号を受信するとタスクの実行プロセスを進めるための実行用クロックを供給停止させることにより、前記補助処理命令を実行したタスクの実行プロセスを一時停止させ、
前記タスク切換回路は、前記補助完了信号が受信されるとき、前記実行制御回路に対して停止解除信号を送信し、
前記実行制御回路は、前記停止解除信号を受信すると前記実行用クロックの供給停止を解除させることにより、前記補助処理命令を実行したタスクの実行プロセスを再開させることを特徴とする請求項１０に記載のタスク処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、ＯＳ（Operating System）の機能に関し、特に、補助プロセッサ（co-processor）の制御に関する。
【背景技術】
【０００２】
パーソナルコンピュータのような汎用機器用のＯＳに限らず、携帯電話のような専用機器用のＯＳにも高度な機能が求められつつある。特に、１つのＣＰＵ（Central Processing Unit）で複数のタスクを実行可能なＯＳ（以下、このようなタイプのＯＳのことを「マルチタスクＯＳ」ともよぶ）が多くの電子機器に搭載されるようになってきている。【０００３】
マルチタスクＯＳは、ＣＰＵの処理時間を単位時間（タイムスライス）に分割し、複数のタスクにタイムスライスを順番に割り当てる。各タスクは、ＯＳからタイムスライスを与えられたときだけＣＰＵを使用できる。各タイムスライスにおいては一つのタスクが実行される。タイムスライスはユーザからみて非常に短い時間なので、複数のタスクはあたかも同時実行されているかのようにみえる。このような処理方法によれば、タスクＡが入力待機状態に至りＣＰＵの処理能力を当面必要としなくなったとき、別のタスクＢに実行権を与えることでＣＰＵの処理能力を有効活用できる。ここでいう実行権とは、ＣＰＵの使用権と同義である。【０００４】
マルチタスクＯＳがタスクの実行権の切り換えることを「タスクスイッチ」とよぶ。タスクスイッチは、タイムスライスが経過したときや、タスクが所定命令を実行したときに発生する。マルチタスクＯＳは、タスクスイッチの実行タイミングに至ると、実行中のタスクのコンテキスト情報をＴＣＢ（Task Control Block）に退避させる。コンテキスト情報とは、タスク実行時においてＣＰＵのレジスタに格納されていたデータやタスクの実行状態に関するデータである。ＴＣＢとは、タスク固有の情報を保持するためにメモリに確保される領域である。マルチタスクＯＳは、実行中のタスクのコンテキスト情報をＴＣＢに退避させたあと、次に実行権を割り当てるタスクを選択し、そのタスクのＴＣＢからコンテキスト情報を読み出して、ＣＰＵレジスタにロードする。このようにして、各タスクはタイムスライスを単位として少しずつ自己の処理を進めていく。【０００５】
マルチタスクＯＳは、複数のタスクを効率的に実行できるというメリットがあるが、コンテキスト情報の退避・ロードというオーバーヘッドが新たに発生するというデメリットもある。通常、マルチタスクＯＳのメリットはタスクスイッチにともなうオーバーヘッドを補って余りある。
【特許文献１】特開平１１−２７２４８０号公報
【特許文献２】特開２００１−７５８２０号公報
【特許文献３】特開平１１−２３４３０２号公報
【特許文献４】特開２０００−１０８０３号公報
【特許文献５】特開２０００−２７６３６２号公報
【非特許文献１】森久直、坂巻佳壽美、重松宏志、「組込み制御システム向けリアルタイムＯＳのハードウェア化（Hardware implementation of a read-time operating system for embedded control system）」、東京都立産業技術研究所研究報告、日本、２００５年８月４日（原稿受付）、８、ｐ．５５−５８
【発明の開示】
【発明が解決しようとする課題】
【０００６】
近年においては、決められた時間内に処理が完了することを厳密に要求するリアルタイムＯＳ（以下、「ＲＴＯＳ（Real-Time Operating System）」）が組込システム（Embedded System）を中心として普及しつつある。このような時間的要件の厳しいＲＴＯＳにおいては、タスクスイッチ時のオーバーヘッドがシステム全体のパフォーマンスに大きく影響することがある。【０００７】
また、タスクの一部をＣＰＵ以外の補助プロセッサに委譲することも多い。補助プロセッサとしては、たとえば、ＤＭＡＣ（Direct Memory Access Controller）、浮動小数点演算ユニット（ＦＰＵ：Floating-point Processing Unit）、暗号処理ユニットなどがある。以下、補助プロセッサが実行する処理のことを「補助処理」とよぶ。補助プロセッサは特定の補助処理の専用回路である。このため、一般的には、同じの補助処理をＣＰＵで実行するよりも補助プロセッサで実行する方が高速である。しかし、ＣＰＵと補助プロセッサという複数のハードウェア資源を利用する上では特有のオーバーヘッドが発生する。ＲＴＯＳのパフォーマンスをいっそう向上させるためには、補助処理にともなうオーバーヘッドを抑制することが重要である。【０００８】
本発明は、本発明者による上記課題認識に基づいて完成されたものであり、その目的は、マルチタスク処理においてより効率的にタスクを実行制御するための技術を提供することであり、特に、補助処理を高速化するための技術、を提供することにある。
【課題を解決するための手段】
【０００９】
本発明のある態様は、タスク処理装置である。
この装置は、処理レジスタと、メモリから処理レジスタにデータをロードし、処理レジスタのデータにしたがってタスクを実行する実行制御回路と、タスクごとの状態データを保持する状態レジスタと、タスクの実行状態を制御するタスク切換回路と、所定の選択条件によりタスクを選択するタスク選択回路と、補助処理を実行する補助処理回路、を備える。
実行制御回路は、システムコール命令を実行するとき、その旨をタスク切換回路に通知する。タスク選択回路は、実行可能に待機している状態を示すＲＥＡＤＹ（レディ）状態のタスクの中から実行対象となるタスクを選択する。
タスク切換回路は、システムコール命令実行時におけるタスク選択回路からの出力により次の実行対象となるのタスクを選択し、処理レジスタのデータを所定の記憶領域に退避させるとともに、実行中のタスクの状態データを設定変更し、選択したタスクについて記憶領域に退避されていたデータを処理レジスタにロードするとともにその状態データをＲＥＡＤＹ状態からＲＵＮ（ラン）状態に変更することにより、実行対象となるタスクを切り換える。
タスクが補助処理の実行を要求すると、タスク切換回路が補助処理回路に補助処理の実行を指示する。【００１０】
処理レジスタにロードされるデータは、命令（instruction）とオペランド、オペランドを持たない命令、あるいは、プログラムカウンタやスタックポインタのような単純なデータであってもよい。このような処理方法によれば、状態レジスタによりタスクの状態を管理するので、タスク切換回路はタスク選択回路からの出力に基づいてタスクスイッチを実行できる。タスクが補助処理の実行を要求するとき、タスク切換回路がこの実行要求を一元的に受け付け、補助処理回路に補助処理の実行を指示してもよい。この場合、タスク切換回路により補助処理制御を一元的に管理できる。【００１１】
なお、以上の構成要素の任意の組合せ、本発明を方法、システム、記録媒体、コンピュータプログラムにより表現したものもまた、本発明の態様として有効である。
【発明の効果】
【００１２】
本発明によれば、マルチタスク処理において、より効率的なタスクの実行制御が実現される。
【図面の簡単な説明】
【００１３】
【図１】タスクの状態遷移図である。
【図２】一般的なＲＴＯＳの概念図である。
【図３】ソフトウェアＲＴＯＳが実行される一般的なＣＰＵの回路図である。
【図４】本実施例におけるＲＴＯＳの概念図である。
【図５】基本例におけるタスク処理装置の回路図である。
【図６】図５のＣＰＵの回路図である。
【図７】実行制御回路１５２がＣＰＵクロックを停止させる仕組みを示す回路図である。
【図８（ａ）】割り込み要求信号発生時における各種信号の関係を示すタイムチャートである。
【図８（ｂ）】システムコール実行時における各種信号の関係を示すタイムチャートである。
【図９】パイプライン処理におけるＣＰＵクロックの停止タイミングを説明するための模式図である。
【図１０】状態記憶部とタスク切換回路の関係を示す回路図である。
【図１１】一般的なＲＴＯＳによるＲＵＮ−タスク選択に際して利用されるタスクレディリストを示す図である。
【図１２】実行選択回路の回路図である。
【図１３】一般的なＲＴＯＳによるセマフォ処理において利用されるウェイトセマフォリストを示す図である。
【図１４】セマフォ選択回路の回路図である。
【図１５】タスク切換回路の状態遷移図である。
【図１６】図５のタスク処理装置のうち、タスク制御回路を搭載しないタスク処理装置の回路図である。
【図１７】図５のタスク処理装置のうち、退避回路を搭載しないタスク処理装置の回路図である。
【図１８】改良例１におけるタスク処理装置の回路図である。
【図１９】改良例１におけるタスク制御回路の部分的な回路図である。
【図２０】キュー制御回路の回路図である。
【図２１】仮想キューとタスクの関係を示す概念図である。
【図２２】図２１に対応した状態レジスタのデータ構造図である。
【図２３】図２１の仮想キューにタスク（Ｅ４）を順投入するときの概念図である。
【図２４】図２３に対応した状態レジスタのデータ構造図である。
【図２５】図２３の仮想キューにタスク（Ｅ５）を順投入するときの概念図である。
【図２６】図２５に対応した状態レジスタのデータ構造図である。
【図２７】順投入の処理過程を示すフローチャートである。
【図２８】最大値選択回路の部分的な回路図である。
【図２９】図２５の仮想キューにタスク（Ｅ６）を逆投入するときの概念図である。
【図３０】図２９に対応した状態レジスタのデータ構造図である。
【図３１】逆投入の処理過程を示すフローチャートである。
【図３２】タスク選択回路の部分的な回路図である。
【図３３】図２９の仮想キューからタスク（Ｅ３）を抽出するときの概念図である。
【図３４】図３３に対応した状態レジスタのデータ構造図である。
【図３５】抽出の処理過程を示すフローチャートである。
【図３６】再実行優先型タスクスケジューリングにおける仮想キューとタスクの関係を示す第１の概念図である。
【図３７】再実行優先型タスクスケジューリングにおける仮想キューとタスクの関係を示す第２の概念図である。
【図３８】ソフトウェアＯＳにより補助処理を実行する場合の一般的な回路構成を示す図である。
【図３９】一般的な直列型補助処理の制御方法を示すタイムチャートである。
【図４０】一般的な並列型補助処理の制御方法を示すタイムチャートである。
【図４１】基本例のタスク処理装置により図３８から図４０までに示した補助処理制御を実現する場合の回路構成を示す図である。
【図４２】改良例２においてタスク処理装置とＨＷＦの関係を示す回路構成図である。
【図４３】改良例２における状態記憶部とタスク切換回路の関係を示す回路図である。
【図４４】改良例２における直列型補助処理の制御方法を示すタイムチャートである。
【図４５】改良例２における並列型補助処理の制御方法を示すタイムチャートである。
【発明を実施するための最良の形態】
【００１４】
まず、マルチタスクＯＳのタスクスケジューリングを電子回路により実現するタスク処理装置１００について「基本例」として説明する。次に、改良例２におけるタスク処理装置１００にとって好適な「両投入型キューアルゴリズム（後述）」のハードウェア実装について「改良例１」として説明する。最後に、補助処理を高速化したタスク処理装置１００について「改良例２」として説明する。
以下、「本実施例」というときには、原則として、「基本例」および「改良例１」、「改良例２」のすべてを示すものとする。
｛基本例｝【００１５】
本実施例に示すタスク処理装置１００は、マルチタスクＯＳのタスクスケジューリング機能を電子回路により実現している。タスク処理装置１００の詳細を説明する前に、まず図１に関連してタスクの状態遷移について説明する。ここでは一般的なマルチタスクＯＳにおけるタスクの状態遷移として説明するが、タスク処理装置１００によるタスクの状態遷移についても同じである。また、タスク処理装置１００において実行されるシステムコールについても概説する。図２および図３に関連して一般的なマルチタスクＯＳの設計思想について述べた上で、図４から図１０に関連して、基本例におけるタスク処理装置１００の処理方法について詳述する。更に、セマフォ（Semaphore）やミューテックス（Mutex）、イベントなどに関する処理についても、適宜、一般的な技術と比較しながらタスク処理装置１００の特徴を説明していく。
［タスクの状態遷移］【００１６】
図１は、タスクの状態遷移図である。
マルチタスク処理において、各タスクは「状態（ステート）」を持つ。各タスクは、後述する複数の状態間を遷移し、常に、いずれかの状態となっている。状態遷移の契機となるのは、「システムコールの実行」と「割り込み要求信号の検出」である。システムコールとは各タスクが実行する命令のうちの特別な命令である。割り込み要求信号とは、キーボードの押下やマウスのクリック、通信データの受信など、周辺機器から所定データを受け取ったときに発生する信号である。もちろん、各タスクに割り当てられるタイムスライスが消費されたときにも状態遷移が発生する。【００１７】
タスクは「一般タスク」と「特殊タスク」の２種類に大別される。一般タスクとは、システムコールを契機として実行される通常のタスクである。特殊タスクは、割り込み要求信号の検出を契機として実行されるタスクである。いわゆる割り込みハンドラである。まず、各タスク状態について述べた後、各種システムコール命令について説明する。【００１８】
（１）ＳＴＯＰ状態（休止状態）
タスクが休止状態にあることを示す。一般タスクも特殊タスクもＳＴＯＰ状態となり得る。以下、ＳＴＯＰ状態にあるタスクのことを「ＳＴＯＰ−タスク」とよぶ。
１−１．一般タスク
他のタスクが別のタスクの起動を指示するシステムコール（以下、「起動システムコール」とよぶ）を実行すると、ＳＴＯＰ状態にある一般タスクは後述のＲＥＡＤＹ状態に遷移する。
１−２．特殊タスク
特殊タスクは、通常、ＳＴＯＰ状態にある。後述のタスク切換回路２１０により割り込み要求信号が検出されると、特殊タスクはＳＴＯＰ状態から後述のＲＵＮ状態に遷移する。このときＲＵＮ状態にあったタスクは入れ替わりにＲＥＡＤＹ状態に遷移する。【００１９】
（２）ＲＵＮ状態（実行状態）
タスクが実行中であることを示す。すなわち、タスクがタイムスライスを割り当てられ、ＣＰＵの使用権を取得している状態である。一般タスクも特殊タスクもＲＵＮ状態となり得る。以下、ＲＵＮ状態にあるタスクのことを「ＲＵＮ−タスク」とよぶ。複数のタスクのうち、ＲＵＮ状態になることができるタスクは常に１つだけであり、同時に２つのタスクがＲＵＮ状態となることはできない。
２−１．一般タスク
ＲＵＮ状態にある一般タスクは、所定のシステムコールを実行するとＲＵＮ状態からＲＥＡＤＹ状態または後述するＷＡＩＴ状態に遷移する。ＲＵＮ状態にある一般タスクは、タイムスライスを消費したときにも、ＲＥＡＤＹ状態に遷移する。いずれの場合においても、ＲＵＮ状態にあった一般タスクの代わりに、ＲＥＡＤＹ状態にある一般タスクがＲＵＮ状態に遷移する。割り込み要求信号が検出されると、ＲＵＮ−タスクはＲＥＡＤＹ状態に遷移する。このときには、ＳＴＯＰ状態にある特殊タスクがＲＵＮ状態に遷移する。
ＲＵＮ−タスクが自らを終了させるシステムコール（以下、「終了システムコール」とよぶ）を実行すると、ＲＵＮ−タスクはＳＴＯＰ状態に遷移する。
２−２．特殊タスク
割り込み要求信号によりＳＴＯＰ状態からＲＵＮ状態に遷移した特殊タスクは、自処理が完了するとＳＴＯＰ状態に戻る。特殊タスクが取り得る状態はＳＴＯＰ状態とＲＵＮ状態のみである。【００２０】
（３）ＲＥＡＤＹ状態（実行可能状態）
タスクが実行可能な状態にあることを示す。ＲＥＡＤＹ状態にあるタスクは、ＯＳから実行権を与えられればいつでもＲＵＮ状態に遷移できる。一般タスクのみＲＥＡＤＹ状態となり得る。以下、ＲＥＡＤＹ状態にあるタスクのことを「ＲＥＡＤＹ−タスク」とよぶ。
ＲＵＮ状態にある一般タスクがシステムコールの実行によりＲＵＮ状態以外の状態に遷移するとき、または、ＲＵＮ状態にある特殊タスクが自らの処理を終了してＳＴＯＰ状態に遷移するとき、ＲＥＡＤＹ−タスクが入れ替わりにＲＵＮ状態に遷移する。一般タスクは、ＲＥＡＤＹ状態からのみＲＵＮ状態に遷移する。ＲＥＡＤＹ状態にあるタスクが複数存在するときには、コンテキスト情報の一部であるタスク優先順位に基づいて、いずれか一つのＲＥＡＤＹ−タスクがＲＵＮ状態に遷移する。タスク優先順位が同じとなるＲＥＡＤＹ−タスクが複数存在するときには、ＲＥＡＤＹ状態に移行したのが最も古いタスクがＲＵＮ状態に遷移する。【００２１】
（４）ＷＡＩＴ状態（待機状態）
タスクが所定のＷＡＩＴ解除条件の成立を待っている状態を示す。ＷＡＩＴ解除条件が成立すると、ＷＡＩＴ状態にあるタスクはＲＥＡＤＹ状態に遷移する。一般タスクのみＷＡＩＴ状態となり得る。以下、ＷＡＩＴ状態にあるタスクのことを「ＷＡＩＴ−タスク」とよぶ。ＷＡＩＴ解除条件に関しては後に詳述する。【００２２】
以上をまとめると、各タスクはＲＵＮ状態にあるときだけＣＰＵを使って自らの処理を進めることができる。ＲＴＯＳは、複数のタスクの状態を管理しながら、適宜、ＲＵＮ−タスクを切り換える。これにより、ＣＰＵが常時いずれかのタスクを実行する処理形態が実現される。
［システムコール］【００２３】
次に、システムコールについて付言しておく。システムコールは、「起動系」、「ＷＡＩＴ系」、「ＳＥＴ系」の３種類に大別される。
（１）起動系システムコール
ＳＴＯＰ状態とＲＥＡＤＹ状態の間の遷移に関連するシステムコールである。
１−１．起動システムコール
ＲＵＮ−タスクであるタスクＡが別の一般タスクＢを起動させるシステムコールである。このとき、ＳＴＯＰ状態にある一般タスクＢはＲＥＡＤＹ状態に遷移する。
１−２．終了システムコール
このシステムコールを実行したタスクは、自己の処理を終了させ、ＲＵＮ状態からＳＴＯＰ状態に遷移する。終了システムコールは、あるタスクが別のタスクを終了させる命令であってもよい。
（２）ＷＡＩＴ系システムコール
ＲＵＮ状態とＷＡＩＴ状態の間の遷移に関連するシステムコールである。
２−１．ウェイトセマフォシステムコール
セマフォ（後述）の獲得を要求するシステムコールである。
２−２．ウェイトミューテックスシステムコール
ミューテックス（後述）の獲得を要求するシステムコールである。
２−３．ウェイトイベントシステムコール
イベント（後述）の成立を待つシステムコールである。イベントＩＤのほか、待機フラグパターン（後述）やフラグ条件（後述）を変数として実行される。
いずれの場合においても、ＷＡＩＴ系システムコールにより、さまざまなＷＡＩＴ解除条件が設定される。ＷＡＩＴ系システムコールの実行時において、既にＷＡＩＴ解除条件が成立する状況にあるときには、システムコールを実行したＲＵＮ−タスクはＲＥＡＤＹ状態に遷移する。一方、ＷＡＩＴ解除条件が成立していないときには、ＲＵＮ−タスクは、ＷＡＩＴ解除条件の成立を待機するＷＡＩＴ状態に遷移する。
（３）ＳＥＴ系システムコール
ＷＡＩＴ状態とＲＥＡＤＹ状態の間の遷移に関連するシステムコールである。ＳＥＴ系システムコールの実行は、ＷＡＩＴ解除条件の成立契機となる。
３−１．リリースセマフォシステムコール
セマフォを解放するシステムコールである。
３−２．リリースミューテックスシステムコール
ミューテックスを解放するシステムコールである。
３−３．セットイベントシステムコール
イベントのカレントフラグパターン（後述）を設定するシステムコールである。
３−４．クリアフラグシステムコール
カレントフラグパターンをゼロクリアするためのシステムコールである。
本実施例においては、以上の計９種類のシステムコールを対象として説明するが、これ以外にもさまざまなシステムコールを実装可能であることはいうまでもない。
［一般的なＲＴＯＳの設計思想］【００２４】
図２は、一般的なＲＴＯＳの概念図である。
このＲＴＯＳはマルチタスクＯＳである。一般的なＲＴＯＳはソフトウェアとして実現される。タスクＡからタスクＢへＲＵＮ−タスクを切り換える場合を例として説明する。タスクＡがＣＰＵを占有しているので、ＲＴＯＳはＣＰＵに割り込みをかけて、ＣＰＵの使用権をタスクＡから取り上げる。その上で、タスクＡのコンテキスト情報をＴＣＢに退避させる。ＲＴＯＳは、次のＲＵＮ−タスクとしてタスクＢを選択し、タスクＢのＴＣＢからコンテキスト情報をＣＰＵのレジスタにロードする。ロードが完了すると、ＲＴＯＳはＣＰＵの使用権をタスクＢに渡す。このように、ＲＴＯＳは、一時的にＣＰＵの使用権を取得することにより、タスクＡからタスクＢへのタスクスイッチを実行する。特殊タスクの実行に関しても同様である。この場合にも、ＲＵＮ−タスクのコンテキスト情報をＴＣＢに退避させた後、特殊タスクにＣＰＵの使用権を渡すことによりタスクスイッチを実現している。
ＲＴＯＳは、ソフトウェアとして実現されるため、自らの処理を実行するためにはＣＰＵの使用権を必要とする。いいかえれば、ＲＴＯＳとタスクは、ＣＰＵの使用に関して競合関係にある。以下、このようにソフトウェアによって実現されるＲＴＯＳのことを「ソフトウェアＲＴＯＳ」とよぶ。【００２５】
図３は、ソフトウェアＲＴＯＳが実行される一般的なＣＰＵの回路図である。
ＣＰＵ８４は、メモリアクセスや命令の実行等を統括的に制御する実行制御回路９０と、タスクのコンテキスト情報など各種データを格納する処理レジスタ９２、演算を実行する演算回路９４を含む。処理レジスタ９２は複数種類のレジスタの集合であり、特殊レジスタ８８と汎用レジスタ８６に大別される。特殊レジスタ８８は、プログラムカウンタ、スタックポインタ、フラグ等を保持するレジスタである。汎用レジスタ８６は、作業用のデータを保持するレジスタであり、Ｒ０〜Ｒ１５までの計１６レジスタを含む。特殊レジスタ８８は、ユーザ用とシステム用の２面が存在するが、汎用レジスタ８６は一面のみである。以下、処理レジスタ９２に格納されるデータのことを「処理データ」とよぶ。【００２６】
実行制御回路９０は、出力セレクタ９８に対する制御信号（ＣＴＲＬ）により、処理レジスタ９２のうちの所望のレジスタの処理データを演算回路９４に出力させる。演算回路９４は、処理データ、すなわち、命令や変数にしたがって演算を実行する。演算結果は入力セレクタ９６へ出力される。実行制御回路９０は、入力セレクタ９６に対する制御信号（ＣＴＲＬ）により、処理レジスタ９２のうちの所望のレジスタに演算結果を入力する。【００２７】
また、実行制御回路９０は、ＣＰＵデータバスを介してメモリからデータを読み出し、入力セレクタ９６を介して処理レジスタ９２に適宜ロードする。実行制御回路９０は、同じくＣＰＵデータバスを介して処理データをメモリに適宜記録する。実行制御回路９０は、特殊レジスタ８８のプログラムカウンタを更新しながら、タスクを実行する。【００２８】
タスクスイッチが発生するときには、実行制御回路９０は処理データをメモリ上の領域であるＴＣＢに退避させる。仮にタスクＡがシステムコールを実行し、タスクＡからタスクＢへのタスクスイッチが発生したとする。ＲＴＯＳはシステムコール実行を契機としてＣＰＵの使用権を取得するので、ＣＰＵ８４は一時的にＲＴＯＳ用のプログラムにしたがって動作することになる。その処理過程は以下の通りである。
＜タスクＡのコンテキスト情報の退避＞【００２９】
１．実行制御回路９０は、特殊レジスタ８８をユーザ用からシステム用に切り換える。システム用の特殊レジスタ８８にはＲＴＯＳ処理用の処理データがロードされている。
２．実行制御回路９０は、汎用レジスタ８６のデータを図示しないスタックに退避させる。
３．実行制御回路９０は、図示しない記憶媒体、たとえば、別のレジスタから、ＲＴＯＳのための処理データを汎用レジスタ８６にロードする。この段階で、処理レジスタ９２の処理データは、完全にＲＴＯＳ用の処理データに入れ替わる。
４．ＲＴＯＳは、メモリからタスクＡのＴＣＢを検出し、スタックに退避されている処理データをＴＣＢに書き込む。また、ユーザ用の特殊レジスタ８８の処理データもコンテキスト情報の一部としてＴＣＢに書き込む。こうして、タスクＡの処理データがＴＣＢに退避される。ＲＴＯＳは、タスクＡが「ＲＵＮ」から「ＲＥＡＤＹ（またはＷＡＩＴ）」に状態遷移したことをタスクＡのＴＣＢに記録する。
＜タスクＢのコンテキスト情報のロード＞【００３０】
１．ＲＴＯＳは、メモリからタスクＢのＴＣＢを検出し、ＴＣＢのコンテキスト情報をスタックと特殊レジスタ８８に書き込む。ＲＴＯＳは、タスクＢが「ＲＥＡＤＹ」から「ＲＵＮ」に状態遷移したことをタスクＢのＴＣＢに記録する。
２．ＲＴＯＳは、ＲＴＯＳ処理用のデータを汎用レジスタ８６から図示しない記録媒体に退避させる。
３．実行制御回路９０は、スタックのコンテキスト情報を汎用レジスタ８６にロードする。実行制御回路９０は、特殊レジスタ８８をシステム用からユーザ用に切り換える。こうして、タスクＢの処理データが処理レジスタ９２にロードされる。【００３１】
以上のような処理過程を経て、タスクスイッチが実現される。通常、汎用レジスタ８６は一面構成のため、タスク用の処理データとＲＴＯＳ用の処理データを切り換えるためにスタックを使っている。汎用レジスタ８６も２面化すれば、スタックを介して退避・ロードする必要がなくなるため、より高速なタスクスイッチが可能である。【００３２】
本実施例においては、更に、タスクごとに退避レジスタ１１０を設けることにより、いっそう高速なタスクスイッチを実現している。退避レジスタ１１０を使ったタスクスイッチについては図５に関連して詳述する。図３に関連して説明したＣＰＵ８４と一般的なソフトウェアＲＴＯＳの場合、タスクスイッチに際して、頻繁にＴＣＢへのアクセスが発生していることがわかる。上記設例では、タスクＡからタスクＢにタスクスイッチするという前提で説明したが、実際には、ＲＴＯＳが次に実行すべきタスクＢを選択するためにも多くの命令を実行する必要がある。このときにも、ＲＴＯＳは頻繁にメモリにアクセスすることになる。本実施例におけるタスク処理装置１００は、後述のタスク制御回路２００がタスク選択処理を専用に実行するため、更に高速なタスクスイッチを実現している。
［タスク処理装置１００によるＲＴＯＳのハードウェア化］【００３３】
図４は、本実施例におけるＲＴＯＳの概念図である。
一般的なソフトウェアＲＴＯＳと異なり、本実施例におけるＲＴＯＳは、主として、ＣＰＵとは別個のハードウェアとして実現される。以下、ハードウェアによって実現されるＲＴＯＳのことを、「ハードウェアＲＴＯＳ」とよぶ。本実施例のＲＴＯＳは、主として、ＣＰＵとは別個のハードウェアであるため、自らの処理を実行するためにはＣＰＵの使用権を実質的にほとんど必要としない。いいかえれば、ＲＴＯＳとタスクは、ＣＰＵの使用に関してほとんど競合関係にない。図２に示した一般的なソフトウェアＲＴＯＳの場合、ＣＰＵはタスク実行用回路であるとともに、ＲＴＯＳ実行用回路でもあった。これに対し、本実施例におけるハードウェアＲＴＯＳの場合、ＣＰＵはタスク実行回路として明確化され、タスクスケジューリング機能は後述の退避回路１２０とタスク制御回路２００を中心として実現することができる。【００３４】
図５は、基本例におけるタスク処理装置１００の回路図である。
タスク処理装置１００は、ＣＰＵ１５０に加えて退避回路１２０とタスク制御回路２００を含む。ＣＰＵ１５０はタスクの実行主体であり、退避回路１２０とタスク制御回路２００が図４に示したＲＴＯＳの役割を担う回路である。タスクススケジューリング処理は、タスク制御回路２００により主導される。【００３５】
ＣＰＵ１５０は、実行制御回路１５２、処理レジスタ１５４および演算回路１６０を含む。ＣＰＵ１５０は、図３に関連して説明した一般的なＣＰＵであってもよい。ただし、本実施例におけるＣＰＵ１５０は、図３に示したＣＰＵ８４とは信号線の接続方法等が若干変更されている。具体的な回路構成については次の図６に関連して詳述する。【００３６】
タスク制御回路２００は、タスク切換回路２１０、セマフォテーブル２１２、イベントテーブル２１４、タスク選択回路２３０および状態記憶部２２０を含む。セマフォテーブル２１２とイベントテーブル２１４については、図１３以降に関連して詳述する。状態記憶部２２０は、タスクごとに対応づけられたユニットである。以下、タスクＡに対応する状態記憶部２２０のことを「状態記憶部２２０_Ａ」のように表記する。各状態記憶部２２０は、タスクの状態データを保持する。状態データとは、コンテキスト情報のうち、特に、タスク優先順位や状態など、タスクの属性を示す情報である。具体的なデータの内容については、図１０に関連して後述する。各状態記憶部２２０からは、全タスクの全状態データがタスク選択回路２３０に常時出力している。タスク選択回路２３０は、各タスクの状態データに基づいて、ＲＵＮ−タスクの選択等、各種タスク選択を行う回路である。タスク選択回路２３０についても図１０以降に関連して詳述する。タスク切換回路２１０は、実行制御回路１５２から受信するシステムコール信号（ＳＣ）や外部装置からの割り込み要求信号（ＩＮＴＲ）を検出すると、タスクスイッチを実行する。【００３７】
実行制御回路１５２はシステムコール実行時には、システムコール信号（ＳＣ）をタスク切換回路２１０に送信する。また、タスク切換回路２１０が割り込み要求信号（ＩＮＴＲ）を検出したときには、タスク切換回路２１０は実行制御回路１５２に対して停止要求信号（ＨＲ）をアサートする。実行制御回路１５２は、ＣＰＵ１５０の動作が停止しているときには停止完了信号（ＨＣ）をタスク切換回路２１０にアサートする。これら３種類の信号によって、ＣＰＵ１５０とタスク制御回路２００が連係動作することになる。【００３８】
退避回路１２０は、ロード選択回路１１２および複数の退避レジスタ１１０を含む。退避レジスタ１１０も、タスクごとに対応づけられたユニットであり、処理レジスタ１５４の処理データを退避させるためのレジスタである。したがって、退避レジスタ１１０は、処理レジスタ１５４と同等以上のデータ容量を持つ。以下、タスクＡに対応する退避レジスタ１１０のことを「退避レジスタ１１０_Ａ」のように表記する。ロード選択回路１１２は、タスク切換回路２１０から指示されると、いずれかの退避レジスタ１１０のデータ（以下、退避レジスタ１１０が保持するデータのことを「退避データ」とよぶ）を処理レジスタ１５４にロードする。【００３９】
各退避レジスタ１１０はそれぞれの退避データをロード選択回路１１２に常時出力する。タスク切換回路２１０がロード選択回路１１２にタスクＩＤを指定したタスク選択信号（ＴＳ）を入力すると、ロード選択回路１１２は指定されたタスクに対応する退避レジスタ１１０の退避データを処理レジスタ１５４に出力する。更に、タスク切換回路２１０が処理レジスタ１５４に対して書き込み信号（ＷＴ）を入力すると、その退避データは処理レジスタ１５４に実際にロードされる。【００４０】
一方、処理レジスタ１５４の全処理データも全退避レジスタ１１０に常時出力されている。タスク切換回路２１０が所望の退避レジスタ１１０に対して書き込み信号（ＷＴ）をアサートすると、その退避レジスタ１１０に処理データが退避される。ここで、処理レジスタ１５４と各退避レジスタ１１０を接続するバスが一度に伝送可能なビット数は、処理データをパラレル転送できるように設定されている。そのため、タスク切換回路２１０は、退避レジスタ１１０に書き込み信号を一度送信するだけで、処理データを退避レジスタ１１０に一気に書き込むことができる。また、退避レジスタ１１０とロード選択回路１１２、ロード選択回路１１２とＣＰＵ１５０を接続するバスのビット数も同様に設定されている。
以下、システムコールと割り込み要求信号のそれぞれについてタスクスイッチの実行方法を説明する。
［１］システムコール実行【００４１】
ＣＰＵ１５０の実行制御回路１５２がシステムコールを実行するとき、実行制御回路１５２はＣＰＵ１５０のクロック（以下、「ＣＰＵクロック（ＣＬＫ）」とよぶ）を停止させる。具体的な停止方法については、図７等に関連して後に詳述する。実行制御回路１５２は、システムコールの実行を示すシステムコール信号（ＳＣ）をタスク制御回路２００のタスク切換回路２１０に送信する。また、ＣＬＫが停止完了すると、実行制御回路１５２は停止完了信号（ＨＣ）をタスク切換回路２１０にアサートする。【００４２】
ＣＰＵ１５０とタスク切換回路２１０の間には、システムコール信号伝送用に９本の信号線が接続されている。９本の信号線は先述した９種類のシステムコールに対応する。実行制御回路１５２は、実行されたシステムコールの種類に応じて、いずれかのシステムコール信号線にてデジタルパルスを伝送する。タスク切換回路２１０は、９本のシステムコール信号線のうち、どの信号線からデジタルパルスが検出されたかに応じて、即座に実行されたシステムコールの種類を検出できる。タスク切換回路２１０は、システムコールの種類に応じて、タスク選択回路２３０の出力データから必要なデータを選択し、システムコールにより指示された処理を実行する。この処理は、ＨＣがアサートされたことを条件として実行される。タスク切換回路２１０とタスク選択回路２３０の関係については、図１０に関連して詳述する。なお、システムコールのパラメータや戻り値は、処理レジスタ１５４のうち、所定の汎用レジスタ１５８に書き込まれる。タスク切換回路２１０は汎用レジスタ１５８に対してパラメータの読み出しや戻り値の書き込みを実行可能である。ここでは、ＲＵＮ−タスクであるタスクＡがウェイトセマフォシステムコールを実行したとする。したがって、まず、タスクＡの処理データを退避させる必要がある。
＜タスクＡのコンテキスト情報の退避＞【００４３】
実行制御回路１５２は、ウェイトセマフォシステムコールを示すＳＣ信号をタスク切換回路２１０に入力する。実行制御回路１５２はＣＬＫを停止させ、停止が完了するとＨＣをアサートする。タスク切換回路２１０はタスク選択回路２３０に内蔵される各種選択回路のうち、後述のセマフォ選択回路２３４に対して待機対象となるセマフォのセマフォＩＤを出力した上で、次に実行すべきタスクＢを選択する。タスク切換回路２１０は、状態記憶部２２０_Ａに対して所定データを書き込む。たとえば、タスクＡの状態として「ＲＵＮ」から「ＲＥＡＤＹ」や「ＷＡＩＴ」に設定変更する。より具体的には、タスク切換回路２１０は、状態データのうちタスク状態を示すデータとして「ＷＡＩＴ」を全状態記憶部２２０に出力した上で、状態記憶部２２０_Ａだけに書き込み信号（ＷＴ_Ａ）を入力する。こうして、タスクＡの状態が設定変更される。【００４４】
次に、タスク切換回路２１０は、退避レジスタ１１０_Ａに対して書き込み信号（ＷＴ）を出力する。処理レジスタ１５４の処理データは、常時、各退避レジスタ１１０に出力されているので、この書き込み信号（ＷＴ）によりタスクＡの退避レジスタ１１０_Ａに退避される。
＜タスクＢのコンテキスト情報のロード＞【００４５】
タスク切換回路２１０は、タスクＡの状態データの変更、処理データの退避が完了すると、タスクＢを指定したタスク選択信号（ＴＳ_Ｂ）をロード選択回路１１２に出力する。これにより、退避レジスタ１１０_Ｂの退避データが処理レジスタ１５４に出力される。タスク切換回路２１０は、処理レジスタ１５４に書き込み信号（ＷＴ）を出力すると、タスクＢの退避データが処理レジスタ１５４にロードされる。また、タスク切換回路２１０は、タスクＢの状態記憶部２２０に対して所定データを書き込む。たとえば、タスクＢの状態を「ＲＥＡＤＹ」から「ＲＵＮ」に設定変更する。以上の処理が完了すると、実行制御回路１５２はＣＰＵクロックを再開させる。ＣＰＵ１５０は、再開されたＣＰＵクロックによりタスクＢの実行を開始する。処理方法の更なる詳細については、図８（ｂ）に関連して後述する。
［２］割り込み要求信号の発生【００４６】
タスク切換回路２１０は周辺機器からの割り込み要求信号（ＩＮＴＲ）を検出する。より具体的には、割り込み要求信号（ＩＮＴＲ）は、図示しない割込コントローラからタスク切換回路２１０に送信される。割り込み要求信号（ＩＮＴＲ）のレベルを示すパラメータは、割込コントローラが内蔵するレジスタに記録される。タスク切換回路２１０は実行制御回路１５２に停止要求信号（ＨＲ）をアサートし、実行制御回路１５２はＣＰＵクロックを停止させる。システムコール実行時と同様、タスク切換回路２１０はＲＵＮ−タスクの処理データを退避レジスタ１１０に退避させる。次に、タスク切換回路２１０は特殊タスクを起動する。割り込み要求信号のパラメータに関わらず起動される特殊タスクは１種類である。特殊タスクは、割込コントローラの内蔵レジスタからＩＮＴＲのパラメータを読み出し、パラメータに応じた処理を実行する。特殊タスクが実行する処理は、セットイベントシステムコールやセットセマフォシステムコールの実行かもしれないし、一般タスクの起動かもしれない。パラメータによっては、特殊タスクは特段の処理を実行せずに終了するかもしれない。ＩＮＴＲのパラメータによってどのような処理を実行するかは特殊タスクの実装による。特殊タスクが実行終了すると、ＲＥＡＤＹ−タスクの中から次のＲＵＮ−タスクが選択される。【００４７】
タスク切換回路２１０は、特殊タスクに対応した退避レジスタ１１０の処理データをＣＰＵ１５０にロードさせる。このような一般タスクから特殊タスクへの切り換えのために要する時間は、タスク制御回路２００の動作クロックによってあらかじめ見積もることができる。ＨＲを実行制御回路１５２にアサートしてからタスク切換回路２１０の動作クロックが所定クロック分経過すると、タスク切換回路２１０はＣＰＵクロックの停止を解除するためにＨＲをネゲートする。実行制御回路１５２はＨＲをネゲートされるとＣＰＵクロックを再開させる。このときには、タスク切換回路２１０によって一般タスクから特殊タスクへのタスクスイッチが完了している。処理方法の詳細については、図８（ａ）に関連して後述する。【００４８】
いずれの場合においても、
（Ａ）処理データの退避・ロード
（Ｂ）タスクの状態遷移およびＲＵＮ−タスクの選択
というタスクスイッチの中核となる処理をハードウェアにより実現している。（Ａ）および（Ｂ）に関し、メモリ上のＴＣＢにアクセスする必要がなくなることもタスクスイッチの高速化に寄与している。また、タスク処理装置１００を実現するにあたり、ＣＰＵ１５０については、ＣＰＵクロックを停止および再開する機能を追加するだけでよい。なお、これらの機能がすべてハードウェアによって実現されることは、本発明の範囲を限定するものではない。たとえば、（Ａ）または（Ｂ）の主たる機能をハードウェアにより実現し、ハードウェアの機能を補助するためにＲＴＯＳの一部の機能をソフトウェアで実現してもよいことは当業者には理解されるところである。【００４９】
図６は、図５のＣＰＵ１５０の回路図である。
図３のＣＰＵ８４と異なり、処理レジスタ１５４は特殊レジスタ１５６と汎用レジスタ１５８共に一面だけの構成となっている。処理レジスタ１５４にはそれぞれロード選択回路１１２からの入力バス、退避レジスタ１１０への出力バス、タスク切換回路２１０からの書き込み信号（ＷＴ）用の信号線が追加されている。実行制御回路１５２は、出力セレクタ１６４に対する制御信号（ＣＴＲＬ）により、処理レジスタ９２のうちの所望のレジスタのデータを演算回路１６０に入力する。演算結果は入力セレクタ１６２への入力となる。実行制御回路１５２は、入力セレクタ１６２に対する制御信号（ＣＴＲＬ）により、処理レジスタ１５４のうちの所望のレジスタに演算結果を入力する。実行制御回路１５２は、特殊レジスタ１５６のプログラムカウンタを更新しながら、タスクを実行する。【００５０】
処理データは、メモリ上のＴＣＢではなく退避レジスタ１１０に退避される。処理レジスタ１５４からは常時、各退避レジスタ１１０に処理データが出力されている。実際にどの退避レジスタ１１０にどのタイミングで処理データを退避させるかは、先述のようにタスク切換回路２１０によって制御される。【００５１】
処理レジスタ１５４には、メモリ上のＴＣＢではなく退避レジスタ１１０から退避データがロードされる。実際にどの退避レジスタ１１０の処理データをどのタイミングでロードするかは、先述のようにタスク切換回路２１０によって制御される。【００５２】
処理レジスタ１５４とロード選択回路１１２、処理レジスタ１５４と退避レジスタ１１０を接続するバスは、一度に処理データをパラレル転送可能なビット数のバスである。そのため、タスク切換回路２１０による書き込み信号（ＷＴ）により、一度に読み出しや書き込みが可能となっている。一般的なソフトウェアＲＴＯＳは、タスクスイッチに際しては処理レジスタ１５４を一時的に占有する必要がある。これに対して、本実施例におけるハードウェアＲＴＯＳは、タスクスイッチ処理のための特別な処理データを処理レジスタ１５４にロードする必要がない。タスクＡからタスクＢの切り換えに際しては、タスクＡの処理データを退避したあとにタスクＢの処理データをロードするだけなので、処理レジスタ１５４をシステム用とユーザ用の２面分用意したり、スタックを介したデータの入れ替え処理を実行する必要がない。【００５３】
図７は、実行制御回路１５２がＣＰＵクロックを停止させる仕組みを示す回路図である。
第２ＡＮＤゲート１７４の入力は原クロック（ＣＬＫ０）と第１ＡＮＤゲート１７２の出力で、後者は負論理である。第１ＡＮＤゲート１７２の出力は停止完了信号（ＨＣ）である。停止完了信号（ＨＣ）は通常は０なので、第２ＡＮＤゲート１７４は、入力された原クロック（ＣＬＫ０）をＣＰＵクロック（ＣＬＫ）としてそのまま出力する。ＣＰＵ１５０は、第２ＡＮＤゲート１７４の出力するＣＰＵクロックを受けて動作する。第１ＡＮＤゲート１７２の出力が「１」のとき、いいかえれば、停止完了信号（ＨＣ）＝１のときには、第２ＡＮＤゲート１７４の出力はゼロに固定され、ＣＰＵクロック（ＣＬＫ）が停止する。【００５４】
第１ＡＮＤゲート１７２の入力は、ＯＲゲート１７６の出力とＣＰＵビジー信号（ＣＢＵＳＹ）で、後者は負論理である。ＣＢＵＳＹは、ＣＰＵ１５０の内部サイクルを発生させる既知のステートマシンから出力される信号であり、ＣＰＵ１５０が停止可能な状態にあるときに「１」となる信号である。たとえば、演算回路９４が実行中の単一の命令またはロックされている複数の命令の最後の命令を完了させ、ＣＰＵが停止可能な状態になったとき、または、既にＣＰＵクロックの供給が停止されているときに「０」となる。【００５５】
ＯＲゲート１７６の入力は、命令復号器１７０の出力（ＳＣ_ＤＥＴＥＣＴ）とタスク切換回路２１０からの停止要求信号（ＨＲ）である。命令復号器１７０は、ＳＣ_ＤＥＴＥＣＴを保持するラッチ回路を内蔵する。命令復号器１７０は、ＣＰＵ１５０からフェッチされたデータ（ＦＤ）を入力とし、ＦＤがシステムコール命令のときにＳＣ_ＤＥＴＥＣＴ＝１を出力する。内蔵ラッチ回路により、その後にＦＤが変化しても、命令復号器１７０はＳＣ_ＤＥＴＥＣＴ＝１を継続して出力する。命令復号器１７０にはタスク切換回路２１０の処理レジスタ１５４に対する書き込み信号（ＷＴ）も入力される。ＷＴが０から１に変化するとき、先述したように退避データの処理レジスタ１５４へのロードが実行される。このＷＴは所定時間後に１から０に戻るパルス信号である。ＷＴが１から０に変化するとき、命令復号器１７０のラッチ回路はリセットされ、命令復号器１７０はＳＣ_ＤＥＴＥＣＴをネゲートする。ＳＣ_ＤＥＴＥＣＴと書き込み信号（ＷＴ）の関係については、図８（ｂ）に関連して詳述する。本実施例における命令復号器１７０は、実行対象命令がシステムコールか否かを判定するために実行制御回路１５２に専用に設けられる装置である。変形例として、命令復号器１７０はＣＰＵ１５０のデコードステージを担当するＣＰＵデコーダと共通化されてもよい。この場合、命令復号器１７０は、ＣＰＵデコーダに、復号したデータがシステムコール命令であったときにＳＣ_ＤＥＴＥＣＴ＝１を出力する機能を追加することにより実現できる。
割り込み要求信号（ＩＮＴＲ）が発生したとき、タスク切換回路２１０は実行制御回路１５２に停止要求信号（ＨＲ）をアサートする。すなわち、ＯＲゲート１７６の出力は、システムコールが実行されるか、停止要求信号（ＨＲ）がアサートされたときに「１」となる。【００５６】
まとめると、システムコールが実行されるか割り込み要求信号が発生し、かつ、ＣＰＵビジー信号が「０」となったとき、第１ＡＮＤゲート１７２の出力は「１」となり、第２ＡＮＤ１７４からはＣＰＵクロックが出力されなくなる。【００５７】
図８（ａ）は、割り込み要求信号発生時における各種信号の関係を示すタイムチャートである。
同図においては、まず、時刻ｔ０において、タスク切換回路２１０は外部からの割り込み要求信号（ＩＮＴＲ）を検出している。タスク切換回路２１０は、特殊タスクを実行させるため、実行制御回路１５２に停止要求信号（ＨＲ）をアサートする。入力タイミングｔ１は、検出タイミングｔ０とほとんど同時である。時刻ｔ１では、ＣＰＵ１５０のステートマシンは「タスク実行中」であり、ＣＢＵＳＹ＝１である。ＨＲ＝１より、ＯＲゲート１７６は「１」を出力するが、ＣＢＵＳＹ＝１ゆえにＣＰＵ１５０は停止しない。そのため、ＨＲ＝１が入力されても、しばらくはＣＰＵクロック（ＣＬＫ）は原クロック（ＣＬＫ０）に同期して出力される。【００５８】
時間が経過し、時刻ｔ２においてＣＢＵＳＹ＝０に変化している。既にＨＲ＝１のため、第１ＡＮＤゲート１７２はＨＣ＝１を出力し、第２ＡＮＤゲート１７４から出力されるＣＰＵクロックは０に固定される。一方、タスク切換回路２１０は、ＨＣがアサートされたことを契機として、一般タスクから特殊タスクへタスクスイッチを開始する。詳しくは後述するが、このタスクスイッチのために要する時間はタスク制御回路２００の動作クロックにして数回分である。ＨＣがアサートされてから、タスク制御回路２００の動作クロックが所定回数変化したことを条件として（時刻ｔ３）、タスク制御回路２００は停止要求信号（ＨＲ）をネゲートする。ＨＲ＝０なので、実行制御回路１５２はＣＰＵクロック（ＣＬＫ）を再開させる。ＣＰＵ１５０が処理を再開すると、ＣＰＵ１５０はＣＢＵＳＹを０から１に変化させる（時刻ｔ４）。このように、ＣＰＵクロックが停止する時刻ｔ２から時刻ｔ３の間に、一般タスクから特殊タスクへのタスクスイッチが実行されることになる。
なお、別の処理方法として、タスク制御回路２００の動作クロックが所定回数変化したことを条件とする代わりに、タスク制御回路２００がタスクスイッチを完了させたことを条件として、ＨＲをネゲートしてもよい。そして、実行制御回路１５２が、ＨＲがネゲートされたことを条件として、ＨＣをネゲートさせてもよい。ＨＣ＝０となると、実行制御回路１５２はＣＰＵクロック（ＣＬＫ）を再開させる。こうして、タスクの実行を再開させてもよい。【００５９】
図８（ｂ）は、システムコール実行時における各種信号の関係を示すタイムチャートである。
同図においては、まず、時刻ｔ０において、命令復号器１７０がシステムコールを検出し、ＳＣ_ＤＥＴＥＣＴを０から１に変化させている。時刻ｔ０では、ＣＰＵ１５０のステートマシンは「タスク実行中」であり、ＣＢＵＳＹ＝１である。ＳＣ_ＤＥＴＥＣＴ＝１より、ＯＲゲート１７６は「１」を出力するが、ＣＢＵＳＹ＝１ゆえにＣＰＵ１５０は停止しない。そのため、ＳＣ_ＤＥＴＥＣＴ＝１が出力されても、しばらくはＣＰＵクロック（ＣＬＫ）は原クロック（ＣＬＫ０）に同期して出力される。【００６０】
時間が経過し、時刻ｔ１においてＣＢＵＳＹ＝０に変化している。ＳＣ_ＤＥＴＥＣＴ＝１、かつ、ＣＢＵＳＹ＝１となったので、ＨＣはネゲートされ、ＣＰＵクロックは停止される。タスク切換回路２１０は、ＨＣ＝０を入力されると、タスクスイッチ処理を開始し、書き込み信号（ＷＴ）をＣＰＵ１５０に出力する。ＷＴが０から１に変化する時刻ｔ２に退避データが処理レジスタ１５４にロードされる。書き込み信号（ＷＴ）は、パルス信号のため、所定時間経過後の時刻ｔ３にＷＴ＝０となる。このＷＴ：１→０の立ち下がり検出により命令復号器１７０にラッチされているＳＣ_ＤＥＴＥＣＴはリセットされる（時刻ｔ４）。このとき、ＣＢＵＳＹは０から１に変化する。ＣＢＵＳＹ＝１となったので、ＨＣ＝０となり、ＣＰＵクロックが再開される。ＣＰＵクロックが停止する時刻ｔ１から時刻ｔ４の間に、タスクスイッチが実行されることになる。
なお、別の処理方法として、ＷＴ：１→０の立ち下がり検出を条件とする代わりに、タスク制御回路２００がタスクスイッチを完了させ、ＨＲをネゲートしたことを条件として、実行制御回路１５２が、ＨＣをネゲートしてもよい。ＨＣ＝０となったことを条件として、ＳＣ_ＤＥＴＥＣＴをリセットする。実行制御回路１５２はＣＰＵクロック（ＣＬＫ）を再開させ、ＣＢＵＳＹは０から１に変化する。【００６１】
いずれの場合においても、ＣＰＵ１５０は、ＣＰＵクロックが停止している期間にＲＵＮ−タスクの切り換えが行われたことを認識する必要はない。タスク切換回路２１０は、ＣＰＵクロックが停止し、ＣＰＵ１５０がいわばフリーズしている間にタスクスイッチ処理を行うため、ＣＰＵ１５０の処理とタスク制御回路２００の処理はシーケンシャルに分離されている。【００６２】
図９は、パイプライン処理におけるＣＰＵクロックの停止タイミングを説明するための模式図である。
ＣＰＵ１５０は、複数の命令をメモリから処理レジスタ１５４に順次読み出しながら実行することにより、タスクを実行する。このタスクの実行単位である命令は、以下の４つのフェーズに分解される。
１．Ｆ（フェッチ）：メモリから命令を取り出す。
２．Ｄ（デコード）：命令を解釈する。
３．Ｅ（エグゼキューション）：命令を実行する。
４．ＷＢ（ライトバック）：実行結果をメモリに書き込む。【００６３】
あるタスクが命令１から命令５を順次実行する場合、命令１のＦからＷＢまで実行した後、命令２のＦを実行してもよい。しかし、より効率的な実行のために、命令１の実行中に命令２の実行を開始することが多い。このような処理方法は、パイプライン処理とよばれる。たとえば、命令１が、Ｄのフェーズに至ったとき、命令２のＦのフェーズを開始する。命令１が、Ｅのフェーズに至ったときには、命令２のＤフェーズ、命令３のＦフェーズを実行する。このように、単位時間当たりに実行される命令の数を増やすことにより、タスクごとの実行時間を減少させることができる。【００６４】
更に、各フェーズを２つのフェーズに細分化してもよい。たとえば、ＦフェーズをＦ１：Ｆ２という２つのフェーズに分離される。命令１が、Ｆ２のフェーズに至ったとき、命令２のＦ１のフェーズを開始する。命令１が、Ｄ１のフェーズに至ったときには、命令２のＦ２フェーズ、命令３のＦ１フェーズを実行する。フェーズの細分化により、いっそうＣＰＵ１５０の計算資源を効率的に利用できる。図９においては、各フェーズを２つのフェーズに細分化して実行するパイプライン処理において、システムコールが発生したときのＣＰＵクロック停止タイミングについて説明する。【００６５】
同図において、命令１はＣＰＵクロック「０」のタイミングで処理を開始されている。ＣＰＵクロック「４」のタイミングで、命令１のデコードが完了する。命令１はシステムコールであったとする。命令復号器１７０はＳＣ_ＤＥＴＥＣＴを０から１に変化させる。次にＳＣ_ＤＥＴＥＣＴが１から０に戻る条件は、タスク切換回路２１０から処理レジスタ１５４への書き込み信号（ＷＴ）が１から０に変化することである。ＳＣ_ＤＥＴＥＣＴ＝１となっても、命令２〜５が既に実行中または実行開始済であるため、ＣＢＵＳＹ＝１のままである。そのため、第２ＡＮＤゲート１７４はＣＰＵクロックを引き続き出力することになる。ただし、実行制御回路１５２は、ＳＣ_ＤＥＴＥＣＴ＝１のときには、新たな命令がフェッチされないようにプログラムカウンタの更新を一時停止させる。したがって、命令６以降はメモリからフェッチされなくなる。【００６６】
ＣＰＵクロック「８」のタイミングで命令１は実行完了するが、命令２〜５は実行中であるため、ＣＰＵビジー信号は「１」のままである。ＣＰＵクロック「１２」のタイミングに至ると命令５が実行完了する。このとき、ＣＰＵビジー信号は「０」となる。あとは、図８（ｂ）に関連したプロセスにしたがって、ＣＰＵクロックの供給が停止される。タスク切換回路２１０は、命令５まで終了した段階の処理データを退避レジスタ１１０に退避させる。このような停止方法によれば、システムコールが実行されたあとの命令の実行結果を無駄にすることなくタスクスイッチできる。タスクスイッチが完了すると、ＣＰＵビジー信号は再び「１」にセットされ、命令復号器１７０の処理も再開される。こうして、ＣＰＵクロックが再び供給されるようになる。
なお、別の処理方法として、システムコール命令が実行完了するタイミングで、ＣＰＵビジー信号を「０」とし、ＣＰＵクロックの供給を停止してもよい。この場合、システムコール命令と同時に実行されていた別の命令は実行途中のまま停止する。中途停止された命令の中間的な処理結果は処理レジスタ１５４に記録されたあと、退避レジスタ１１０に退避される。次回、このタスクがＲＵＮ−タスクとなるときには、中途停止された命令の続きが実行される。たとえば、ある命令が、フェッチを終了した段階で中途停止された場合、メモリから読み出された命令やオペランドは退避レジスタ１１０に退避される。タスク再開時には、退避レジスタ１１０のデータが処理レジスタ１５４にロードされ、デコードステージから続きの処理が実行されることになる。【００６７】
図１０は、状態記憶部２２０とタスク切換回路２１０の関係を示す回路図である。
状態記憶部２２０は、状態レジスタ２５０とタイマ２５２を含む、状態記憶部２２０は、タスクの状態データを保持する。また、タイマ２５２は、タスクがＲＥＡＤＹ状態またはＷＡＩＴ状態に遷移したときに開始するタイマである。タスクがＲＥＡＤＹ状態に遷移してから経過した時間のことを「ＲＥＡＤＹ経過時間」、タスクがＷＡＩＴ状態に遷移してから経過した時間のことを「ＷＡＩＴ経過時間」とよぶ。タイマ２５２は、その値をＴＩＭ信号として常時出力する。タスク切換回路２１０は、タスクスイッチに際して、あるタスクがＲＥＡＤＹ状態またはＷＡＩＴ状態に変化したときには、そのタスクのタイマ２５２を駆動して時間計測を開始させる。【００６８】
状態記憶部２２０は、以下に示すレジスタの集合である。
（Ａ）タスクＩＤレジスタ２５４：タスクＩＤを保持する。タスクＩＤレジスタ２５４からはタスクＩＤを示すＩＤ信号がタスク選択回路２３０に常時出力される。以下、タスクＡのタスクＩＤレジスタ２５４からタスク選択回路２３０に出力されるＩＤ信号のことを「ＩＤ_Ａ信号」と表記する。状態記憶部２２０から出力される他の信号についても同様である。
（Ｂ）タスク優先順位レジスタ２５６：タスク優先順位を保持する。タスク優先順位レジスタ２５６からはタスク優先順位を示すＰＲ信号が常時出力される。「０」が最高優先順位であり、値が大きいほどタスク優先順位が低いことを示す。
（Ｃ）タスク状態レジスタ２５８：タスク状態を示す。ＳＴＯＰ、ＲＥＡＤＹ、ＲＵＮ、ＷＡＩＴ、ＩＤＬＥのいずれかがＳＴ信号として常時出力される。なお、ＩＤＬＥとは、タスクが初期化される前の状態である。
（Ｄ）タスク起動アドレスレジスタ２６０：メモリにおけるタスクのＴＣＢアドレスを示す。出力はＡＤ信号である。
（Ｅ）待機理由レジスタ２６２：タスクがＷＡＩＴ状態にあるとき、ＷＡＩＴ解除条件の一部として待機の理由を示す。待機理由は、「セマフォ待ち」、「イベント待ち」、「ミューテックス待ち」のいずれかである。出力はＷＲ信号である。
（Ｆ）セマフォＩＤレジスタ２６４：タスクがセマフォ待ちを理由として、ＷＡＩＴ状態にあるとき、待ち対象のセマフォ（以下、単に「待機セマフォ」）のセマフォＩＤを保持する。出力はＳＩＤ信号である。
（Ｇ）ミューテックスＩＤレジスタ２６５：タスクがミューテックス待ちを理由として、ＷＡＩＴ状態にあるとき、待ち対象のミューテックス（以下、単に「待機ミューテックス」）のミューテックスＩＤを保持する。出力はＭＩＤ信号である。
（Ｈ）イベントＩＤレジスタ２６６：タスクがイベント待ちを理由として、ＷＡＩＴ状態にあるとき、待ち対象のイベント（以下、単に「待機イベント」）のイベントＩＤを保持する。出力はＥＩＤ信号である。
（Ｉ）待機フラグレジスタ２６８：タスクがイベント待ちを理由として、ＷＡＩＴ状態にあるとき、待機フラグパターンを保持する。出力はＦＬ信号である。
（Ｊ）フラグ条件レジスタ２７０：タスクがイベント待ちを理由として、ＷＡＩＴ状態にあるとき、フラグ条件を保持する。出力はＦＬＣ信号である。待機フラグパターンやフラグ条件については後述する。
（Ｋ）フラグ初期化レジスタ２７２：待機フラグパターンの有無を示すデータを保持する。出力はＦＬＩ信号である。
（Ｌ）タイムアウトカウンタ２７４：ＷＡＩＴ系システムコールにおいてはタイムアウト値が変数として指定される。タイムアウトカウンタ２７４は、タイムアウト値を保持する。タスク切換回路２１０は、各タイムアウトカウンタ２７４のタイムアウト値を定期的にデクリメントする。出力はＴＯ信号である。タスク切換回路２１０がタイムアウト値をデクリメントする代わりに、タイムアウトカウンタ２７４自体が自律的に自らのタイムアウト値を定期的にデクリメントしてもよい。【００６９】
タスク選択回路２３０は、各状態記憶部２２０から出力される各種信号をもとに、タスクの選択を行う。タスク選択回路２３０は、以下に示す回路を含む。
（Ａ）実行選択回路２３２：タスクスイッチに際して、次のＲＵＮ−タスクを選択する。実行選択回路２３２は、状態記憶部２２０から常時出力される状態データにより常にいずれかのタスクをＲＵＮ−タスクとして選択している。実行選択回路２３２の入力信号は、ＩＤ、ＳＴ、ＰＲ、ＴＩＭの４種類である。出力は、次のＲＵＮ−タスクのタスクＩＤである。詳細な回路構成については図１２に関連して詳述する。
（Ｂ）セマフォ選択回路２３４：リリースセマフォシステムコールの実行により、ＷＡＩＴ状態からＲＥＡＤＹ状態に遷移すべきタスクを選択する。リリースセマフォシステムコールにより解放されるセマフォ（以下、単に「解放セマフォ」）のセマフォＩＤをタスク切換回路２１０から入力される。状態記憶部２２０からの入力信号は、ＩＤ、ＳＴ、ＷＲ、ＰＲ、ＳＩＤ、ＴＩＭの６種類である。出力信号は、ＷＡＩＴ状態からＲＥＡＤＹ状態に遷移するタスクのタスクＩＤである。該当するタスクが存在しなければ、−１などの所定値を出力する。より具体的な回路構成については図１３に関連して詳述する。
（Ｃ）イベント選択回路２３６：セットイベントシステムコールの実行により、ＷＡＩＴ状態からＲＥＡＤＹ状態に遷移するタスクを選択する。セットイベントシステムコールによりセットされるイベント（以下、単に「設定イベント」）のイベントＩＤをタスク切換回路２１０から入力される。状態記憶部２２０からの入力信号は、ＩＤ、ＳＴ、ＷＲ、ＥＩＤ、ＦＬ、ＦＬＣの６種類である。出力信号は、ＷＡＩＴ状態からＲＥＡＤＹ状態に遷移するタスクのタスクＩＤと、そのタスクのＦＬ、ＦＬＣを出力する。
（Ｄ）タイムアウト検出回路２３８：ＷＡＩＴ状態のタスクのうち、タイムアウトカウンタ２７４のタイムアウト値がゼロとなったタスクを検出する。タイムアウト検出回路２３８は、タイムアウト値が更新されるごとに駆動される。タイムアウト検出回路２３８の入力信号は、ＩＤ、ＳＴ、ＴＯの３種類である。出力信号は、該当するタスクのタスクＩＤである。該当するタスクが存在しなければ、−１などの所定値を出力する。
（Ｅ）ミューテックス回路２４０：リリースミューテックスシステムコールの実行により、ＷＡＩＴ状態からＲＥＡＤＹ状態に遷移するタスクを選択する。リリースミューテックスシステムコールにより解放されるミューテックス（以下、単に「解放ミューテックス」）のミューテックスＩＤをタスク切換回路２１０から入力される。状態記憶部２２０からの入力信号は、ＩＤ、ＳＴ、ＷＲ、ＰＲ、ＳＩＤ、ＴＩＭの６種類である。出力信号は、ＷＡＩＴ状態からＲＥＡＤＹ状態に遷移するタスクのタスクＩＤである。該当するタスクが存在しなければ、−１などの所定値を出力する。
（Ｆ）検索回路２４２：タスク切換回路２１０からタスクＩＤを入力されると、そのタスクの全状態データを出力する。【００７０】
以下においては、タスクスイッチに関連し、ＲＵＮ−タスクの選択、セマフォ、イベント、ミューテックス、タイムアウトについて、特に、タスク選択回路２３０の処理を中心として一般的な技術と比較しながら説明する。
［ＲＵＮ−タスク選択］
［１］一般的なソフトウェアＲＴＯＳによるＲＵＮ−タスクの選択【００７１】
図１１は、一般的なＲＴＯＳによるＲＵＮ−タスク選択に際して利用されるタスクレディリストを示す図である。
タスクレディリストは、メモリ上に形成され、各ＲＥＡＤＹ−タスクのＴＣＢをポインタによって連結したリストである。優先順位ポインタ２８０は、タスク優先順位ごとに設けられ、該当タスク優先順位のタスクのＴＣＢの先頭アドレスを指す。同図のタスクレディリストの場合、タスク優先順位「０」の優先順位ポインタ２８０は、タスクＡのＴＣＢをアドレスし、タスク優先順位「１」の優先順位ポインタ２８０は、タスクＢのＴＣＢをアドレスしている。タスクＡのＴＣＢは、更に、タスクＤのＴＣＢをアドレスしている。  一般的なソフトウェアＲＴＯＳは、このタスクレディリストを走査しながら、次のＲＵＮ−タスクを選択する。このとき、ＲＴＯＳは、
Ａ．ＲＵＮ−タスクをＲＵＮからＲＥＡＤＹに状態遷移させる。
Ｂ．次のＲＵＮ−タスクを選択し、そのタスクのタスク状態をＲＥＡＤＹからＲＵＮに状態遷移させる。
という２段階の処理を行う。ソフトウェアＲＴＯＳによる各処理を分解すると以下の通りである。
＜ＲＵＮ−タスクの状態遷移＞【００７２】
ここでは、ＲＵＮ−タスクをタスクＪとして説明する。
Ａ１．ＲＴＯＳは、ＲＵＮ−タスクのタスクＩＤをメモリに保持している。このタスクＩＤをもとに、タスクＪのＴＣＢのアドレスを取得する。
Ａ２．ＴＣＢにアクセスし、タスクＪのタスク優先順位を取得する。タスク優先順位は「０」であったとする。
Ａ３．図１１に示すタスクレディリストのうち、タスクＪのタスク優先順位に対応する優先順位ポインタ２８０を取得する。
Ａ４．取得した優先順位ポインタ２８０が示すＴＣＢを検出する。ここではタスクＡのＴＣＢが検出される。
Ａ５．タスクＡのＴＣＢが持つポインタをたどっていき、最後尾のＴＣＢを検出する。同図においては、タスクＦが最後尾である。
Ａ６：タスクＦのＴＣＢのポインタがタスクＪのＴＣＢをアドレスするように設定する。こうして、タスクＪのＴＣＢがタスクレディリストに追加される。
Ａ７．タスクＪのＴＣＢに「ＲＥＡＤＹ」を設定する。また、処理データは、ＴＣＢのレジスタ格納エリアにコピーされる。
＜ＲＥＡＤＹ−タスクの状態遷移＞【００７３】
Ｂ１．ＲＴＯＳは、タスク優先順位「０」の優先順位ポインタ２８０がいずれかのＴＣＢを示しているか検出する。ＴＣＢがなければ、タスク優先順位「１」の優先順位ポインタ２８０がいずれかのＴＣＢを示しているか検出する。ＴＣＢが見つかるまで、タスク優先順位を下げながらいずれかのタスクを特定する。同図の場合、タスクＡが特定されることになる。
Ｂ２．タスクＡをタスクレディリストからはずす。具体的には、タスク順位「０」の優先順位ポインタ２８０がタスクＡではなくタスクＤのＴＣＢをアドレスするように書き換える。また、タスクＡのポインタがタスクＤをアドレスしないようにＮＵＬＬ設定する。こうして、タスクＡのＴＣＢがタスクレディリストから外される。
Ｂ３．タスクＡのＴＣＢに「ＲＵＮ」を設定する。また、タスクＡのＴＣＢのレジスタ格納エリアに退避されていた処理データが処理レジスタにロードされる。【００７４】
一般的なソフトウェアＲＴＯＳは、このようなタスクレディリストによりタスクスイッチを行う。すなわち、ＲＴＯＳが複数のＲＥＡＤＹ−タスクの中からＲＵＮ−タスクを選択するポリシは以下の通りである。
１．ＲＥＡＤＹ−タスクであること（第１条件）。
２．ＲＥＡＤＹ−タスクのうち、最もタスク優先順位の高いタスクであること（第２条件）。
３．最もタスク優先順位の高いタスクが複数存在するときには、ＲＥＡＤＹ状態になった時期が最も古いタスクであること（第３条件）。
このような３つの条件のことを、まとめて「ＲＵＮタスク選択条件」とよぶことにする。タスク処理装置１００の実行選択回路２３２は、このようなＲＴＯＳのタスクスケジューリング機能をハードウェアにより実現している。
［２］基本例のハードウェアＲＴＯＳによるＲＵＮ−タスクの選択【００７５】
図１２は、実行選択回路２３２の回路図である。
ここでは、タスク０〜タスク７の８つのタスクから、ＲＵＮ−タスクを選択するとして説明する。実行選択回路２３２は、４つの第１比較回路２９０（２９０ａ〜２９０ｄ）、２つの第２比較回路２９２（２９２ａ、２９２ｂ）、１つの第３比較回路２９４を含む。また、８つの判定回路２９６（２９６ａ〜２９６ｈ）も含む。
判定回路２９６は、タスクの状態を示すＳＴ信号を入力とし、ＲＥＡＤＹであれば「１」、ＲＥＡＤＹ以外であれば「０」を示すＣＩＤ信号を出力する。判定回路２９６は、上記ＲＵＮタスク選択条件のうちの第１条件に基づく判定を行っている。第１比較回路２９０は、２つのタスクのＩＤ、ＰＲ、ＴＩＭ、および、判定回路２９６からのＣＩＤ信号を入力とする。【００７６】
第１比較回路２９０ａに着目して説明する。第１比較回路２９０ａは、タスク０とタスク１を比較し、上記したＲＵＮタスク選択条件に基づいて、より好適なタスクを選択する。
第１の判定：まず、判定回路２９６ａと判定回路２９６ｂのそれぞれから出力されるＣＩＤ信号を比較する。いずれか一方が「１」であれば、いいかえれば、いずれか一方のタスクだけがＲＥＡＤＹ状態であれば、第１比較回路２９０ａは、そのタスクのＩＤ、ＰＲ、ＴＩＭを出力する。いずれも「０」であれば、すなわち、いずれのタスクもＲＥＡＤＹ状態でなければ、第１比較回路２９０ａは、ＩＤ＝ＰＲ＝ＴＩＭ＝ＮＵＬＬを出力する。これは、いずれのタスクも選択されなかったことを示す。いすれも「１」であれば、すなわち、いずれのタスクもＲＥＡＤＹ状態であれば、次の第２の判定が実行される。
第２の判定：タスク０のＰＲ信号とタスク１のＰＲ信号を比較し、タスク優先順位が上位となるタスクを選択する。たとえば、タスク０のタスク優先順位が「１」、タスク１のタスク優先順位が「２」であれば、タスク０のＩＤ、ＰＲ、ＴＩＭを出力する。第２の判定により、タスク優先順位が上位のタスクがＲＵＮ−タスクの候補として選択されることになる。タスク０とタスク１のタスク優先順位が同じであれば、次の第３の判定が実行される。
第３の判定：タスク０のＴＩＭ信号とタスク１のＴＩＭ信号を比較し、ＲＥＡＤＹ経過時間が長い方のタスクを選択する。ＲＥＡＤＹ経過時間が同じであれば、タスク０を選択するものとする。経過時間の大小を比較するだけで判定できるため、タスクレディリストのようなＴＣＢの順序管理が不要となる。【００７７】
このようにして、タスク０とタスク１、タスク２とタスク３、タスク４とタスク５、タスク６とタスク７がそれぞれＲＵＮタスク選択条件により比較される。第２比較回路２９２は、２つの第１比較回路２９０からの出力により、更にＲＵＮ−タスクの候補を絞り込む。第２比較回路２９２ａは、第１比較回路２９０ａと第１比較回路２９０ｂの出力によりタスク選択を実行する。このため、第２比較回路２９２ａは、タスク０〜タスク３のうち、最もＲＵＮタスク選択条件に適合するタスクのＩＤ、ＰＲ、ＴＩＭを出力する。第３比較回路２９４も同様であり、第３比較回路２９４はタスク０〜タスク７のいずれかのタスクのタスクＩＤを出力する。【００７８】
このような処理方法によれば、ＲＵＮタスク選択条件をハードウェアにより実現できる。一般的なソフトウェアＲＴＯＳは、タスクレディリストにアクセスしながらＲＵＮ−タスクを選択していたが、本実施例における実行選択回路２３２は、状態記憶部２２０から常時出力される状態データによりＲＵＮ−タスクを選択している。実行選択回路２３２の処理をまとめると以下の通りである。
＜ＲＵＮ−タスクの状態遷移＞【００７９】
ここでは、ＲＵＮ−タスクをタスクＪとして説明する。
Ａ１．タスク切換回路２１０は、タスクＪのタスク状態レジスタ２５８に「ＲＥＡＤＹ」を設定する。
Ａ２．タスク切換回路２１０は、タスクＪのタイマ２５２をセットしてＲＥＡＤＹ経過時間の計測を開始させる。
こうして、タスクＪはＲＵＮ→ＲＥＡＤＹに状態遷移する。処理データは、先述したようにタスクＪの退避レジスタ１１０に退避される。処理レジスタ１５４と退避レジスタ１１０をつなぐバスは、処理データをパラレルに伝送可能であるため、Ａ１とＡ２の処理は１クロック時間で実行可能である。
＜ＲＥＡＤＹ−タスクの状態遷移＞【００８０】
Ｂ１．タスク切換回路２１０は、タスクＪの状態遷移が完了したときに実行選択回路２３２が出力するタスクＩＤから、ＲＵＮ−タスクを特定する。このタスクのタスク状態レジスタ２５８に「ＲＵＮ」を設定する。
こうして、特定されたタスクはＲＥＡＤＹ→ＲＵＮに状態遷移する。特定されたタスクの処理データは退避レジスタ１１０から処理レジスタ１５４にロードされる。退避レジスタ１１０と処理レジスタ１５４をつなぐバスも、処理データをパラレルに伝送可能なビット数であるため、Ｂ１の処理は１クロック時間で実行可能である。【００８１】
ソフトウェアＲＴＯＳは、タスクスイッチに際して、タスクレディリストへのアクセス等によりＣＰＵのＣＰＵクロック時間を多く消費する。これに対し、本実施例におけるタスク制御回路２００は、僅かな時間でタスクスイッチを完了させることができる。状態記憶部２２０は常時状態データを実行選択回路２３２に出力しているため、実行選択回路２３２は常時いずれかのタスクのタスクＩＤを出力している。タスクスイッチが発生してからＲＵＮ−タスクの選択処理を開始するのではなく、タスクスイッチが発生したときの実行選択回路２３２の出力によりＲＵＮ−タスクの選択を行う点もタスクスイッチの高速化に寄与している。ここでは、タスクが８つであるとして説明したが、比較回路の段数を増やすことにより、より多くのタスクにも対応可能である。
［セマフォ処理］【００８２】
図１３は、一般的なＲＴＯＳによるセマフォ処理において利用されるウェイトセマフォリストを示す図である。
ウェイトセマフォリストを説明する前に、セマフォについて簡単に説明する。セマフォテーブル２１２には、セマフォＩＤとセマフォカウンタが対応づけて記録される。セマフォカウンタは、初期値として有限数に設定される。たとえば、セマフォＩＤ＝４、セマフォカウンタ＝３として設定されているとする。いずれかのタスクがセマフォＩＤ＝４のセマフォを待機セマフォとしてウェイトセマフォシステムコールを実行すると、タスク切換回路２１０は待機セマフォのセマフォカウンタをデクリメントする。セマフォカウンタはウェイトセマフォイベントコールにより獲得要求されるごとにデクリメントされ、０になると獲得できなくなる。セマフォカウンタが０となっているセマフォを待機セマフォとしてウェイトセマフォシステムコールを実行したタスクは、ＷＡＩＴ状態に状態遷移する。【００８３】
一方、いずれかのタスクがセマフォＩＤ＝４のセマフォを解放セマフォとしてリリースセマフォシステムコールを実行すると、タスク切換回路２１０はセマフォテーブル２１２のセマフォカウンタをインクリメントする。まとめると、
セマフォカウンタ＞０のとき：ウェイトセマフォシステムコールを実行したタスクは、ＲＵＮ→ＲＥＡＤＹに遷移する。このときセマフォカウンタはデクリメントされる。
セマフォカウンタ＝０のとき：ウェイトセマフォシステムコールを実行したタスクは、ＲＵＮ→ＷＡＩＴに遷移する。セマフォカウンタはデクリメントされない。
ウェイトセマフォシステムコールを実行したタスクがＷＡＩＴ状態からＲＥＡＤＹ状態に遷移するためには、別のタスクがリリースセマフォシステムコールを実行する必要がある。
［１］一般的なソフトウェアＲＴＯＳによるセマフォ処理【００８４】
一般的なソフトウェアＲＴＯＳはウェイトセマフォリストにより、セマフォ待ちを理由としてＷＡＩＴ状態にあるタスク（以下、特に、「セマフォ待ちタスク」とよぶ）のＴＣＢを管理する。ウェイトセマフォリストは、図１１のタスクレディリストと同等の形状のリストであり、メモリ上に形成される。各セマフォ待ちタスクのＴＣＢは、ポインタによって連結される。優先順位ポインタ２８０は、該当タスク優先順位のセマフォ待ちタスクのＴＣＢの先頭アドレスを指す。
一般的なソフトウェアＲＴＯＳは、リリースセマフォシステムコールが実行されたとき、このウェイトセマフォリストを走査しながら、ＷＡＩＴ状態からＲＥＡＤＹ状態に遷移させるべきセマフォ待ちタスクを選択する。ウェイトセマフォシステムコールおよびリリースセマフォシステムコール実行時におけるＲＴＯＳの処理は以下の通りである。
＜ウェイトセマフォシステムコールの実行＞【００８５】
ここでは、ＲＵＮ−タスクをタスクＪとして説明する。
Ａ１．ＲＴＯＳは、ＲＵＮ−タスクのタスクＩＤをメモリに保持している。このタスクＩＤをもとに、タスクＪのＴＣＢのアドレスを取得する。
Ａ２．ウェイトセマフォシステムコールにおいて指定された待機セマフォのセマフォカウンタを検出する。以下、セマフォカウンタの値に応じて処理は分岐する。
（セマフォカウンタ＞０のとき）
Ａ３．ＲＴＯＳは、待機セマフォのセマフォカウンタをデクリメントする。
Ａ４．タスクＪのＴＣＢに「ＲＥＡＤＹ」を設定する。この場合、タスクＪのＴＣＢはタスクレディリストに追加される。
（セマフォカウンタ＝０のとき）
Ａ３．ＴＣＢにアクセスし、タスクＪのタスク優先順位を取得する。タスク優先順位は「０」であったとする。
Ａ４．ウェイトセマフォリストのうち、タスクＪのタスク優先順位に対応する優先順位ポインタを取得する。
Ａ５．取得した優先順位ポインタが示すＴＣＢを検出する。ここではタスクＡのＴＣＢが検出される。
Ａ６．タスクＡのＴＣＢが持つポインタをたどっていき、最後尾のＴＣＢを検出する。同図においては、タスクＦが最後尾である。
Ａ７：タスクＦのＴＣＢのポインタがタスクＪのＴＣＢをアドレスするように設定する。こうして、タスクＪのＴＣＢがウェイトセマフォリストに追加される。
Ａ８．タスクＪのＴＣＢに「ＷＡＩＴ」を設定する。また、待機セマフォのセマフォＩＤも設定する。
＜リリースセマフォシステムコールの実行＞【００８６】
Ｂ１．ＲＴＯＳは、タスク優先順位「０」のタスクを順番にたどりながら、解放セマフォを待機セマフォとするセマフォ待ちタスクを検索する。存在しなければ、タスク優先順位「１」のタスクを検索対象とする。解放セマフォを待機セマフォとするセマフォ待ちタスクが検出されるか否かに応じて処理は分岐する。
（検出されたとき）
Ｂ２．検出されたタスクがタスクＥであるとして説明する。タスクＥのＴＣＢに「ＲＥＡＤＹ」を設定する。また、待機セマフォのセマフォＩＤをクリアする。
Ｂ３．タスクＥのＴＣＢをウェイトセマフォリストから外す。
Ｂ４．セマフォを解放したタスクの状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。このタスクのＴＣＢは、タスクレディリストに追加される。
（検出されなかったとき）
Ｂ２．セマフォカウンタをインクリメントする。
Ｂ３．セマフォを解放したタスクの状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。このタスクのＴＣＢは、タスクレディリストに追加される。【００８７】
一般的なソフトウェアＲＴＯＳは、このようなウェイトセマフォリストを管理することによって、セマフォ関連処理を行う。セマフォの解放に際し、ＲＴＯＳが複数のＷＡＩＴ−タスクの中からＲＥＡＤＹ−タスクを選択するポリシは以下の通りである。
１．ＷＡＩＴ−タスクであること（第１条件）。
２．ＷＡＩＴ−タスクのうち、解放セマフォを待機セマフォとするタスクであること（第２条件）
３．そのようなタスクが複数存在するときには、最もタスク優先順位の高いタスクであること（第３条件）。
４．最もタスク優先順位の高いタスクが複数存在するときには、ＷＡＩＴ状態になった時期が最も古いタスクであること（第４条件）。
このような４つの条件のことを、まとめて「セマフォ待機解除条件」とよぶことにする。タスク処理装置１００のセマフォ選択回路２３４は、このようなＲＴＯＳのタスクスケジューリング機能をハードウェアにより実現している。
［２］基本例のハードウェアＲＴＯＳによるセマフォ処理【００８８】
図１４は、セマフォ選択回路２３４の回路図である。
ここでも、タスク０〜タスク７の８つのタスクを前提として説明する。セマフォ選択回路２３４は、４つの第１比較回路３００（３００ａ〜３００ｄ）、２つの第２比較回路３０２（３０２ａ、３０２ｂ）、１つの第３比較回路３０４を含む。また、８つの判定回路３０６（３０６ａ〜３０６ｈ）も含む。
判定回路３０６は、状態記憶部２２０からのＳＴ、ＷＲ、ＳＩＤ信号とタスク切換回路２１０からのセマフォＩＤを示す信号を入力とする回路である。ここで入力されるセマフォＩＤは、解放セマフォのセマフォＩＤである。判定回路３０６は、解放セマフォを待機セマフォとするセマフォ待ちタスクであれば「１」、そうでなければ「０」を示すＣＩＤ信号を出力する。判定回路３０６は、上記セマフォ待機解除条件のうちの第１条件と第２条件に関する判定結果を出力する回路である。第１比較回路３００は、２つのタスクのＩＤ、ＰＲ、ＴＩＭ、および、判定回路３０６からのＣＩＤ信号を入力とする。【００８９】
第１比較回路３００は、セマフォ待機解除条件のうち第３条件と第４条件についての判定を行う回路である。第２比較回路３０２や第３比較回路３０４も同様である。既に明らかなように、ＲＵＮタスク選択条件の第２条件および第３条件は、セマフォ待機解除条件の第３条件および第４条件と同じである。実行選択回路２３２の各比較回路は、タスクの状態データ（ＰＲ、ＴＩＭ）を比較する回路である。一方、セマフォ選択回路２３４の各比較回路も、タスクの状態データ（ＰＲ、ＴＩＭ）を比較する回路である。したがって、実行選択回路２３２の第１比較回路２９０とセマフォ選択回路２３４の第１比較回路３００は、同等のロジックを内蔵する回路であり、共通化することができる。各タスクは判定回路３０６により第１条件と第２条件を判定された上で、第１比較回路３００の判定処理に供される。あとは、実行選択回路２３２と同等の判定処理により、いずれかのタスクＩＤが第３比較回路３０４から出力される。ウェイトセマフォシステムコールおよびリリースセマフォシステムコール実行時における処理は以下の通りである。
＜ウェイトセマフォシステムコールの実行＞【００９０】
ここでは、ＲＵＮ−タスクをタスクＪとして説明する。
Ａ１．タスク切換回路２１０は、ウェイトセマフォシステムコールにおいて指定されたセマフォのセマフォカウンタをセマフォテーブル２１２から検出する。以下、セマフォカウンタの値に応じて処理は分岐する。
（セマフォカウンタ＞０のとき）
Ａ２．タスク切換回路２１０は、セマフォテーブル２１２のセマフォカウンタをデクリメントする。
Ａ３．タスクＪのタスク状態レジスタ２５８に「ＲＥＡＤＹ」を設定する。このとき、タスク切換回路２１０は、ＲＵＮ−タスクのタイマ２５２をセットしてＲＥＡＤＹ経過時間の計測を開始させる。
（セマフォカウンタ＝０のとき）
Ａ２．タスク切換回路２１０は、タスクＪのタスク状態レジスタ２５８に「ＷＡＩＴ」、待機理由レジスタ２６２に「セマフォ待ち」、セマフォＩＤレジスタ２６４に待機セマフォのセマフォＩＤをセットし、タイマ２５２をセットしてＷＡＩＴ経過時間の計測を開始させる。
こうして、ウェイトセマフォシステムコールを実行したタスクはＲＵＮ→ＲＥＡＤＹまたはＷＡＩＴに状態遷移する。
＜リリースセマフォシステムコールの実行＞【００９１】
Ｂ１．タスク切換回路２１０は、解放セマフォのセマフォＩＤを各判定回路３０６に入力する。各判定回路３０６は、このセマフォＩＤを対象としてセマフォ待機解除条件のうちの第１条件および第２条件の成否を判定する。したがって、各第１比較回路３００は、第３条件および第４条件にもとづいてタスクを選択する。
（いずれかの判定回路３０６が「１」を出力し、第３比較回路３０４がいずれかのタスクＩＤを出力したとき）
Ｂ２．検出されたタスクのタスク状態レジスタ２５８に「ＲＥＡＤＹ」を設定し、待機理由レジスタ２６２とセマフォＩＤレジスタ２６４をクリアし、タイマ２５２にＲＥＡＤＹ経過時間を計測させる。
Ｂ３．システムコールを実行したタスクのタスク状態レジスタ２５８に「ＲＥＡＤＹ」に設定し、ＲＥＡＤＹ経過時間の計測を開始する。
（いずれの判定回路３０６も「１」を出力せず、第３比較回路３０４がいずれのタスクＩＤも出力しないとき）
Ｂ２．タスク切換回路２１０はセマフォテーブル２１２のセマフォカウンタをインクリメントする。
Ｂ３．システムコールを実行したタスクの状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。【００９２】
状態記憶部２２０は常時状態データをセマフォ選択回路２３４に出力しているため、タスク切換回路２１０がセマフォＩＤを判定回路３０６に入力すると、セマフォ選択回路２３４は直ちに選択処理を実行できる。
［ミューテックス処理］【００９３】
ミューテックスもセマフォと同じく、タスク間の同期処理に利用される。ミューテックスとセマフォは以下の点において相違する。
１．セマフォカウンタは１以上の整数を設定可能である。これに対し、ミューテックスはセマフォカウンタが１または０の特殊なセマフォである。セマフォカウンタが２以上のときには、同一セマフォを２以上のタスクが獲得できる。しかし、ミューテックスの場合、あるミューテックスを獲得できるタスクは常に１つだけである。
２．リリースセマフォシステムコールによりセマフォを解放できるタスクは、ウェイトセマフォシステムコールによりセマフォを獲得したタスクに限らない。これに対し、リリースミューテックスシステムコールによりミューテックスを解放できるタスクは、ウェイトミューテックスシステムコールによりミューテックスを獲得したタスクだけである。【００９４】
ミューテックスの解放に際し、複数のＷＡＩＴ−タスクの中からＲＥＡＤＹ−タスクを選択するポリシは以下の通りである。
１．ＷＡＩＴ−タスクであること（第１条件）。
２．ＷＡＩＴ−タスクのうち、解放ミューテックスを待機ミューテックスとするタスクであること（第２条件）
３．そのようなタスクが複数存在するときには、最もタスク優先順位の高いタスクであること（第３条件）。
４．最もタスク優先順位の高いタスクが複数存在するときには、ＷＡＩＴ状態になった時期が最も古いタスクであること（第４条件）。
このような４つの条件のことを、まとめて「ミューテックス待機解除条件」とよぶことにする。【００９５】
したがって、ウェイトミューテックスシステムコールおよびリリースミューテックスシステムコール実行時における基本例のハードウェアＲＴＯＳの処理は以下の通りである。セマフォテーブル２１２には、ミューテックスＩＤと、そのミューテックスがいずれかのタスクに占有されているか否かを示す占有状態データが対応づけて保持されている。占有状態データは、占有されていないときには「０」であり、占有されているときにはミューテックスを占有しているタスクのタスクＩＤとなる。
＜ウェイトミューテックスシステムコールの実行＞【００９６】
ここでは、ＲＵＮ−タスクをタスクＪとして説明する。
Ａ１．タスク切換回路２１０は、ウェイトミューテックスシステムコールにおいて指定されたミューテックスが占有されているか検出する。以下、ミューテックスの占有状態に応じて処理は分岐する。
（ミューテックスが占有されていないとき）
Ａ２．タスク切換回路２１０は、ミューテックスの占有データとして、システムコールを実行したタスクのタスクＩＤを記録する。
Ａ３．タスクＪのタスク状態レジスタ２５８に「ＲＥＡＤＹ」を設定する。このとき、タスク切換回路２１０は、ＲＵＮ−タスクのタイマ２５２をセットしてＲＥＡＤＹ経過時間の計測を開始させる。
（ミューテックスが占有されているとき）
Ａ２．タスク切換回路２１０は、タスクＪのタスク状態レジスタ２５８に「ＷＡＩＴ」、待機理由レジスタ２６２に「ミューテックス待ち」、ミューテックスＩＤレジスタ２６５に待機ミューテックスのミューテックスＩＤをセットし、タイマ２５２をセットしてＷＡＩＴ経過時間の計測を開始させる。
＜リリースミューテックスシステムコールの実行＞【００９７】
Ｂ１．タスク切換回路２１０は、システムコールを実行したタスクが、解放ミューテックスを占有していることを条件として、解放セマフォＩＤをミューテックス回路２４０に入力する。ミューテックス回路２４０も、図１４と同じく多段接続された比較回路とミューテックス待機解除条件のうちの第１条件および第２条件の成否を判定する判定回路を含む。この判定回路は、このミューテックスを対象としてミューテックス待機条件のうちの第１条件および第２条件が共に成立したときだけ「１」を出力する。なお、解放ミューテックスを占有しないタスクがリリースミューテックスシステムコールを実行したときには、そのタスクの状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。
（いずれかの判定回路が「１」を出力し、ミューテックス回路２４０からいずれかのタスクＩＤを出力したとき）
Ｂ２．検出されたタスクのタスク状態レジスタ２５８に「ＲＥＡＤＹ」を設定し、待機理由レジスタ２６２とミューテックスＩＤレジスタ２６５をクリアし、タイマ２５２をＲＥＡＤＹ経過時間を計測させる。
Ｂ３．システムコールを実行したタスクのタスク状態レジスタ２５８に「ＲＥＡＤＹ」に設定し、ＲＥＡＤＹ経過時間の計測を開始する。
（いずれの判定回路も「１」を出力せず、ミューテックス回路２４０がいずれのタスクＩＤも出力しないとき）
Ｂ２．タスク切換回路２１０はセマフォテーブル２１２において、ミューテックスを非占有状態に設定する。
Ｂ３．システムコールを実行したタスクの状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。
［イベント処理］【００９８】
基本例におけるイベント管理について簡単に説明する。イベントテーブル２１４には、イベントＩＤにフラグパターン（以下、「カレントフラグパターン」とよぶ）が対応づけて記録される。フラグパターンは８ビットのビットパターンである。
セットイベントシステムコールは、カレントフラグパターンを設定変更するシステムコールであり、イベントＩＤとフラグパターン（以下、「セットフラグパターン」とよぶ）をパラメータとする。セットイベントシステムコールが実行されると、該当イベントについて、カレントフラグパターンは、セットフラグパターンとの論理和に変更される。たとえば、カレントフラグパターン「００００１１００」、セットフラグパターン「０００００１０１」のときには、カレントフラグパターンは、「００００１１０１」となる。以下、各フラグパターンについて左から第０ビット、第１ビット、・・・、第７ビットとよぶ。【００９９】
ウェイトイベントシステムコールは、待機イベントのカレントフラグパターンが所定条件を満たすのを待つためのシステムコールであり、イベントＩＤ、フラグパターン（以下、「待機フラグパターン」とよぶ）、フラグ条件をパラメータとする。ウェイトイベントシステムコールが実行されると、カレントフラグパターンと待機フラグパターンの間にフラグ条件が成立するか判定される。フラグ条件は論理和（ＯＲ）または論理積（ＡＮＤ）である。フラグ条件が論理積（ＡＮＤ）の場合、待機フラグパターンにおいて「１」となっているすべてのビットについて、カレントフラグパターンの該当ビットもすべて「１」であることがＷＡＩＴ解除条件となる。フラグ条件が論理和（ＯＲ）の場合、待機フラグパターンにおいて「１」となっているいずれかのビットについて、カレントフラグパターンの該当ビットが「１」であることがＷＡＩＴ解除条件となる。たとえば、カレントフラグパターン「００００１１０１」、待機フラグパターン「００００００１１」、フラグ条件「論理和（ＯＲ）」の場合、待機フラグパターンの第６ビットおよび第７ビットのうち、カレントフラグパターンの第７ビットが１なので、この場合には、ウェイトイベントシステムコールによるＷＡＩＴ解除条件は成立する。一方、フラグ条件が「論理積（ＡＮＤ）」の場合、カレントフラグパターンの第６ビットが「０」なのでＷＡＩＴ解除条件は成立しない。
［１］一般的なソフトウェアＲＴＯＳによるイベント処理【０１００】
ウェイトイベントシステムコールおよびセットイベントシステムコール実行時における一般的なＲＴＯＳの処理は以下の通りである。一般的なＲＴＯＳにおいては、イベント管理のために、メモリ上にイベントテーブルを保持する。このイベントテーブルにおいては、イベントＩＤ、カレントフラグパターンだけではなく、通常、そのイベントを待機イベントとしてＷＡＩＴ状態にあるタスク（以下、「イベント待ちタスク」とよぶ）のタスクＩＤ、待機フラグパターン、フラグ条件が対応づけられて保持される。
＜ウェイトイベントシステムコールの実行＞【０１０１】
Ａ１．ＲＴＯＳは、システムコールで指定されたイベントのカレントフラグパターンをイベントテーブルから読み出す。
Ａ２．カレントフラグパターンと待機フラグパターンをフラグ条件にしたがって比較し、ＷＡＩＴ解除条件の成否を判定する。
（ＷＡＩＴ解除条件が成立するとき）
Ａ３．システムコールを実行したタスクのタスク状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。
（ＷＡＩＴ解除条件が成立しないとき）
Ａ３．イベントテーブルに、システムコールを実行したタスクのタスクＩＤを記録する。
Ａ４．イベントテーブルに待機フラグパターンを記録する。
Ａ５．イベントテーブルにフラグ条件を記録する。
Ａ６．システムコールを実行したタスクのタスク状態をＲＵＮ→ＷＡＩＴに状態遷移させる。
＜セットイベントシステムコールの実行＞【０１０２】
Ｂ１．ＲＴＯＳは、システムコールで指定された設定イベントについて、イベントテーブルからカレントフラグパターン、タスクＩＤ、待機フラグパターン、フラグ条件を読み出す。
Ｂ２．カレントフラグパターンとセットフラグパターンの論理和を新たなカレントフラグパターンとして記録する。
（設定イベントについてイベント待ちタスクが存在しないとき、または、存在したとしても待機フラグパターンとフラグ条件からＷＡＩＴ解除条件が成立しないとき）
Ｂ３．システムコールを実行したタスクのタスク状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。
（設定イベントについてイベント待ちタスクが存在し、ＷＡＩＴ解除条件が成立するとき）
Ｂ３．イベントを待機していたタスクのタスク状態をＷＡＩＴ→ＲＥＡＤＹに状態遷移させる。
Ｂ４．イベントテーブルにおける待機タスクＩＤ、待機フラグパターン、フラグ条件をクリアする。
Ｂ５．システムコールを実行したタスクのタスク状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。また、ＲＵＮ−タスクの選択が行われる。【０１０３】
セットイベントシステムコールが実行されるとき、複数のＷＡＩＴ−タスクの中からＲＥＡＤＹ−タスクを選択するポリシは以下の通りである。
１．ＷＡＩＴ−タスクであること（第１条件）。
２．ＷＡＩＴ−タスクのうち、設定イベントを待機イベントとするタスクであること（第２条件）。
３．待機フラグパターンとカレントフラグパターン、フラグ条件を比較してＷＡＩＴ解除条件が成立するタスクであること（第３条件）
このような３つの条件のことを、まとめて「イベント待機解除条件」とよぶことにする。
［２］基本例のハードウェアＲＴＯＳによるイベント処理【０１０４】
タスク処理装置１００のウェイトイベントシステムコールおよびセットイベントシステムコール実行時における処理は以下の通りである。タスク処理装置１００が内蔵するイベントテーブル２１４においては、イベントＩＤとカレントフラグパターンが対応づけられている。待機タスクＩＤや待機フラグパターンなどの情報は、状態記憶部２２０に格納される。
＜ウェイトイベントシステムコールの実行＞【０１０５】
Ａ１．タスク切換回路２１０は、イベントテーブル２１４からカレントフラグパターンを読み出す。
Ａ２．タスク切換回路２１０は、カレントフラグパターンと待機フラグパターンをフラグ条件にしたがって比較し、ＷＡＩＴ解除条件の成否を判定する。
（ＷＡＩＴ解除条件が成立するとき）
Ａ３．システムコールを実行したタスクのタスク状態レジスタ２５８に「ＲＥＡＤＹ」を設定する。
（ＷＡＩＴ解除条件が成立しないとき）
Ａ３．タスク切換回路２１０は、システムコールを実行したタスクのタスク状態レジスタ２５８に「ＷＡＩＴ」、待機理由レジスタ２６２に「イベント待ち」、イベントＩＤレジスタ２６６に待機イベントのイベントＩＤ、待機フラグレジスタ２６８に待機フラグパターン、フラグ条件レジスタ２７０にフラグ条件をそれぞれ設定する。
＜セットイベントシステムコールの実行＞【０１０６】
Ｂ１．タスク切換回路２１０は、イベントテーブル２１４からカレントフラグパターンを読み出すとともに、システムコールで指定された設定イベントのイベントＩＤをイベント選択回路２３６に入力する。
Ｂ２．タスク切換回路２１０は、イベントテーブル２１４のカレントフラグパターンにセットフラグパターンを論理加算する。
Ｂ３．イベント選択回路２３６は、入力されたイベントＩＤについて、イベント待機条件が成立するタスクを選択する。このとき、タスク優先順位やＷＡＩＴ経過時間に関わらず複数のタスクが選択されてもよい。
（イベント待機解除条件を満たすタスクが存在するとき）
Ｂ４．イベント待ちタスクのタスク状態レジスタ２５８に「ＲＥＡＤＹ」を設定し、イベントＩＤレジスタ２６６、待機フラグレジスタ２６８、フラグ条件レジスタ２７０をクリアする。
Ｂ５．システムコールを実行したタスクのタスク状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。
（イベント待機解除条件を満たすタスクが存在しないとき）
Ｂ４．システムコールを実行したタスクのタスク状態をＲＵＮ→ＲＥＡＤＹに状態遷移させる。
［タイムアウト処理］【０１０７】
ＷＡＩＴ状態に移行したタスクは、ＷＡＩＴ解除条件が成立したときにＲＥＡＤＹ状態に遷移する。しかし、何らかの外的要因やアプリケーションプログラムのバグにより、ＷＡＩＴ解除条件の成立が阻害されると、タスクはＷＡＩＴ状態から抜け出せなくなってしまう。そこで、通常、タスクをＷＡＩＴ状態に遷移させるときにはタイムアウト値を設定する。タイムアウト値は定期的にデクリメントされ、ゼロとなったときには、ＷＡＩＴ解除条件が成立していなくてもタスクはＷＡＩＴ状態からＲＥＡＤＹ状態に遷移する。すなわち、タイムアウト値以上の時間、タスクがＷＡＩＴ状態に止まるのを防止している。
［１］一般的なソフトウェアＲＴＯＳによるタイムアウト処理【０１０８】
ソフトウェアによる一般的なＲＴＯＳの場合、ＷＡＩＴ状態のタスクのＴＣＢにはタイムアウト値が設定され、このタイムアウト値は定期的にデクリメントされる。ＲＴＯＳは周期的にＣＰＵの処理に割り込みをかけ、全ＴＣＢをチェックし、タイムアウト値がゼロに至ったＷＡＩＴ−タスクを検出する。このようなタスクが検出されたときには、ＲＴＯＳはそのタスクのタスク状態をＷＡＩＴからＲＥＡＤＹに状態遷移させる。
［２］基本例のハードウェアＲＴＯＳによるタイムアウト処理【０１０９】
一方、基本例の場合、タスク切換回路２１０は各タイムアウトカウンタ２７４のタイムアウト値を定期的にデクリメントする。タイムアウト値は、ＷＡＩＴ系システムコールを実行する時にパラメータとして設定され、タスク切換回路２１０はそのシステムコールを実行したタスクのタイムアウトカウンタ２７４にタイムアウト値を設定する。【０１１０】
タイムアウト値のデクリメント処理にＣＰＵ１５０が介在しないため、タスク切換回路２１０がタスク実行処理とは独立してタイムアウト値を更新できる。そのため、ＣＰＵ１５０がタスクを実行している最中にも、タスク制御回路２００において自律的にタイムアウト値の更新がなされる。タイムアウト検出回路２３８には状態データが常時入力されているので、タイムアウト検出回路２３８は、タイムアウトカウント値が更新されたタイミングとほぼ同じタイミングにて、タイムアウトカウント値がゼロとなったタスクを検出できる。タイムアウト検出回路２３８は、そのようなタスクのタスクＩＤを出力する。タスク切換回路２１０は、タイムアウト検出回路２３８からタスクＩＤを入力されると、タイムアウトが発生したと認識し、ＨＣをアサートしてＣＰＵクロックを供給停止させる。タスク制御回路２００は、タイムアウトが発生したＷＡＩＴ−タスクをＲＥＡＤＹ状態に遷移させるとともに、ＲＵＮ−タスクをＲＥＡＤＹ状態に遷移させる。タスク切換回路２１０は、ＲＥＡＤＹ−タスクの中から次に実行すべきタスクを選択する。また、タスク切換回路２１０は、タイムアウトが発生したタスクのタイマ２５２をリスタートさせ、ＲＥＡＤＹ経過時間を計測させる。【０１１１】
このような処理方法によれば、タスクの実行中、すなわち、ＣＰＵクロックの動作中にタイムアウトが発生したときに、即時的にＣＰＵ１５０に割り込みをかけて、タスクスイッチを実行できる。また、タスクの実行中において、タスク切換回路２１０はＣＰＵ１５０の処理能力を借りることなく独立してタイムアウト値の更新処理を実行できる。
［有限ステートマシンとしてのタスク切換回路２１０］【０１１２】
図１５は、タスク切換回路２１０の状態遷移図である。
初期化処理（Ａ１）においては、全タスクがＩＤＬＥ状態にある。初期化処理が完了すると（Ｓ１０）、いずれかのタスクがＲＵＮ−タスクとなりタスク実行状態（Ａ２）となる。割り込み要求信号が検出されると（Ｓ１２）、特殊タスクがＲＵＮ−タスクとなり、割り込み処理（Ａ３）が実行される。割り込み処理が終了すると（Ｓ１４）、タスク切換回路２１０は、一般タスクからＲＵＮ−タスクを選択し、Ａ２に遷移する。【０１１３】
また、タスク実行中（Ａ２）において、システムコールが実行されると（Ｓ１６）、システムコール処理が実行される（Ａ４）。タスクスイッチ、すなわち、ＲＵＮ−タスクの切り換えが発生しない場合には（Ｓ１８）、Ａ２に戻る。一方、システムコール処理（Ａ４）により、タスクスイッチが発生する場合には（Ｓ２０）、タスク切換回路２１０は実行選択回路２３２の出力に基づいてＲＵＮ−タスクの選択を行う（Ａ５）。タスクスイッチが完了すると（Ｓ２２）、処理状態はＡ２に移行する。
基本例に関連して、更に、タスク処理装置１００の主要素である退避回路１２０とタスク制御回路２００のうち一方のみを実装する場合について付言する。
［タスク制御回路２００を搭載しないタイプのタスク処理装置１００］【０１１４】
図１６は、図５のタスク処理装置１００のうち、タスク制御回路２００を搭載しないタスク処理装置１００の回路図である。
タスク制御回路２００を搭載しない代わりに、レジスタ切換制御回路３２２と処理データ保持部３２０を追加している。タスク制御回路２００を搭載しないため、タスクスケジューリング機能はソフトウェアＲＴＯＳにより実現される。したがって、ＲＴＯＳはタスクスイッチに際して、ＣＰＵ１５０の使用権を一時的に取得する必要が生じる。処理データ保持部３２０は、通常、ＲＴＯＳのための処理データを保持する。ＲＴＯＳがＣＰＵ１５０の使用権を取得するときには、処理データ保持部３２０は処理データ保持部３２０にあるＲＴＯＳ用の処理データと特殊レジスタ１５６のタスク用の処理データを入れ替える。以下、タスクＡからタスクＢへタスクスイッチするとして、その処理過程を説明する。【０１１５】
Ａ１．タスクＡがシステムコール実行するとき、システムコールの変数やシステムコールのＩＤを汎用レジスタ１５８の一部に記録する。
Ａ２．レジスタ切換制御回路３２２は、タスクＡの処理データを処理データ保持部３２０に移動させ、処理データ保持部３２０のＲＴＯＳ用処理データを処理レジスタ１５４にロードする。この段階で、ＲＴＯＳがＣＰＵ１５０の使用権を取得する。
Ａ３．レジスタ切換制御回路３２２は、退避レジスタ１１０ａに書き込み信号を入力し、処理データ保持部３２０のタスクＡ用処理データを退避レジスタ１１０に退避させる。
Ａ４．ＲＴＯＳは、汎用レジスタ１５８に記録されているシステムコールの変数やＩＤに基づき、システムコールに対応する処理を実行する。また、タスクＡのＴＣＢのタスク状態データを「ＲＥＡＤＹ」に設定し、タスクレディリストにタスクＡのＴＣＢを追加する。【０１１６】
Ｂ１．次に、ＲＴＯＳは先述したＲＵＮタスク選択条件にしたがって、ＲＵＮ−タスク、ここでは、タスクＢを選択する。
Ｂ２．ＲＴＯＳはレジスタ切換制御回路３２２に指示して、タスクＢを指定したタスク選択信号をロード選択回路１１２に入力させる。退避レジスタ１１０ｂから処理データ保持部３２０に処理データが移動される。
Ｂ３．レジスタ切換制御回路３２２は、処理データ保持部３２０のタスクＢ用処理データと処理レジスタ１５４のＲＴＯＳ用処理データを入れ替える。これにより、タスクＢがＣＰＵ１５０の使用権を取得する。【０１１７】
このような処理方法によれば、タスク制御回路２００を搭載する図５のタスク処理装置１００に比べて、タスク処理装置１００全体としての回路サイズをコンパクトにできる。ＲＴＯＳはソフトウェアとして実現されるが、処理データのロード・退避はレジスタ切換制御回路３２２からの信号によってハードウェア制御できる。処理レジスタ１５４、処理データ保持部３２０、ロード選択回路１１２、退避レジスタ１１０をそれぞれつなぐバスは処理データをパラレル転送可能なビット数に設定すれば、ＴＣＢへの処理データの退避やＴＣＢからの処理データのロードに比べて高速なタスクスイッチが可能となる。
［退避回路１２０を搭載しないタイプのタスク処理装置１００］【０１１８】
図１７は、図５のタスク処理装置１００のうち、退避回路１２０を搭載しないタスク処理装置１００の回路図である。
退避回路１２０を搭載しない代わりに、割込インタフェース回路３２４を追加している。退避回路１２０を搭載しないため、処理データはメモリのＴＣＢに退避される。処理データの退避・ロードに関してはソフトウェアベースのＲＴＯＳにより実現される。したがって、ＲＴＯＳはタスクスイッチに際して、ＣＰＵ１５０の使用権を一時的に取得する必要が生じる。以下、タスクＡからタスクＢへタスクスイッチするとして、その処理過程を説明する。【０１１９】
システムコールの実行によりタスクスイッチが発生すると、まず、ソフトウェアＲＴＯＳがタスクＡの処理データをタスクＡのＴＣＢに退避させる。そして、ＲＴＯＳ用の処理データを処理レジスタ１５４にロードする。このときの処理方法は、図３に関連して説明した内容と同等となる。【０１２０】
ソフトウェアＲＴＯＳは、割込インタフェース回路３２４にシステムコールのパラメータを書き込む。実行制御回路１５２は、ＣＰＵ１５０のＣＰＵクロックを停止させる。割込インタフェース回路３２４は、タスク制御回路２００にタスクスイッチを実行させる。タスク切換回路２１０は、まず、タスクＡのタスク状態レジスタ２５８をＲＥＡＤＹに設定し、タスク選択回路２３０からの出力により次のＲＵＮ−タスクであるタスクＢを選択する。タスク切換回路２１０は、割込インタフェース回路３２４に指示してタスクＢの処理データのロードを指示する。ここで、割込インタフェース回路３２４は実行制御回路１５２にＣＰＵクロックを再開させる。また、割込インタフェース回路３２４は、タスクＢが選択された旨をソフトウェアＲＴＯＳに通知する。ソフトウェアＲＴＯＳは、タスクＢのＴＣＢにアクセスし、タスクＢの処理データを処理レジスタ１５４にロードする。【０１２１】
このような処理方法によっても、退避回路１２０を搭載する図５のタスク処理装置１００に比べて、タスク処理装置１００全体としての回路サイズをコンパクトにできる。ＲＴＯＳの機能の一部はソフトウェアとして実現されるが、タスク選択処理はタスク制御回路２００により実現できる。【０１２２】
図２および図３に関連して説明したソフトウェアＲＴＯＳに比べて、図１６および図１７のタスク処理装置１００は、いずれもＲＴＯＳの機能の一部をハードウェア化することができる。図１６に関連して説明したように、退避回路１２０が存在することによって、処理データの退避・ロードのためにＴＣＢにアクセスする必要がなくなる。このため、レジスタ切換制御回路３２２により処理データの退避・ロード処理を実行可能となっている。また、図１７に関連して説明したように、タスク制御回路２００が存在することによって、ソフトウェアＲＴＯＳはタスク選択機能をタスク制御回路２００に委譲できる。【０１２３】
図５に関連して説明したように、退避回路１２０とタスク制御回路２００を搭載するタスク処理装置１００の場合、ＲＴＯＳのタスクスケジューリング機能を完全にハードウェア化できる。タスクスイッチに際してメモリのＴＣＢにアクセスする必要性がなくなるため、タスクスイッチ処理がいっそう高速化される。本発明者らの実験によると、図３等に関連して説明した一般的なソフトウェアＲＴＯＳに比べて、基本例におけるタスク処理装置１００は約１００倍の速度で動作することが確認されている。
｛改良例１｝【０１２４】
コンピュータプログラムを作成する上で、「キュー（Queue）」は定番かつ使用頻度の高いアルゴリズムである。このため、キュー処理の高速化は、コンピュータプログラムの処理速度向上に寄与しやすい。ただし、ＦＩＦＯ（First-In First Out）のキューであっても、場合によってはＬＩＦＯ（Last-In Last-Out）的に動作させたい場合がある。あるいは、ＬＩＦＯを基本としつつもＦＩＦＯ的に動作させたい場合もある。改良例１では、ＬＩＦＯにも対応できる特殊なキューのアルゴリズム（以下、「両投入型キューアルゴリズム」とよぶ）のハードウェア実装するタスク処理装置１００について説明する。【０１２５】
基本例のタスク処理装置１００は、タイマ管理に基づくタスクスケジューリング機能を搭載している。基本例のタスクスケジューリングは、「タスク優先順位が同じである限り、待ち時間が長いタスクに優先的に実行権を割り当てる」アルゴリズムである。以下、このようなタスクスケジューリングを「公平型タスクスケジューリング」とよぶ。【０１２６】
図１１においても公平型タスクスケジューリングの考え方に基づいてタスクレディリストの管理方法を説明した。ＲＵＮ−タスクであるタスクＪがＲＥＡＤＹ状態に戻るときには、最後尾のタスクＦの後ろに連結される。タスクＪの次には、タスクＡがＲＵＮ−タスクとなるので、タスク優先順位「０」の優先順位ポインタ２８０には、タスクＤ、・・・、タスクＦ、タスクＪという順に各タスクのＴＣＢが連結されることになる。タスクＪは、少なくとも、タスクＦの実行が終わるまで実行権を与えられない。公平型タスクスケジューリングにおける処理方法は、ＦＩＦＯ、すなわち、キューのアルゴリズムに似ている。時間管理に馴染みやすいアルゴリズムであるため、タイマ管理により公平型タスクスケジューリングをハードウェア実装できる。【０１２７】
一方、ソフトウェアＯＳにおいては、「タスク優先順位が同じである限り、いったんＲＵＮ−タスクとなったタスクには優先的に実行権を割り当てる」というタスクスケジューリングが採用されることも多い。以下、このようなタスクスケジューリングを「再実行優先型タスクスケジューリング」とよぶ。再実行優先型タスクスケジューリングでは、ＲＵＮ−タスクであるタスクＪがＲＥＡＤＹ状態に戻るときには、最後尾ではなく先頭に挿入される。タスクＪの次には、タスクＡがＲＵＮ−タスクとなるので、タスク優先順位「０」の優先順位ポインタ２８０には、タスクＪ、タスクＤ、・・・、タスクＦという順に各タスクのＴＣＢが連結されることになる。タスクＪは、タスクＡが終了すると、タスクＤやタスクＦよりも先に実行権を再付与される。いったん実行権を与えられたら、なるべくまとめて実行させたいタイプのタスクが存在するときには、再実行優先型タスクスケジューリングは有効である。再実行優先型タスクスケジューリングは、ＬＩＦＯ、すなわち、スタック的なアルゴリズムを含んでいるといえる。改良例１では、ＦＩＦＯを基本としつつもＬＩＦＯにも対応できる両投入型キューアルゴリズムのハードウェア実装により、再実行優先型タスクスケジューリングを実現する。
なお、再実行優先型タスクスケジューリングに限らず、両投入型キューアルゴリズムは一般的なアプリケーションプログラムにおいても有用である。このため、両投入型キューアルゴリズムのハードウェア実装は、さまざまなコンピュータプログラムの処理速度を向上させる上で有効である。【０１２８】
図１８は、改良例１におけるタスク処理装置１００の回路図である。
改良例１におけるタスク処理装置１００も、ＣＰＵ１５０に加えて退避回路１２０とタスク制御回路２００を含む。ただし、改良例１におけるタスク切換回路２１０は、メイン回路４００、書込回路４０２、キュー制御回路４０４および最大値選択回路４０６を含む。メイン回路４００は、基本例におけるタスク切換回路２１０とほぼ同等の機能を備える回路である。このため、改良例１におけるタスク切換回路２１０は、基本例におけるタスク切換回路２１０としてのメイン回路４００に書込回路４０２、キュー制御回路４０４および最大値選択回路４０６を追加した構成となっている。各状態記憶部２２０からは全タスクの全状態データが、タスク選択回路２３０だけではなく、最大値選択回路４０６やキュー制御回路４０４にも常時出力されている。【０１２９】
図１９は、改良例１におけるタスク制御回路２００の部分的な回路図である。
タスク制御回路２００の基本構成は、図１０に示した回路構成とほぼ同等である。各タスクに対応づけられる状態レジスタ２５０は、タスクＩＤレジスタ４１０、タスク優先順位レジスタ４１２、キュー順序レジスタ４１４、キュー識別レジスタ４１６を含む。状態レジスタ２５０は、そのほかのレジスタを含んでもよいが、ここでは両投入型キューアルゴリズムに関わるレジスタ群を中心として説明する。
（Ａ）タスクＩＤレジスタ４１０：タスクＩＤを保持する。基本例に示したタスクＩＤレジスタ２５４と同等である。タスクＩＤレジスタ４１０からはタスクＩＤを示すＥＩＤ＿Ｓ信号が常時出力される。
（Ｂ）タスク優先順位レジスタ４１２：タスク優先順位（ＰＲ）を保持する。基本例に示したタスク優先順位レジスタ２５６と同様である。ＰＲ＿Ｓ信号として常時出力される。
（Ｃ）キュー順序レジスタ４１４：後述する仮想キューへの投入順位を示す「順序値（ＯＤＲ）」を保持する。順序値が大きいほど、仮想キューの深くに投入されていることを示すが、詳しくは後述する。順序値は、ＯＤＲ＿Ｓ信号として常時出力される。
（Ｄ）キュー識別レジスタ４１６：仮想キューを識別する「キューＩＤ（ＱＩＤ）」を保持する。ＱＩＤ＿Ｓ信号として常時出力される。
タスク優先順位レジスタ４１２と、キュー順序レジスタ４１４、キュー識別レジスタ４１６は、特に、仮想キューを管理するためのキューレジスタとして機能する。【０１３０】
仮想キューは、タスク状態に対応づけられるキューである。たとえば、ＱＩＤ＝０の仮想キュー（以下、「仮想キュー（０）」のように表記する）をＲＥＡＤＹ状態、仮想キュー（１）をセマフォ待ち状態、仮想キュー（２）をミューテックス待ち状態に対応づけてもよい。あるいは、仮想キュー（１）をセマフォＩＤ＝０についてのセマフォ待ち状態、仮想キュー（２）をセマフォＩＤ＝１についてのセマフォ待ち状態に対応づけてもよい。ＱＩＤとタスク状態の対応づけは、ソフトウェアにて任意に設定すればよい。【０１３１】
タスクＡがＲＥＡＤＹ状態であるとき、キュー識別レジスタ４１６＿Ａには、ＲＥＡＤＹ状態に対応づけられる仮想キューのＱＩＤが設定される。タスク選択回路２３０やキュー制御回路４０４は、各キュー識別レジスタ４１６を参照することにより、各タスクのタスク状態を判別できる。このため、キュー識別レジスタ４１６は、基本例におけるタスク状態レジスタ２５８、待機理由レジスタ２６２、セマフォＩＤレジスタ２６４、ミューテックスＩＤレジスタ２６５、イベントＩＤレジスタ２６６等と同等に機能できる。【０１３２】
仮想キューは、物理的に存在するものではなく、キュー順序レジスタ４１４やキュー識別レジスタ４１６の設定内容によって想定される概念的なキューである点は重要である。たとえば、各キュー識別レジスタ４１６とキュー順序レジスタ４１４において、
タスクＡ：ＱＩＤ＝０、ＯＤＲ＝０
タスクＢ：ＱＩＤ＝０、ＯＤＲ＝１
タスクＣ：ＱＩＤ＝０、ＯＤＲ＝２
タスクＤ：ＱＩＤ＝１、ＯＤＲ＝０
として設定されているときには、仮想キュー（０）には、タスクＣ、Ｂ、Ａの順に投入されており、仮想キュー（１）には、タスクＤだけが投入されていることを示す。ＱＩＤとＯＤＲの数値範囲によって仮想キューの数やサイズを柔軟に変更できる。【０１３３】
タスク選択回路２３０は、状態レジスタ２５０から出力される状態データに基づいて、状態遷移させるべきタスクを選択する。メイン回路４００は、ＣＮＤ信号をタスク選択回路２３０に入力する。ＣＮＤはタスク選択条件を示す信号であり、キューＩＤを示すＱＩＤ＿Ｃとタスク優先順位を示すＰＲ＿Ｃを含む。たとえば、仮想キュー（０）からタスクを抽出したい場合、メイン回路４００は、ＣＮＤにＱＩＤ＿Ｃ＝０を設定する。タスク選択回路２３０は、指定された仮想キュー（０）において抽出対象となるタスク（以下、単に「抽出タスク」とよぶ）のタスクＩＤをＥＩＤ＿Ａ１に出力し、ＥＩＤ＿Ａ１＿ＥＮをアサートする。また、ＰＲ＿Ａ１、ＯＤＲ＿Ａ１には、抽出タスクのタスク優先順位と順序値が出力される。このように、メイン回路４００は、ＱＩＤ＿Ｃ＝Ｑｎを指定してタスク選択回路２３０に問い合わせることにより、仮想キュー（Ｑｎ）の抽出タスクを知ることができる。タスク選択回路２３０は抽出タスクを選択する抽出候補回路として機能する。より詳細については図３２に関連して後述する。【０１３４】
最大値選択回路４０６には、メイン回路４００からＣＮＤ信号が入力される。最大値選択回路４０６は、ＣＮＤによりＱＩＤ＿Ｃ＝Ｑｎが指定されると、仮想キュー（Ｑｎ）における最大順序値をＯＤＲ＿Ａ２に出力し、ＥＩＤ＿Ａ２＿ＥＮをアサートする。より詳細については図２８に関連して後述する。【０１３５】
キュー制御回路４０４は、各状態レジスタ２５０の状態データを設定することにより、各タスクの状態遷移を制御する。キュー制御回路４０４には、メイン回路４００からＣＭＤとＥＩＤ＿Ｃを入力される、そのほかにも、ＣＮＤ（ＱＩＤ＿Ｃ、ＰＲ＿Ｃ）、ＯＤＲ＿Ａ１、ＯＤＲ＿Ａ２、ＯＤＲ＿Ａ２＿ＥＮと各状態レジスタ２５０の状態データが入力される。【０１３６】
ＣＭＤは、仮想キューを操作するためのコマンドを示す。ＣＭＤの対象となる仮想キューのキューＩＤ、タスクのタスクＩＤ、タスク優先順位は、それぞれ、ＱＩＤ＿Ｃ、ＥＩＤ＿Ｃ、ＰＲ＿Ｃにより指定される。コマンドは、ＥＮＱ＿ＴＬ、ＥＮＱ＿ＴＰ、ＤＥＱの３種類のうちのいずれかである。【０１３７】
順投入コマンドＥＮＱ＿ＴＬが入力されると、仮想キューの最後尾からＥＩＤ＿Ｃ信号により指定されたタスクが投入される。以下、キューの最後尾からの投入を「順投入」とよぶ。抽出コマンドＤＥＱが入力されると、仮想キューの先頭からタスクが取り出される。ＥＮＱ＿ＴＬとＤＥＱにより、ＦＩＦＯとしてのキュー制御が実行される。逆投入コマンドＥＮＱ＿ＴＰが入力されると、仮想キューの先頭からＥＩＤ＿Ｃ信号により指定されたタスクが投入される。以下、このようなキューの先頭からの投入を「逆投入」とよぶ。逆投入は、ＦＩＦＯとしての投入ではない点で特殊な投入方法である。【０１３８】
メイン回路４００からＣＭＤが入力されると、書込回路４０２はＷＴをアサートし、キュー制御回路４０４から出力される各データの状態レジスタ２５０への書き込みが実行される。キュー制御回路４０４や書込回路４０２、タスク選択回路２３０、最大値選択回路４０６等が、仮想キューを制御するための仮想キュー処理回路として機能する。
キュー制御回路４０４の回路構成については、次の図２０に関連して詳述する。【０１３９】
図２０は、キュー制御回路４０４の回路図である。
キュー制御回路４０４は、複数のレジスタ値生成回路４２０の集合体である。各レジスタ値生成回路４２０は同じ回路である。レジスタ値生成回路４２０は、タスクごとに対応づけられている。状態レジスタ２５０ごとに対応づけられているともいえる。レジスタ値生成回路４２０＿Ｅｎは、タスクＩＤ＝Ｅｎのタスク（以下、「タスク（Ｅｎ）」のように表記する）に対応づけられる。レジスタ値生成回路４２０には、該当タスクのタスクＩＤがＥＬＭ＿ＩＤ信号として固定的に入力される。【０１４０】
ＯＤＲ＿Ｓ、ＱＩＤ＿Ｓ、ＰＲ＿Ｓは、状態レジスタ２５０から出力される状態データであり、それぞれ、順序値、キューＩＤ、タスク優先順位を示す。タスク（Ｅｎ）に対応づけられるレジスタ値生成回路４２０＿Ｅｎには、タスク（Ｅｎ）の順序値、キューＩＤ、タスク優先順位がそれぞれＯＤＲ＿Ｓ＿Ｅｎ、ＱＩＤ＿Ｓ＿Ｅｎ、ＰＲ＿Ｓ＿Ｅｎとして入力される。ＣＭＤ、ＥＩＤ＿Ｃは、メイン回路４００から入力される。ＯＤＲ＿Ａ２＿ＥＮとＯＤＲ＿Ａ２は、最大値選択回路４０６から入力される。最大順序値を示すＯＤＲ＿Ａ２は、ＯＤＲ＿Ａ２＿ＥＮがアサートされるときに有効な入力となる。ＯＤＲ＿Ａ１は、タスク選択回路２３０から入力される。ＯＤＲ＿Ａ１は、抽出タスクのタスクＩＤを示す。ＱＩＤ＿ＣとＰＲ＿Ｃは、メイン回路４００から入力されるＣＮＤ信号であり、それぞれ、タスク選択条件としてのＱＩＤとＰＲを示す。
レジスタ値生成回路４２０＿Ｅｎは、タスク（Ｅｎ）の順序値、キューＩＤ、タスク優先順位をそれぞれＱＩＤ＿Ｎ＿Ｅｎ、ＯＤＲ＿Ｎ＿Ｅｎ、ＰＲ＿Ｎ＿Ｅｎとして出力し、書込回路４０２によりＷＴがアサートされたときに状態レジスタ２５０＿Ｅｎに書き込まれる。
書込回路４０２がＷＴをアサートすると、全てのレジスタ値生成回路４２０のＱＩＤ＿Ｎ＿Ｅｎ、ＯＤＲ＿Ｎ＿Ｅｎ、ＰＲ＿Ｎ＿Ｅｎが全ての状態レジスタ２５０に書き込まれる。ＣＭＤにより影響を受けるタスクについてのレジスタ値生成回路４２０は、後述するアルゴリズムにて指定される新たなデータを状態レジスタ２５０に書き込む。一方、ＣＭＤにより影響を受けないタスクについてのレジスタ値生成回路４２０も、状態レジスタ２５０に書き込まれているデータと同じデータを再出力して書き込みを実行する。
なお、レジスタ値生成回路４２０のＷＴは、各状態レジスタ２５０ではなくキュー制御回路４０４に直接入力されてもよい。この場合、キュー制御回路４０４に内蔵されるレジスタ値生成回路４２０のうち、ＣＭＤにより状態変更すべきタスクについてのレジスタ値生成回路４２０だけが、新たなデータを状態レジスタ２５０に書き込むとしてもよい。
レジスタ値生成回路４２０の具体的な処理内容については後述する。【０１４１】
図２１は、仮想キューとタスクの関係を示す概念図である。
ここでは、仮想キュー（Ｑ０）と仮想キュー（Ｑ１）の２つの仮想キューを想定している。仮想キュー（Ｑ０）は、タスク優先順位ＰＲ＝０のタスクが投入される優先キュー（以下、「優先キュー（Ｑ０：０）」と表記する）とタスク優先順位ＰＲ＝１のタスクが投入される優先キュー（Ｑ０：１）の２つの優先キューの集合である。仮想キュー（Ｑ１）についても同様であり、実質的には４つの優先キューが想定される。たとえば、仮想キュー（Ｑ０）はＲＥＡＤＹ状態、仮想キュー（Ｑ１）はＷＡＩＴ状態に対応づけられてもよい。【０１４２】
各仮想キューは、同図向かって左を投入口、右を抽出口とするキューである。順投入においては左側からタスクが投入され、逆投入においては右側からタスクが投入される。タスクが抽出されるのは常に右側からである。【０１４３】
同図では、タスクＩＤ＝Ｅ０、Ｅ１、Ｅ２、Ｅ３の４つのタスクが仮想キューに投入されている。タスク（Ｅ０）とタスク（Ｅ２）、タスク（Ｅ３）は仮想キュー（Ｑ０）に投入されている。このうち、タスク（Ｅ０）とタスク（Ｅ３）は、タスク優先順位ＰＲ＝０のタスクであるため、優先キュー（Ｑ０：０）に投入される。タスク（Ｅ２）はＰＲ＝１のタスクであるため、優先キュー（Ｑ０：１）に投入される。仮想キュー（Ｑ０）に投入されるタスク（Ｅ３）、タスク（Ｅ２）、タスク（Ｅ０）の順序値ＯＤＲは、２、１、０となっている。タスク優先順位ＰＲ＝０のタスク（Ｅ１）は、仮想キュー（Ｑ１）に投入されている。ＯＤＲは「０」である。【０１４４】
図２２は、図２１に対応した状態レジスタ２５０のデータ構造図である。
図２１に示した仮想キューへの各タスクの投入状態は、状態レジスタ２５０の設定により表現される。図２１に示した状態においては、タスク（Ｅ０）〜タスク（Ｅ７）のうち、仮想キューに投入されているのはタスク（Ｅ０）〜タスク（Ｅ３）である。このため、それ以外のタスクのキュー識別レジスタ４１６には未投入を示す「Ｎｏｎ」が設定される。仮想キュー（Ｑ０）に投入されるタスク（Ｅ０）、タスク（Ｅ３）、タスク（Ｅ２）のキュー識別レジスタ４１６には「Ｑ０」が設定される。また、仮想キュー（Ｑ１）に投入されるタスク（Ｅ１）のキュー識別レジスタ４１６には「Ｑ１」が設定される。キュー識別レジスタ４１６の設定内容により、どのタスクがどの仮想キューに投入されているかを表現する。【０１４５】
仮想キュー（Ｑ０）に投入されている３つのタスク（Ｅ０）、タスク（Ｅ３）、タスク（Ｅ２）のキュー順序レジスタ４１４には、それぞれＯＤＲとして０、２、１が設定される。仮想キュー（Ｑ１）に投入されているタスクは、タスク（Ｅ１）だけなので、順序値は最小の「０」が設定される。キュー順序レジスタ４１４の設定内容により、各タスクの仮想キューにおける位置を表現する。【０１４６】
タスク（Ｅ０）、タスク（Ｅ１）、タスク（Ｅ３）のタスク優先順位ＰＲは「０」である。そこで、これらのタスクのタスク優先順位レジスタ４１２には「０」が設定される。タスク（Ｅ２）のタスク優先順位ＰＲは「１」であるため、タスク優先順位レジスタ４１２＿Ｅ２には「１」が設定される。タスク優先順位レジスタ４１２の設定により、各タスクがどの優先キューに投入されているかを表現する。
以上の設定に基づいて、順投入、逆投入、抽出における処理内容について詳述する。
［順投入］【０１４７】
図２３は、図２１の仮想キューにタスク（Ｅ４）を順投入するときの概念図である。
ここでは、仮想キュー（Ｑ１）にタスク優先順位ＰＲ＝０のタスク（Ｅ４）を順投入するとして説明する。メイン回路４００は、ＣＭＤ＝ＥＮＱ＿ＴＬ（順投入コマンド）として、ＥＩＤ＿Ｃ＝Ｅ４、ＱＩＤ＿Ｃ＝Ｑ１、ＰＲ＿Ｃ＝０を設定する。キュー制御回路４０４に内蔵されるレジスタ値生成回路４２０＿Ｅ４は、ＥＩＤ＿Ｃ＝ＥＬＭ＿ＩＤ＝Ｅ４を検出すると、ＱＩＤ＿Ｎ＿Ｅ４＝ＱＩＤ＿Ｃ＝Ｑ１、ＯＤＲ＿Ｎ＿Ｅ４＝０、ＰＲ＿Ｎ＿Ｅ４＝ＰＲ＿Ｃ＝０を出力する。ＱＩＤ＿Ｎ＿Ｅ４はタスク（Ｅ４）の投入先となる仮想キューのＱＩＤ、ＯＤＲ＿Ｎ＿Ｅ４は投入時における順序値、ＰＲ＿Ｎ＿Ｅ４はタスク（Ｅ４）のタスク優先順位である。順投入されるタスクについてのＯＤＲ＿Ｎは、常に「０」に設定される。これは、キューに対する最新の投入を示す順序値である。【０１４８】
レジスタ値生成回路４２０＿Ｅ４だけでなく、ＱＩＤ＿Ｓ＿Ｅｎ＝ＱＩＤ＿Ｃ＝Ｑ１となるレジスタ値生成回路４２０＿Ｅｎも反応する。レジスタ値生成回路４２０＿Ｅｎは、ＯＤＲ＿Ｎ＿Ｅｎ＝ＯＤＲ＿Ｓ＿Ｅｎ＋１を出力する。ここでは、レジスタ値生成回路４２０＿Ｅ１がＱＩＤ＿Ｓ＿Ｅ１＝ＱＩＤ＿Ｃ＝Ｑ１を検出し、ＯＤＲ＿Ｎ＿Ｅ１＝０＋１＝１を出力する。ＯＤＲ＿Ｎ＿Ｅ１はタスク（Ｅ１）投入後の順序値である。タスク（Ｅ４）の順投入先となる仮想キュー（Ｑ１）に既に投入されているタスクは、順序値が影響を受けることになる。このような処理過程を経て、仮想キュー（Ｑ１）の要素であるタスク（Ｅ４）とタスク（Ｅ１）の状態データが調整される。【０１４９】
図２４は、図２３に対応した状態レジスタ２５０のデータ構造図である。
同図において下線を付与している部分が、図２２に示した状態レジスタ２５０の設定内容から変化した箇所である。タスク（Ｅ４）の仮想キュー（Ｑ１）への順投入により、キュー識別レジスタ４１６＿Ｅ４にはＱＩＤ＿Ｎ＿Ｅ４により「Ｑ１」が設定される。タスク（Ｅ４）のＯＤＲは「０」、ＰＲは「０」である。タスク（Ｅ４）の順投入により、仮想キュー（Ｑ１）に既に投入されていたタスク（Ｅ１）のＯＤＲは、「０」から「１」にインクリメントされる。変更後の状態レジスタ２５０の設定内容により、図２３に示した仮想キュー（Ｑ１）の状態が表現される。【０１５０】
図２５は、図２３の仮想キューにタスク（Ｅ５）を順投入するときの概念図である。
ここでは、仮想キュー（Ｑ０）にタスク優先順位ＰＲ＝１のタスク（Ｅ５）を順投入するとして説明する。メイン回路４００は、ＣＭＤ＝ＥＮＱ＿ＴＬ（順投入コマンド）として、ＥＩＤ＿Ｃ＝Ｅ５、ＱＩＤ＿Ｃ＝Ｑ０、ＰＲ＿Ｃ＝１を設定する。レジスタ値生成回路４２０＿Ｅ５は、ＱＩＤ＿Ｎ＿Ｅ５＝ＱＩＤ＿Ｃ＝Ｑ０、ＯＤＲ＿Ｎ＿Ｅ５＝０、ＰＲ＿Ｎ＿Ｅ５＝ＰＲ＿Ｃ＝１を出力する。【０１５１】
レジスタ値生成回路４２０＿Ｅ５だけでなく、ＱＩＤ＿Ｃ＝ＱＩＤ＿Ｓ＿Ｅｎ＝Ｑ０となるレジスタ値生成回路４２０＿Ｅｎは、ＱＩＤ＿Ｃ＝ＱＩＤ＿Ｓ＿Ｅｎを検出すると、ＯＤＲ＿Ｎ＿Ｅｎ＝ＯＤＲ＿Ｓ＿Ｅｎ＋１を出力する。この例では、タスク（Ｅ０）、タスク（Ｅ２）、タスク（Ｅ３）に対応するレジスタ値生成回路４２０が該当する。こうして、仮想キュー（Ｑ０）の要素であるタスク（Ｅ５）とタスク（Ｅ０）、タスク（Ｅ２）、タスク（Ｅ３）の状態データが調整される。【０１５２】
図２６は、図２５に対応した状態レジスタ２５０のデータ構造図である。
同図において下線を付与している部分が、図２４に示した状態レジスタ２５０の設定内容から変化した箇所である。まず、タスク（Ｅ５）の仮想キュー（Ｑ０）への順投入により、キュー識別レジスタ４１６＿Ｅ５には新たに「Ｑ０」が設定される。タスク（Ｅ５）のＯＤＲは「０」、ＰＲは「１」である。タスク（Ｅ５）の順投入により、仮想キュー（Ｑ０）に元々投入されていたタスク（Ｅ０）、タスク（Ｅ１）、タスク（Ｅ３）のＯＤＲは、それぞれインクリメントされる。【０１５３】
図２７は、順投入の処理過程を示すフローチャートである。
メイン回路４００は、順投入させるタスク（以下、「順投入タスク」とよぶ）についての投入条件を設定する（Ｓ１０）。具体的には、ＣＭＤ＝ＥＮＱ＿ＴＬとして、ＥＩＤ＿Ｃ、ＱＩＤ＿Ｃ、ＰＲ＿Ｃを設定する。キュー制御回路４０４のうち、順投入タスクに対応するレジスタ値生成回路４２０は、順投入タスクのタスク優先順位レジスタ４１２、キュー順序レジスタ４１４、キュー識別レジスタ４１６にそれぞれ、ＰＲ＿Ｃ、０、ＱＩＤ＿Ｃを設定する（Ｓ１２）。【０１５４】
仮想キュー（ＱＩＤ＿Ｃ）に既に別のタスクが投入されている場合には（Ｓ１４のＹ）、既投入の各タスクについてＯＤＲをインクリメントする（Ｓ１６）。図２５に示した例の場合、タスク（Ｅ０）、タスク（Ｅ２）、タスク（Ｅ３）について、ＯＤＲがインクリメントされる。Ｓ１２、Ｓ１４、Ｓ１６の処理は時間的にほぼ並行して実行される。
［逆投入］【０１５５】
図２８は、最大値選択回路４０６の部分的な回路図である。
最大値選択回路４０６は、逆投入処理のためにメイン回路４００により駆動される回路である。最大値選択回路４０６は、ＣＮＤ信号としてＱＩＤ＿Ｃ＝Ｑｎを入力されたとき、仮想キュー（Ｑｎ）における最大順序値をＯＤＲ＿Ａ２に出力し、ＯＤＲ＿Ａ２＿ＥＮをアサートする。最大値選択回路４０６は、基本例に示した実行選択回路２３２やセマフォ選択回路２３４と同じく、複数段の比較回路から構成される。最大値選択回路４０６は、４つの第１比較回路４２２（４２２ａ、４２２ｂ等）、２つの第２比較回路４２４（４２４ａ等）、１つの第３比較回路（図示せず）を含む。また、８つの判定回路４２６（４２６ａ、４２６ｂ、４２６ｃ、４２６ｄ等）を含む。【０１５６】
第１比較回路４２２ａに着目して説明する。第１比較回路４２２ａは、タスク０とタスク１を比較し、どちらも仮想キュー（Ｑｎ）に投入されていれば、順序値が大きい方のタスクを選択する。第１比較回路４２２ａには、タスク０とタスク１のタスクＩＤと順序値がＥＩＤ＿Ｓ、ＯＤＲ＿Ｓとして入力される。
第１の判定：判定回路４２６ａは、タスク０が仮想キュー（Ｑｎ）に投入済みであればＥＩＤ＿１１Ａ＿ＥＮをアサートする。判定回路４２６ｂは、タスク１が仮想キュー（Ｑｎ）に投入済みであればＥＩＤ＿１１Ｂ＿ＥＮをアサートする。第１比較回路４２２ａは、まず、判定回路４２６ａと判定回路４２６ｂのそれぞれから出力されるＥＩＤ＿１１＿ＥＮ信号を参照する。いずれか一方が「１」であれば、いずれか一方のタスクだけが仮想キュー（Ｑｎ）に投入されていることになる。このとき、第１比較回路４２２ａは、仮想キュー（Ｑｎ）に投入されている方のタスクのタスクＩＤ（ＥＩＤ＿Ｓ）と順序値（ＯＤＲ＿Ｓ）をそれぞれＥＩＤ＿２１Ａ、ＯＤＲ＿２１Ａとして出力し、ＥＩＤ＿２１Ａ＿ＥＮをアサートする。
判定回路４２６ａと判定回路４２６ｂが共に「０」を出力するときには、どちらのタスクも仮想キュー（Ｑｎ）に投入されていない。このとき、ＥＩＤ＿２１Ａ＿ＥＮはネゲートされ、以後、タスク０とタスク１のいずれも第２比較回路４２４ａにおいて考慮の対象とはならない。
判定回路４２６ａと判定回路４２６ｂが共に「１」を出力するときには、どちらのタスクも仮想キュー（Ｑｎ）に投入済である、このとき、次の第２の判定が実行される。【０１５７】
第２の判定：タスク０のＯＤＲ＿Ｓ＿０とタスク１のＯＤＲ＿Ｓ＿１を比較し、順序値が大きい方のタスクを選択する。第１比較回路４２２ａは、順序値が大きい方のタスクのタスクＩＤ（ＥＩＤ＿Ｓ）と順序値（ＯＤＲ＿Ｓ）をそれぞれＥＩＤ＿２１Ａ、ＯＤＲ＿２１Ａとして出力し、ＥＩＤ＿２１Ａ＿ＥＮをアサートする。【０１５８】
他の第１比較回路４２２の処理内容も同様であり、タスク０とタスク１、タスク２とタスク３、タスク４とタスク５、タスク６とタスク７がそれぞれ比較される。第２比較回路４２４は、２つの第１比較回路４２２からの出力により、更に順序値が大きい方のタスクを選択する。第２比較回路４２４ａに着目して説明する。第２比較回路４２４ａは、第１比較回路４２２ａの出力信号と第１比較回路４２２ｂの出力信号を比較し、順序値が大きい方のタスクを選択する。第２比較回路４２４ａには、第１比較回路４２２ａと第１比較回路４２２ｂからそれぞれ、ＥＩＤ＿２１、ＯＤＲ＿２１、ＥＩＤ＿ＥＮが入力される。第２比較回路４２４は、タスク０〜タスク３のうち、仮想キュー（Ｑｎ）の中で最も順序値の大きいタスクを選択する。他の第２比較回路４２４も同様であり、最終的に、仮想キュー（Ｑｎ）における最大順序値がＯＤＲ＿Ａ２信号として出力される。いずれかのタスクが選択されたときにはＯＤＲ＿Ａ２＿ＥＮはアサートされ、いずれのタスクも仮想キュー（Ｑｎ）に存在しないときにはＯＤＲ＿Ａ２＿ＥＮはネゲートされる。
なお、第１比較回路４２２、第２比較回路４２４、第３比較回路には、優先順位判定を無効化するためのＰＲ無効信号が入力されてもよい。ＰＲ無効信号がアサートされているときには、各比較回路は、優先順位を判定条件から除外してタスクを選択する。図３２に示す各比較回路についても同様である。【０１５９】
図２９は、図２５の仮想キューにタスク（Ｅ６）を逆投入するときの概念図である。
ここでは、仮想キュー（Ｑ０）にタスク優先順位ＰＲ＝１のタスク（Ｅ６）を逆投入するとして説明する。まず、メイン回路４００は、投入先のＱＩＤ＝Ｑ０をＱＩＤ＿Ｃ信号により最大値選択回路４０６に入力する。最大値選択回路４０６は、仮想キュー（Ｑ０）の最大順序値をキュー制御回路４０４にＯＤＲ＿Ａ２として出力し、ＯＤＲ＿Ａ２＿ＥＮをアサートする。図２５によると、仮想キュー（Ｑ０）の最大順序値はタスク（Ｅ３）の「３」であるため、ＯＤＲ＿Ａ２＝３となる。【０１６０】
次に、メイン回路４００は、ＣＭＤ＝ＥＮＱ＿ＴＰ（逆投入コマンド）として、ＥＩＤ＿Ｃ＝Ｅ６、ＱＩＤ＿Ｃ＝Ｑ０、ＰＲ＿Ｃ＝１を設定する。このとき、キュー制御回路４０４に内蔵されるレジスタ値生成回路４２０＿Ｅ６は、ＥＩＤ＿Ｃ＝ＥＬＭ＿ＩＤ＝Ｅ６を検出すると、ＱＩＤ＿Ｎ＿Ｅ６＝ＱＩＤ＿Ｃ＝Ｑ０、ＯＤＲ＿Ｎ＿Ｅ６＝ＯＤＲ＿Ａ２＋１＝３＋１＝４、ＰＲ＿Ｎ＿Ｅ６＝ＰＲ＿Ｃ＝１を出力する。【０１６１】
ＣＭＤ＝ＥＮＱ＿ＴＰ（逆投入コマンド）のときには、ＥＩＤ＿Ｃにて指定されたタスクに対応づけられているレジスタ値生成回路４２０しか動作しない。このため、逆投入されるタスク（Ｅ６）の状態データだけが設定変更される。【０１６２】
図３０は、図２９に対応した状態レジスタ２５０のデータ構造図である。
同図において下線を付与している部分が、図２６に示した状態レジスタ２５０の設定内容から変化した箇所である。まず、タスク（Ｅ６）の仮想キュー（Ｑ０）への逆投入により、キュー識別レジスタ４１６＿Ｅ６には新たに「Ｑ０」が設定される。タスク（Ｅ６）のＯＤＲは「４」、ＰＲは「１」である。タスク（Ｅ６）の逆投入により、他のタスクの状態データは影響を受けない。【０１６３】
図３１は、逆投入の処理過程を示すフローチャートである。
メイン回路４００は、まず、逆投入先となる仮想キューのＱＩＤ＝Ｑｎを最大値選択回路４０６に入力する（Ｓ２０）。メイン回路４００は、仮想キュー（Ｑｎ）の最大順序値をキュー制御回路４０４に出力する（Ｓ２２）。メイン回路４００は、逆投入させるタスク（以下、「逆投入タスク」とよぶ）についての投入条件を設定する（Ｓ２４）。具体的には、ＣＭＤ＝ＥＮＱ＿ＴＰ（逆投入コマンド）として、ＥＩＤ＿Ｃ、ＱＩＤ＿Ｃ、ＰＲ＿Ｃを設定する。キュー制御回路４０４のうち、逆投入タスクに対応するレジスタ値生成回路４２０は、逆投入タスクのタスク優先順位レジスタ４１２、キュー順序レジスタ４１４、キュー識別レジスタ４１６にそれぞれ、ＰＲ＿Ｃ、最大順序値＋１、ＱＩＤ＿Ｃを設定する（Ｓ２６）。ただし、最大順序値＝０であってＯＤＲ＿Ａ２＿ＥＮがネゲートされているとき、すなわち、仮想キュー（Ｑｎ）にタスクが未投入であるときには、キュー順序レジスタ４１４には初投入を示す順序値「０」を設定する。【０１６４】
以上に示したように、順投入時においては他のタスクについて順序値の調整が発生する可能性があるが、逆投入時においてはこのような調整は不要である。ＦＩＦＯを前提として仮想キューを見たとき、過去に投入されたタスクほど大きな順序値が設定される。いいかえれば、仮想キュー深くに投入されているタスクほど、順序値が大きい。反対に、仮想キュー深くに投入されているタスクほど順序値が小さくなるように設定してもよい。この場合には、順投入時においては他のタスクについて順序値の調整は不要となるが、逆投入時においては他のタスクについて順序値の調整が発生する可能性がある。
［抽出］【０１６５】
図３２は、タスク選択回路２３０の部分的な回路図である。
タスク選択回路２３０の基本構成は、基本例として図１２に関連して説明した通りである。改良例１におけるタスク選択回路２３０は、メイン回路４００からの問い合わせを受けたときに、抽出タスクを特定する。ここでは、この抽出タスクを特定するための仕組みに関わる回路構成について説明する。タスク選択回路２３０は、ＣＮＤ信号としてＱＩＤ＿Ｃ＝Ｑｎを入力されたとき、仮想キュー（Ｑｎ）において最もタスク優先順位の高い優先キューから抽出タスクを選択し、抽出タスクのタスクＩＤ、タスク優先順位、順序値をそれぞれＥＩＤ＿Ａ１、ＰＲ＿Ａ１、ＯＤＲ＿Ａ１に出力し、ＥＩＤ＿Ａ１＿ＥＮをアサートする。タスク選択回路２３０は、基本例に示した実行選択回路２３２やセマフォ選択回路２３４と同じく、複数段の比較回路から構成される。タスク選択回路２３０は、４つの第１比較回路４３０（４３０ａ、４３０ｂ等）、２つの第２比較回路４３２（４３２等）、１つの第３比較回路（図示せず）を含む。また、８つの判定回路４３４（４３４ａ、４３４ｂ、４３４ｃ、４３４ｄ等）を含む。【０１６６】
第１比較回路４３０ａに着目して説明する。第１比較回路４２２ａは、タスク０とタスク１を比較し、どちらも仮想キュー（Ｑｎ）に投入されていれば、タスク優先順位が高い方のタスクを選択する。タスク優先順位が同じであれば、順序値が大きい方のタスクを選択する。第１比較回路４３０ａには、タスク０とタスク１のタスクＩＤ、タスク優先順位、順序値がＥＩＤ＿Ｓ、ＰＲ＿Ｓ、ＯＤＲ＿Ｓとして入力される。
第１の判定：判定回路４３４ａは、タスク０が仮想キュー（Ｑｎ）に投入済みであればＥＩＤ＿１１Ａ＿ＥＮをアサートする。判定回路４３４ｂは、タスク１が仮想キュー（Ｑｎ）に投入済みであればＥＩＤ＿１１Ｂ＿ＥＮをアサートする。第１比較回路４３０ａは、まず、判定回路４３４ａと判定回路４３４ｂのそれぞれから出力されるＥＩＤ＿１１＿ＥＮ信号を参照する。いずれか一方が「１」であれば、いずれか一方のタスクだけが仮想キュー（Ｑｎ）に投入されていることになる。このとき、第１比較回路４３０ａは、仮想キュー（Ｑｎ）に投入されている方のタスクのタスクＩＤ（ＥＩＤ＿Ｓ）、タスク優先順位（ＰＲ＿Ｓ）および順序値（ＯＤＲ＿Ｓ）をそれぞれＥＩＤ＿２１Ａ、ＰＲ＿１１Ａ、ＯＤＲ＿２１Ａとして出力し、ＥＩＤ＿２１Ａ＿ＥＮをアサートする。
判定回路４３４ａと判定回路４３４ｂが共に「０」を出力するときには、どちらのタスクも仮想キュー（Ｑｎ）に投入されていない。このとき、ＥＩＤ＿２１Ａ＿ＥＮはネゲートされ、以後、タスク０とタスク１のいずれも第２比較回路４３２ａにおいて考慮の対象とはならない。
判定回路４３４ａと判定回路４３４ｂが共に「１」を出力するときには、どちらのタスクも仮想キュー（Ｑｎ）に投入済である、このとき、次の第２の判定が実行される。【０１６７】
第２の判定：タスク０のＰＲ＿Ｓ＿０とタスク１のＰＲ＿Ｓ＿１を比較し、タスク優先順位が高い方、いいかえれば、ＰＲ＿Ｓが小さい方のタスクを選択する。第１比較回路４３０ａは、タスク優先順位が高い方のタスクのタスクＩＤ（ＥＩＤ＿Ｓ）、タスク優先順位（ＰＲ＿Ｓ）および順序値（ＯＤＲ＿Ｓ）をそれぞれＥＩＤ＿２１Ａ、ＰＲ＿２１Ａ、ＯＤＲ＿２１Ａとして出力し、ＥＩＤ＿２１Ａ＿ＥＮをアサートする。２つのタスクのタスク優先順位が同じであれば、次の第３の判定が実行される。【０１６８】
第３の判定：タスク０のＯＤＲ＿Ｓ＿０とタスク１のＯＤＲ＿Ｓ＿１を比較し、順序値が大きい方のタスクを選択する。第１比較回路４３０ａは、順序値が大きい方のタスクのタスクＩＤ（ＥＩＤ＿Ｓ）、タスク優先順位（ＰＲ＿Ｓ）と順序値（ＯＤＲ＿Ｓ）をそれぞれＥＩＤ＿２１Ａ、ＰＲ＿２１Ａ、ＯＤＲ＿２１Ａとして出力し、ＥＩＤ＿２１Ａ＿ＥＮをアサートする。【０１６９】
他の第１比較回路４３０の処理内容も同様であり、タスク０とタスク１、タスク２とタスク３、タスク４とタスク５、タスク６とタスク７がそれぞれ比較される。第２比較回路４３２は、２つの第１比較回路４３０からの出力により、更に抽出タスクの候補を絞り込む。最終的に、仮想キュー（Ｑｎ）において最もタスク優先順位の高い優先キューから、抽出タスクが選択される。いずれかのタスクが選択されたときにはＥＩＤ＿Ａ１＿ＥＮはアサートされ、いずれのタスクも仮想キュー（Ｑｎ）に存在しないときにはＥＩＤ＿Ａ１＿ＥＮはネゲートされる。【０１７０】
図３３は、図２９の仮想キューからタスク（Ｅ３）を抽出するときの概念図である。
ここでは、仮想キュー（Ｑ０）からタスクを１つ抽出するとして説明する。メイン回路４００は、ＱＩＤ＿Ｃ＝Ｑ０をタスク選択回路２３０に入力する。図２９によると、仮想キュー（Ｑ０）のうち最も高いタスク優先順位に対応する優先キュー（Ｑ０：０）には、順序値「１」のタスク（Ｅ０）と順序値「３」のタスク（Ｅ３）が投入されている。タスク選択回路２３０は、順序値が大きい方のタスク（Ｅ３）を抽出タスクとして選択する。タスク選択回路２３０は、ＥＩＤ＿Ａ１＝Ｅ３、ＰＲ＿Ａ１＝０、ＯＤＲ＿Ａ１＝３として、ＥＩＤ＿Ａ１＿ＥＮをアサートする。【０１７１】
次に、メイン回路４００は、ＣＭＤ＝ＤＥＱ（抽出コマンド）として、ＥＩＤ＿Ｃ＝ＥＩＤ＿Ａ１＝Ｅ３、ＱＩＤ＿Ｃ＝Ｑ０を設定する。レジスタ値生成回路４２０＿Ｅ３は、ＱＩＤ＿Ｎ＿Ｅ３＝Ｎｏｎ、ＯＤＲ＿Ｎ＿Ｅ３＝０（リセット）、ＰＲ＿Ｎ＿Ｅ３＝０（リセット）を出力する。こうして、タスク（Ｅ３）と仮想キュー（Ｑ０）との関係が状態レジスタ２５０において解消される。【０１７２】
レジスタ値生成回路４２０＿Ｅ３だけでなく、ＱＩＤ＿Ｓ＿Ｅｎ＝ＱＩＤ＿Ｃ＝Ｑ０となるレジスタ値生成回路４２０＿Ｅｎは、ＱＩＤ＿Ｃ＝ＱＩＤ＿Ｓ＿Ｅｎを検出すると、ＯＤＲ＿Ｓ＿Ｅｎ＞ＯＤＲ＿Ａ１となるか判定する。ここでは、ＯＤＲ＿Ａ１は、抽出タスク（Ｅ３）の抽出前の順序値である。ＯＤＲ＿Ｓ＿Ｅｎ＞ＯＤＲ＿Ａ１であれば、すなわち、抽出タスクの順序値よりも順序値が大きいタスク（Ｅｎ）のレジスタ値生成回路４２０＿Ｅｎは、ＯＤＲ＿Ｎ＿Ｅｎ＝ＯＤＲ＿Ｓ＿Ｅｎ−１を出力する。図２９に示す例では、タスク（Ｅ６）についてのレジスタ値生成回路４２０＿Ｅ６が該当する。レジスタ値生成回路４２０＿Ｅ６は、ＯＤＲ＿Ｎ＿Ｅ６＝ＯＤＲ＿Ｓ＿Ｅ６−１＝４−１＝３を出力する。こうして、仮想キュー（Ｑ０）の要素であるタスク（Ｅ６）の状態データが調整される。【０１７３】
図３４は、図３３に対応した状態レジスタ２５０のデータ構造図である。
同図において下線を付与している部分が、図３０に示した状態レジスタ２５０の設定内容から変化した箇所である。まず、タスク（Ｅ３）の仮想キュー（Ｑ０）からの抽出により、キュー識別レジスタ４１６＿Ｅ３には新たに「Ｎｏｎ」が設定される。また、キュー順序レジスタ４１４とタスク優先順位レジスタ４１２にはそれぞれリセット値として「０」が設定される。タスク（Ｅ３）の抽出により、仮想キュー（Ｑ０）に元々投入されていたタスク（Ｅ０）、タスク（Ｅ２）、タスク（Ｅ５）、タスク（Ｅ６）のうち、抽出タスク（Ｅ３）よりも順序値が大きかったタスク（Ｅ６）のＯＤＲはデクリメントされる。【０１７４】
図３５は、抽出の処理過程を示すフローチャートである。
メイン回路４００は、まず、抽出先となる仮想キューのＱＩＤ＝Ｑｎをタスク選択回路２３０に入力する（Ｓ３０）。タスク選択回路２３０は、仮想キュー（Ｑｎ）から抽出タスクを選択する（Ｓ３２）。メイン回路４００は、抽出タスクのタスクＩＤ＝Ｅｎをキュー制御回路４０４に入力すると、キュー制御回路４０４は、抽出タスク（Ｅｎ）の状態データからＱＩＤ＝Ｑｎをクリアする（Ｓ３４）。このとき、ＰＲやＯＤＲを「０」にリセットするが、必ずしもリセットはしなくてもよい。【０１７５】
仮想キュー（Ｑｎ）に他のタスクも投入されており（Ｓ３６のＹ）、ＯＤＲ＿Ｓ＿Ｅｎ＞ＯＤＲ＿Ａ１となるタスクが存在するときには（Ｓ３８のＹ）、該当タスクの順序値をデクリメントする（Ｓ４０）。なお、Ｓ３０からＳ４０に示した処理はシリアル実行される必要はなく、時間的に並行して実行してもよい。
実装上、仮想キューの途中からでもタスクを取り出すことができる。たとえば、図３３において、仮想キュー（Ｑ０）の真ん中からタスク（Ｅ２）を取り出す必要が発生したとする。タスク（Ｅ２）は、あるフラグＡがオンに設定されていることを条件として動作可能なタスクであるとする。このフラグＡがオフにされたとき、タスク（Ｅ２）を仮想キュー（Ｑ０）の途中から取り出す必要が発生する。あるいは、タスク（Ｅ２）についてあらかじめ設定されていた待ち時間がタイムアウトしたときにも、タスク（Ｅ２）を仮想キュー（Ｑ０）の途中から取り出す必要が発生する。この場合には、タスク（Ｅ２）のＱＩＤをクリアし、タスク（Ｅ２）の順序値「２」よりも順序値が大きいタスクのＯＤＲをデクリメントすることにより、タスク（Ｅ２）を仮想キュー（Ｑ０）の途中からでも取り出すことができる。図３３の場合、タスク（Ｅ６）のＯＤＲが「２」となる。仮想キューがハードウェアによって物理的な制約を受けないかたちで形成されるため、キューの途中からでも投入・抽出処理が可能となる。【０１７６】
以上に示す仮想キュー制御によれば、ＦＩＦＯを基本としつつも、ＬＩＦＯ的な動作を実現する特殊なキューをハードウェア・ロジックにより実現できる。両投入型キューアルゴリズムをソフトウェアで実装するとすれば、通常、連結リストによる実装となる。しかし、ソフトウェアによる処理である限り、メモリへのアクセスやアドレスの管理にともなうオーバーヘッドが発生せざるを得ない。これに対して、改良例１に示す仮想キュー制御は、ハードウェア・ロジックにより実現されるため、格段にシンプルで高速な制御が可能となる。特に、時間的要件が厳しいＲＴＯＳにおいては、両投入型キューアルゴリズムをハードウェア実装する意義は大きい。次に、再実行優先型タスクスケジューリングを上述した仮想キュー制御方法により実現する態様について説明する。【０１７７】
図３６は、再実行優先型タスクスケジューリングにおける仮想キューとタスクの関係を示す第１の概念図である。
ここでは、ＲＥＡＤＹ状態に対応する仮想キュー（Ｑ０）とＷＡＩＴセマフォ状態に対応する仮想キュー（Ｑ１）の２つの仮想キューを想定している。仮想キュー（Ｑ０）は、タスク優先順位ＰＲ＝０のタスクを投入するための優先キュー（以下、「優先キュー（Ｑ０：０）」と表記する）とタスク優先順位ＰＲ＝１のタスクを投入するための優先キュー（Ｑ０：１）の２つの優先キューの集合体である。仮想キュー（Ｑ１）についても同様であり、実質的には４つの優先キューが想定される。【０１７８】
同図においては、ＰＲ＝１のタスク（Ｅ１）がＲＵＮ状態にあり、同じくＰＲ＝１のタスク（Ｅ０）、タスク（Ｅ２）は、優先キュー（Ｑ０：１）にてＲＥＡＤＹ状態として待機している。また、ＰＲ＝０のタスク（Ｅ３）は、優先キュー（Ｑ１：０）にてＷＡＩＴセマフォ状態にて待機している。ここで、タスク（Ｅ１）は、いったん実行されたら集中的・優先的に実行させたいタスクであるとする。【０１７９】
まず、ＲＵＮ状態のタスク（Ｅ１）がリリースセマフォシステムコールを実行して、ＲＥＡＤＹ状態に戻るとする（Ｓ１）。タスク（Ｅ１）はなるべく早い段階で再実行させたいタスクであるため、優先キュー（Ｑ０：１）に「逆投入」される。一方、リリースセマフォシステムコールにより、タスク（Ｅ３）のＷＡＩＴ解除条件が成立したとする。タスク（Ｅ３）は優先キュー（Ｑ１：０）から抽出され、優先キュー（Ｑ０：０）に順投入される（Ｓ２）。次に、タスク選択回路２３０は、新たなＲＵＮ−タスクを選択する。タスク選択回路２３０は、ＲＥＡＤＹ状態にあるタスクのうち、タスク優先順位が最も高いタスク（Ｅ３）を抽出タスクとして選択する。こうして、ＷＡＩＴ状態からＲＥＡＤＹ状態に移行したばかりのタスク（Ｅ３）は、優先キュー（Ｑ０：０）から抽出されて新たなＲＵＮ−タスクとなる。このようなタスクスケジューリングによれば、タスク優先順位が高いタスクは、ＷＡＩＴ解除条件が成立すれば比較的早い段階で実行権を取得できる。【０１８０】
図３７は、再実行優先型タスクスケジューリングにおける仮想キューとタスクの関係を示す第２の概念図である。
タスク（Ｅ３）がウェイトセマフォシステムコールを実行すると、タスク（Ｅ３）は優先キュー（Ｑ１：０）に順投入される（Ｓ４）。次に、タスク選択回路２３０は新たなＲＵＮ−タスクを選択する。タスク選択回路２３０は、ＲＥＡＤＹ状態にあるタスクのうち、タスク優先順位が最も高いタスクを選択するが、ここではタスク（Ｅ０）、タスク（Ｅ２）、タスク（Ｅ１）のタスク優先順位は同じである。この場合、優先キュー（Ｑ０：１）からタスク（Ｅ１）が抽出される（Ｓ５）。タスク（Ｅ１）は、新たなＲＵＮ−タスクとなる。このような処理方法によれば、タスク優先順位ＰＲ＝０を設定するほどではないが、いったん実行されたらなるべく連続的に実行させたいというタスク（Ｅ１）の仕様に対応できる。【０１８１】
再実行優先型タスクスケジューリングでは、実行状況やタスクの種類に応じて、順投入と逆投入を使い分けることにより、タスクの実行順位を制御できる。このため、基本例に示したタスク処理装置１００の高速処理性能という特徴を維持しつつも、より精緻なタスクスケジューリングを実現できる。
｛改良例２｝【０１８２】
次に、改良例２として、タスク処理装置１００における補助処理の高速化について説明する。改良例２のタスク処理装置１００においては、ＨＷＦ（Hardware Function Module）が補助処理を実行する。ここでいうＨＷＦは、いわゆる補助プロセッサであり、補助処理回路として機能する。補助処理は、タスクの一部として実行され、浮動小数点演算、ＤＭＡ転送、暗号化・復号処理、３Ｄ画像の座標計算等、その処理内容はさまざまである。
まず、ソフトウェアＯＳによる一般的な補助処理の制御方法について説明する。そのあと、改良例２のタスク処理装置１００による補助処理の制御方法について説明する。【０１８３】
図３８は、ソフトウェアＯＳにより補助処理を実行する場合の一般的な回路構成を示す図である。
ＣＰＵ８４は、ＣＰＵバス５１２を介して図示しないメモリやＨＷＦ５００と接続される。また、ＣＰＵ８４には、割り込みコントローラ５０２が接続される。割込コントローラ５０２は、ＨＷＦ５００等からさまざまな割り込み信号を受信し、割り込み信号（ＩＮＴＲ）をＣＰＵ８４に送信する。ＣＰＵ８４は、割り込み信号（ＩＮＴＲ）を受信すると、適宜、特殊タスクにより割り込み信号（ＩＮＴＲ）に対応した処理を実行する。
図２に示したように、ＣＰＵ８４によりソフトウェアＯＳが実行され、その上位階層において、一般タスクや特殊タスクが実行される。【０１８４】
補助処理は「直列型補助処理」と「並列型補助処理」の２種類に大別される。直列型補助処理の場合、その実行中に他のタスクを実行することはできない。並列型補助処理の場合には、その実行中においても他のタスクを並列実行できる。【０１８５】
図３９は、一般的な直列型補助処理の制御方法を示すタイムチャートである。
まず、タスクＡは、ＨＷＦ５００を占有するためのシステムコールとして「割込禁止命令」を発行する（Ｓ１００）。ここで対象となるＨＷＦ５００は、ＦＰＵ（浮動小数点演算ユニット）であるとする。「割込禁止命令」が発行されると、後述の「割込解除命令」が発行されるまで、タスクスイッチは抑止される。以下、割込禁止命令により割込禁止が設定されてから、割込解除命令により割込禁止が解除されるまでの期間のことを「割込禁止期間」とよぶ。割込禁止期間中に割り込み信号（ＩＮＴＲ）が入力されても、特殊タスクは起動されない。割込禁止期間中は、タスクＡがＣＰＵ８４の使用権を独占することになる。したがって、タスクＡ以外のタスクがＨＷＦ５００、すなわち、ＦＰＵへアクセスすることもない。
ソフトウェアＯＳが割込禁止を設定した後、タスクＡに処理が戻る（Ｓ１０２）。タスクＡは、ＨＷＦ５００に補助処理の実行を指示する（Ｓ１０４）。補助処理制御にともなうオーバーヘッドを抑制するため、タスクＡはソフトウェアＯＳを介さずに、ＨＷＦ５００の内蔵レジスタにパラメータを直接書き込んで、補助処理の実行を指示する。ＨＷＦ５００は、タスクＡに指示された補助処理を実行する。【０１８６】
タスクＡは、ＨＷＦ５００の内蔵レジスタを定期的にチェックしながら、補助処理の完了を待つ。補助処理の完了を検出すると（Ｓ１０６）、タスクＡは割込解除命令を発行する（Ｓ１０８）。ソフトウェアＯＳは、割込解除命令を受け取ると、割込禁止を解除する（Ｓ１１０）。こうして割込禁止期間は終了する。ソフトウェアＯＳはタスクスイッチを実行し、次に実行すべきタスク、たとえば、タスクＢを選択する（Ｓ１１２）。以後、タスクＢに実行権が割り当てられる。タスクＢも同様の方法によりＨＷＦ５００を利用可能である。【０１８７】
仮に、タスクＡの依頼によりＨＷＦ５００が補助処理を実行している最中に、別のタスク、たとえば、特殊タスクがＨＷＦ５００の内蔵レジスタを書き換えてしまうと、タスクＡは正しい処理結果を受け取れなくなってしまう。このため、ＨＷＦ５００の占有権を厳密に排他制御する必要がある。しかし、各タスクは、ソフトウェアＯＳを介さずともＨＷＦ５００にアクセスできる。たとえば、Ｓ１０４において、タスクＡはソフトウェアＯＳを介さずにＨＷＦ５００に直接アクセスしている。そこで、ソフトウェアＯＳがＨＷＦ５００の占有権を正しく管理できるように、タスクに「割込禁止命令」と「割込解除命令」を発行させている。ソフトウェアＯＳは、割込禁止命令により、補助処理中にタスクスイッチが発生するのを事前に抑止しておく。こうして、タスクＡがＨＷＦ５００を使用している最中に他のタスクがＣＰＵ８４の使用権を獲得し、ＨＷＦ５００に干渉することがないように処置している。図３９の場合、Ｓ１０２のタイミングから、Ｓ１１０のタイミングに至るまでが割込禁止期間となる。【０１８８】
直列型補助処理の場合、割込禁止期間中においては、実質的に他のタスクを実行することができない。いいかえれば、直列型補助処理では、補助処理中に他のタスクがＣＰＵ８４の使用権を取得できない。このため、浮動小数点演算のような比較的短時間で完了できる補助処理が直列型補助処理として好適である。【０１８９】
図４０は、一般的な並列型補助処理の制御方法を示すタイムチャートである。
まず、タスクＡは、ＨＷＦ５００の使用権を待ち条件として、ウェイトセマフォシステムコールやウェイトミューテックスシステムコールなどのＷＡＩＴ系システムコールを発行する（Ｓ１２０）。ここでは、ウェイトミューテックスシステムコールを対象として説明する。このウェイトミューテックスシステムコールは、ＨＷＦ５００の占有を要求するための命令として発行される。また、ここで対象となるＨＷＦ５００は、ＤＭＡＣ（ＤＭＡコントローラ）であるとする。ソフトウェアＯＳは、ウェイトミューテックスシステムコールを受け取ると、ミューテックスにより、タスクＡ以外のタスクのＨＷＦ５００へのアクセス、すなわち、ＤＭＡＣへのアクセスを禁止設定する（Ｓ１２２）。こうして、ＨＷＦ５００は一時的にタスクＡにより占有される。ソフトウェアＯＳは次に実行すべきタスクを選択する。ここでは、タスクＡが再選択されたとして説明を続ける。タスクＡは、ＨＷＦ５００に補助処理の実行を指示する（Ｓ１２４）。ここでも、タスクＡはソフトウェアＯＳを介さずに、ＨＷＦ５００に補助処理の実行を直接指示するとする。ＨＷＦ５００は、指示された補助処理を実行する。【０１９０】
タスクＡは、補助処理の完了を待機条件として、ウェイトイベントシステムコールなどのＷＡＩＴ系システムコールを発行する（Ｓ１２６）。タスクＡは、ＷＡＩＴ状態に遷移する。ソフトウェアＯＳはタスクスイッチを実行し、次のＲＵＮ−タスク、たとえば、タスクＢを選択する（Ｓ１２８）。タスクＢは、補助処理と並行して実行される。ただし、ＨＷＦ５００はタスクＡによって占有されているため、タスクＢはＨＷＦ５００を使用することはできない。【０１９１】
ＨＷＦ５００は、補助処理が完了すると割り込み信号（ＩＮＴＲ）を送信する（Ｓ１３０）。ソフトウェアＯＳは割り込み信号（ＩＮＴＲ）を検出すると、割込ハンドラとしての特殊タスクを起動する（Ｓ１３２）。特殊タスクは、まず、セットイベントシステムコールなどのＳＥＴ系システムコールにより、補助処理の完了をイベント通知する（Ｓ１３４）。こうして、タスクＡが発行したウェイトイベントシステムコールの待機条件が成立する。再び、ソフトウェアＯＳから特殊タスクに実行権が移る（Ｓ１３６）。特殊タスクは残りの処理を実行後、ＳＴＯＰ状態に遷移する（Ｓ１３８）。ソフトウェアＯＳは、再び実行権を取得し、特殊タスクを終了させたあと、タスクスイッチを実行する（Ｓ１４０）。ここでは、タスクＡが再選択されたとする。【０１９２】
既に、タスクＡが依頼した補助処理は完了しているので、タスクＡはＨＷＦ５００の内蔵レジスタから処理結果を読み取る（Ｓ１４２）。あるいは、タスクＡは、ＨＷＦ５００がメモリの所定領域に書き込んだ処理結果を読み出すとしてもよい。タスクＡは、リリースミューテックスシステムコールを発行する（Ｓ１４４）。ソフトウェアＯＳは、リリースミューテックスシステムコールを受け取ると、ＨＷＦ５００のタスクＡによる占有権を解除する（Ｓ１４６）。ソフトウェアＯＳはタスクスイッチを実行し、次に実行すべきタスク、たとえば、タスクＣを選択する（Ｓ１４８）。以後、タスクＣに実行権が割り当てられる。ＨＷＦ５００の占有権は解除されているため、タスクＣも同様の方法によりＨＷＦ５００を利用可能である。【０１９３】
並列型においても、一般タスクがＨＷＦ５００に直接アクセスしている点は直列型と同じである。並列型補助処理では、補助処理中に他のタスクがＨＷＦ５００を使用できないようにしておくが、他のタスクはＣＰＵ８４の使用権を取得すること自体は可能である。こうして、タスクＡがＨＷＦ５００を使用している最中に他のタスクがＨＷＦ５００に干渉しないように処置している。【０１９４】
並列型補助処理の実行中には、Ｓ１２８に示したように他のタスクを並列実行できる。ただし、Ｓ１２６やＳ１３４のシステムコール、特殊タスクの起動等により、直列型補助処理よりもオーバーヘッドが大きい。このため、ＤＭＡ転送のような比較的時間がかかる補助処理が並列型補助処理として好適である。【０１９５】
図３９に示した直列型補助処理の場合、タスクはシステムコールを合計２回発行する必要がある。また、補助処理開始後も、ＨＷＦ５００を定期的にチェックし、補助処理が完了しているか否かを検知しなければならない。実際に補助処理が完了するタイミングと、タスクが補助処理の完了を検知するタイミングには「ずれ」が発生しやすく、結果として、処理効率が低下してしまう。【０１９６】
図４０に示した並列型補助処理の場合、タスクＡはシステムコールを合計４回発行する必要がある。更に、補助処理が終了したとき、タスクＡに補助処理完了を通知するために特殊タスクを起動しなければならない。【０１９７】
一般的には、システムコール１回分につき５００〜１０００回程度のＣＰＵクロックが消費される。補助処理は実行頻度が高い処理であり、時間的要件の厳しいＲＴＯＳにとってこういったオーバーヘッドをいかに抑制できるかは重要な設計ポイントである。【０１９８】
図４１は、基本例のタスク処理装置１００により図３８から図４０までに示した補助処理制御を実現する場合の回路構成を示す図である。
基本例に関連して説明したように、タスク処理装置１００は、主として、ＣＰＵ１５０、退避回路１２０およびタスク制御回路２００を含む。図３８に示した一般的な回路構成の場合、ＣＰＵ８４はソフトウェアＯＳとタスクの両方を実行する。これに対して、タスク処理装置１００においては、ＣＰＵ１５０がタスクを実行し、ＯＳとしての機能は退避回路１２０とタスク制御回路２００により実現されている。ＯＳの機能をＣＰＵ１５０から外在化させることにより、全体としての処理効率が格段に向上することは基本例に関連して説明した通りである。図４１においても、ＣＰＵ１５０はＣＰＵバス５１２を介してＨＷＦ５００と接続されている。【０１９９】
タスク処理装置１００によるハードウェアＯＳの場合、システムコール実行、特に、タスクスイッチがソフトウェアＯＳに比べると格段に高速化される。タスク処理装置１００は、システムコールを１回実行するために、ＣＰＵクロックを１２クロック程度しか必要としない。このため、図４１の回路構成にて、タスク処理装置１００により図３９および図４０に示した補助処理制御を実行したとしても、補助処理にともなうオーバーヘッドを大きく抑制できる。
改良例２においては、タスク処理装置１００とＨＷＦ５００、特に、ＣＰＵ１５０とＨＷＦ５００の関係を見直すことにより、補助処理を更に高速化する。【０２００】
図４２は、改良例２においてタスク処理装置１００とＨＷＦ５００の関係を示す回路構成図である。
同図においては、複数のＨＷＦ５００（ＨＷＦ５００＿０、・・・、ＨＷＦ５００＿ｋ：ｋは任意の自然数）が、ＣＰＵ１５０ではなくタスク制御回路２００と接続される。各ＨＷＦ５００は、それぞれ異なる補助処理に対応して設計された専用回路である。たとえば、ＨＷＦ５００＿０はＦＰＵ、ＨＷＦ５００＿１はＤＭＡＣであってもよい。各ＨＷＦ５００は、０〜ｋの範囲のＨＷＦＩＤにより一意に識別される。【０２０１】
ＣＰＵ１５０で実行されるタスクは、タスク制御回路２００を介して、各ＨＷＦ５００に補助処理を実行させる。タスクは、ＨＷＦ５００の内蔵レジスタに直接アクセスできない。改良例２においては、タスク制御回路２００が各ＨＷＦ５００を一元管理することになる。【０２０２】
図４３は、改良例２における状態記憶部２２０とタスク切換回路２１０の関係を示す回路図である。
改良例２のタスク選択回路２３０には、ＨＷＦ待機選択回路５１０が追加される。また、タスク切換回路２１０には、複数のＨＷＦ５００が新たに接続される。【０２０３】
タスク制御回路２００の基本構成は、図１０に示した基本例の回路構成とほぼ同等である。各タスクに対応づけられる状態レジスタ２５０は、タスクＩＤレジスタ２５４、タスク優先順位レジスタ２５６等に加えて、ＨＷＦＩＤレジスタ５０４、キュー順序レジスタ５０６およびキュー識別レジスタ５０８が追加される。
（Ａ）ＨＷＦＩＤレジスタ５０４：あるタスクが補助処理の実行を指示するとき、その補助処理の実行主体となるＨＷＦ５００のＨＷＦＩＤが設定される。ＨＷＦＩＤは、ＨＩＤ＿Ｓ信号として常時出力される。改良例２においては、ＨＷＦＩＤレジスタ５０４には、並列型補助処理のときだけＨＷＦＩＤが書き込まれる。
（Ｂ）キュー順序レジスタ５０６：仮想キューへのタスクの投入順位を示す「順序値（ＯＤＲ）」を保持する。順序値が大きいほど、仮想キューの深くに投入されていることを示す。順序値は、ＯＤＲ＿Ｓ信号として常時出力される。改良例２の順序値ＯＤＲは、改良例１で説明した「順序値ＯＤＲ」と同一概念である。
（Ｃ）キュー識別レジスタ５０８：仮想キューを識別する「キューＩＤ（ＱＩＤ）」を保持する。ＱＩＤ＿Ｓ信号として常時出力される。キューＩＤは、改良例１で説明した「キューＩＤ（ＱＩＤ）」と同一概念である。【０２０４】
仮想キューは、改良例１で示した仮想キューと同じく、タスク状態に対応づけられる仮想的なキューである。このように、キューＩＤとタスク状態の対応づけはハードウェア実装として固定化される必要はない。タスク選択回路２３０は、各キュー識別レジスタ５０８を参照することにより、各タスクのタスク状態を判別できる。【０２０５】
タスク選択回路２３０は、状態レジスタ２５０から出力される状態データに基づいて、状態遷移させるべきタスクを選択する。タスク切換回路２１０がＨＷＦ待機選択回路５１０にＨＷＦＩＤを入力すると、ＨＷＦ待機選択回路５１０はそのＨＷＦＩＤをＨＷＦＩＤレジスタ５０４に設定されているタスクのタスクＩＤを出力する。いいかえれば、「指定されたＨＷＦ５００による処理の完了を待っているタスク」をタスク切換回路２１０に通知する。指定されたＨＷＦ５００が処理中でなければ、すなわち、どのタスクにも処理を依頼されていなければ、ＨＷＦ待機選択回路５１０は「−１」などの所定値を出力する。【０２０６】
各ＨＷＦ５００は、タスク切換回路２１０と直接接続される。各ＨＷＦ５００は、タスク切換回路２１０と以下に示す６種類の信号線により接続される。以下において、ｉは０〜ｋの任意の数であるとする。
ａ．HFi_REQ：タスク切換回路２１０は、ＨＷＦ５００＿ｉに補助処理の実行を指示するとき、HFi_REQをアサートする。
ｂ．HFi_ARG[m-1:0]：補助処理のパラメータを伝送する。補助処理の内容によってHFi_ARG[m-1:0]のサイズはさまざまであり、パラメータの個数もさまざまである。HFi_REQがアサートされるときに、HFi_ARG[m-1:0]がＨＷＦ５００＿ｉの内蔵レジスタに書き込まれる。
c．HFi_RQACK：HFi_REQがアサートされ、HFi_ARG[m-1:0]が書き込まれると、ＨＷＦ５００＿ｉは補助処理を開始する。補助処理の開始に際し、ＨＷＦ５００＿ｉはHFi_RQACKをアサートする。HFi_RQACKにより、タスク切換回路２１０は補助処理が開始されたことを認識する。
d．HFi_CMPLT：補助処理が完了すると、ＨＷＦ５００＿ｉは補助処理の結果を内蔵レジスタに書き込んだ上で、HFi_CMPLTをアサートする。HFi_CMPLTにより、タスク切換回路２１０は補助処理の完了を認識する。
e．HFi_RSLT[m-1:0]：補助処理の結果を示す戻り値である。補助処理の内容によってHFi_RSLT[m-1:0]のサイズはさまざまであり、戻り値の個数もさまざまである。ＨＷＦ５００＿ｉの内蔵レジスタに書き込まれている戻り値を伝送する。タスク切換回路２１０は、HFi_CMPLTがアサートされると、HFi_RSLT[m-1:0]の戻り値を取得する。
f．HFi_CMPACK：タスク切換回路２１０は、戻り値を取得するとHFi_CMPACKをアサートする。HFi_CMPACKにより、ＨＷＦ５００＿ｉは戻り値が正常に取得されたことを認識する。【０２０７】
図４４は、改良例２における直列型補助処理の制御方法を示すタイムチャートである。
改良例２のタスク処理装置１００には、基本例で説明した９つのシステムコールに加えて、「ＨＷＦコール」が追加される。「ＨＷＦコール」は、タスクが補助処理を実行指示するためのシステムコールである。【０２０８】
まず、タスクＡは、対象となる補助処理の種類をパラメータとしてＨＷＦコールを発行する（Ｓ１００）。たとえば、浮動小数点演算命令やＤＭＡ転送命令、暗号化処理命令などにより補助処理の種類が指定される。タスク切換回路２１０は、パラメータとして指定された補助処理に応じて、対象となるＨＷＦ５００を選択し、該当ＨＷＦＩＤを特定する。なお、ＨＷＦＩＤ自体をパラメータとしてＨＷＦコールが発行されてもよい。ここでは、ＨＷＦＩＤ＝ｉが特定されたとして説明する。ＨＷＦコールのパラメータとして、補助処理の引数を指定してもよい。このようなパラメータは、ＣＰＵ１５０における所定の汎用レジスタ１５８に書き込まれる。タスク切換回路２１０は、ＨＷＦコールを受け付けたとき、汎用レジスタ１５８からこれらのパラメータを読み出す。【０２０９】
タスク切換回路２１０は、ＨＷＦ５００＿ｉに補助処理の実行を指示する（Ｓ１０２）。タスク切換回路２１０は、ＨＣ信号によりＣＰＵ１５０を停止させる。このため、タスクＡはＲＵＮ状態のまま停止させられる。【０２１０】
Ｓ１０２においては、図３９のようにタスクＡがＨＷＦ５００にアクセスするのではなく、タスク切換回路２１０がＨＷＦ５００に補助処理の実行を指示する。具体的には、HFi_ARG[m-1:0]に引数を設定した上でHFi_REQをアサートする。ＨＷＦ５００＿ｉは、補助処理を開始し、HFi_RQACKをアサートする。ＣＰＵ１５０は既に停止されているので、補助処理中はタスクＡは実行されない。もちろん、特殊タスクを含めた他のタスクも実行されない。【０２１１】
補助処理が完了すると、ＨＷＦ５００＿ｉはHFi_RSLT[m-1:0]に戻り値を出力して、HFi_CMPLTをアサートする。タスク切換回路２１０は、戻り値を受け取って、HFi_CMPACKをアサートする（Ｓ１０４）。タスク切換回路２１０は、処理レジスタ９２に戻り値を記録する。タスク切換回路２１０は、停止要求信号（ＨＲ）をネゲートして、タスクＡの実行を再開させる（Ｓ１０６）。【０２１２】
改良例２の直列型補助処理の場合、システムコールは１回しか必要ない。また、補助処理の実行中にＣＰＵ１５０を停止させるため、消費電力も抑制される。更に、補助処理を依頼したタスクＡは、ＨＷＦ５００に補助処理の完了タイミングを問い合わせる必要がないため、補助処理が完了するタイミングとタスク処理装置１００が補助処理の完了を検知するタイミングのずれがほとんど発生しない。【０２１３】
改良例２においては、タスクはＨＷＦ５００に直接アクセスすることはできず、あくまでも、タスク切換回路２１０がＨＷＦ５００へアクセスする。このため、割込禁止命令や割込解除命令により、タスクがＯＳに割込禁止期間を制御させるための処理は不要である。タスク処理装置１００は、ＨＦＷコールを受けた後、停止要求信号（ＨＲ）によりＣＰＵクロックの停止・再開を制御するだけである。タスク処理装置１００は、処理レジスタ９２に補助処理の結果を戻り値として書き込むので、補助処理を依頼していたタスクＡは、実行再開時にはすでに補助処理の結果を取得した状態となっている。タスクＡはＨＷＦ５００やタスク制御回路２００に補助処理の結果を問い合わせる必要がないため、処理効率が向上するだけでなく、タスクＡのプログラムコードも簡素化できる。【０２１４】
図４５は、改良例２における並列型補助処理の制御方法を示すタイムチャートである。
ここでも、対象となるＨＷＦ５００は、ＦＰＵ（浮動小数点演算ユニット）であるとする。また、ＦＰＵに該当するＨＷＦ５００のＨＷＦＩＤは「ｉ」であるとする。まず、タスクＡは、ＦＰＵの使用権を待ち条件として、ウェイトミューテックスシステムコールを発行する（Ｓ１２０）。ミューテックスやセマフォにより各ＨＷＦの占有権が管理される。ミューテックス等によるＨＷＦの排他制御は必須ではない。たとえば、特定のタスクにしか使用されないＨＷＦであれば、排他制御は不要である。
ＨＷＦ５００＿ｉがミューテックスにより占有中として設定されていなければ、タスク処理装置１００は、ミューテックスにより、タスクＡ以外のタスクがＨＷＦ５００＿ｉへアクセスするのを禁止設定する（Ｓ１２２）。【０２１５】
こうして、ＨＷＦ５００＿ｉは一時的にタスクＡに占有される。次に、タスクＡはＨＷＦコールを発行する（Ｓ１２４）。タスクＡはＲＵＮからＷＡＩＴに状態遷移する。ＷＡＩＴ解除の条件は、ＨＷＦ５００＿ｉの補助処理が完了することである。タスク切換回路２１０は、ＨＷＦコールを受けると、タスクＡのＨＷＦＩＤレジスタ５０４に、ＨＷＦＩＤ＝ｉを設定する。【０２１６】
改良例２では、図４０のようにタスクＡに実行権を戻すことなく、タスク切換回路２１０自体がＨＷＦ５００に補助処理の開始を指示する（Ｓ１２６）。ＨＷＦ５００＿ｉは、補助処理を開始する。タスク切換回路２１０は、次のＲＵＮ−タスク、たとえば、タスクＢを選択する（Ｓ１２８）。タスクＢは補助処理と並列実行される。ただし、タスクＢはＨＷＦ５００＿ｉを使用することはできない。タスクＡがミューテックスによりＨＷＦ５００＿ｉの占有権を確保しているためである。【０２１７】
補助処理が完了すると、ＨＷＦ５００＿ｉはHFi_RSLT[m-1:0]に戻り値を出力して、HFi_CMPLTをアサートする。タスク切換回路２１０は、戻り値を受け取って、HFi_CMPACKをアサートする（Ｓ１３０）。タスクＢは、ＲＵＮからＲＥＡＤＹに状態遷移する。具体的には、タスク処理装置１００は、停止要求信号（ＨＲ）をアサートしてＣＰＵクロックの停止を要求し、停止完了信号（ＨＣ）がアサートされるのを待って、タスクＢの処理データを退避レジスタに退避させる。タスクＢは、ＲＥＡＤＹ状態に対応づけられる仮想キューに逆投入される。タスク切換回路２１０は、ＨＷＦＩＤ＝ｉをＨＷＦ待機選択回路５１０に入力し、ＨＷＦ５００＿ｉに補助処理を依頼していたタスクＡのタスクＩＤを取得する。そして、タスクＡに対応する退避レジスタに補助処理の結果を示す戻り値を記録し、タスクＡをＲＥＡＤＹ状態に設定する。ここでも、改良例１に示したようにＲＥＡＤＹに対応する仮想キューにタスクＡを逆投入してもよい。タスク切換回路２１０は、次に実行すべきタスク、たとえば、タスクＡを選択する（Ｓ１３２）。以後、タスクＡに実行権が割り当てられる。補助処理が完了したときには、その補助処理を依頼していたタスクＡを必ず選択するとしてもよい。このようなタスクスイッチ・ルールによれば、補助処理を依頼したタスクのスループットを向上させることができる。タスクＡは、リリースミューテックスシステムコールにより、ＨＷＦ５００＿ｉの占有権を解除する（Ｓ１３４）。タスク処理装置１００は、再びタスクスイッチを実行し、次に実行すべきタスク、たとえば、Ｓ１２８〜Ｓ１３０まで実行されていたタスクＢを選択する（Ｓ１３６）。以後、タスクＢに実行権が割り当てられる。ＨＷＦ５００の占有権は解除されているため、タスクＢも同様の方法によりＨＷＦ５００＿ｉを利用可能である。【０２１８】
図４０に関連して示した並列型補助処理においては、計４回のシステムコールが発行されていた。これに対して、改良例２における並列型補助処理のシステムコール回数は「ウェイトミューテックスシステムコール」、「リリースミューテックスシステムコール」、「ＨＷＦコール」の３回である。このため、改良例２によれば、システムコールにともなうオーバーヘッドを１回分抑制できる。また、特殊タスクを実行する必要もない。退避レジスタに戻り値を書き込むことにより、タスクＡはＨＷＦ５００やタスク制御回路２００に補助処理の結果を問い合わせる必要がない。【０２１９】
従来、ＯＳをはじめとするソフトウェアを高速実行するためにさまざまな方法が試みられてきた。こういった試みは、ＣＰＵクロック数の増加、メモリ容量やレジスタ容量の増加、あるいは、複数のＣＰＵによる並列処理、更には、ネットワーク分散処理といった大規模化・複雑化を指向することが多い。
これに対して、本実施例に示したタスク処理装置１００の場合、既存のＣＰＵ１５０に退避回路１２０やタスク制御回路２００を追加することにより、処理効率を飛躍的に向上させている。ソフトウェアＯＳの場合、本来実行したいタスクスイッチ等の処理を実現するために、ＴＣＢやタスクレディリストの管理といった付随的処理を実行せざるを得ない。これに対して、タスク処理装置１００は、タスクスイッチやタスクの状態管理、割り込み処理をハードウェア・ロジックにより実現しているため、このようなソフトウェア特有のオーバーヘッドから解放されている。このため、消費電力やコストの増加を抑制しつつ高速化を実現するという理想的なシステムとなっている。【０２２０】
更に、改良例２に示した補助処理制御によれば、補助処理にともなうオーバーヘッドを大きく抑制できる。従来、ＤＭＡ転送などの補助処理を高速実行するため、ソフトウェアＯＳを介さずに、直接ＨＷＦ５００の内蔵レジスタを操作するプログラムが提供されることも多かった。しかし、このようなプログラムに不具合が発生すると、システム全体の挙動が不安定となってしまう。【０２２１】
改良例２のタスク処理装置１００においては、タスクがＨＷＦ５００を直接操作することは物理的にできない構成となっている。タスク処理装置１００自体の高速処理性能やシステムコール回数の減少等により、タスクがタスク処理装置１００に補助処理を依頼する構成であっても、高速な補助処理を実現できる。改良例２のタスク処理装置１００によれば補助処理制御における安全性と高速化を両立させることができる。【０２２２】
以上、本発明について実施例をもとに説明した。実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。【０２２３】
請求項に記載の各構成要件が果たすべき機能は、本実施例において示された各機能ブロックの単体もしくはそれらの連係によって実現されることも当業者には理解されるところである。【０２２４】
なお、図１２、図１４、図２８、図３２に関連して、さまざまな判定回路について説明した。これらの判定回路は、比較回路群により比較・選択の対象となるタスクを選ぶ。
たとえば、図１２の実行選択回路２３２は、ＲＵＮ−タスクを選択するための回路であるが、ＲＵＮ−タスクとなることができるのはＲＥＡＤＹ−タスクである。そこで、図１２の判定回路２９６は、ＲＥＡＤＹ−タスクであることを条件として、ＣＩＤ信号「１」を出力する。実行選択回路２３２の比較回路群は、ＣＩＤ信号「１」となるタスク、すなわち、ＲＥＡＤＹ状態のタスクだけを対象として、タスク優先順位ＰＲやＲＥＡＤＹ経過時間ＴＩＭに基づいて、次のＲＵＮ−タスクを選択する。【０２２５】
図１４のセマフォ選択回路２３４は、セマフォ解放時において、セマフォ待ちを解除されるべきタスクを選択するための回路である。セマフォ待ちを解除されるタスクは、解放セマフォを待機セマフォとしてＷＡＩＴ状態にあるタスクである。そこで、図１４の判定回路３０６は、解放セマフォを待機セマフォとするＷＡＩＴ−タスクであることを条件として、ＣＩＤ信号「１」を出力する。セマフォ選択回路２３４の比較回路群は、ＣＩＤ信号「１」となるタスク、すなわち、「解放セマフォを待機セマフォとするＷＡＩＴ−タスク」だけを対象として、タスク優先順位ＰＲやＷＡＩＴ経過時間ＴＩＭに基づいて、セマフォ待ちを解除されるべきタスクを選択する。【０２２６】
判定回路のロジックを変更すれば、実行選択回路２３２とセマフォ選択回路２３４は比較回路群を共有可能である。ミューテックスやイベントについても同様である。図２８の最大値選択回路４０６や、図３２のタスク選択回路２３０についても同様である。このように、判定回路のロジックを追加・変更すれば、比較回路群を共有したかたちで、さまざまな選択論理を実装できる。以下、２例を挙げる。【０２２７】
１．ローテートシステムコール
このシステムコールは、ＲＥＡＤＹ状態に対応づけられる仮想キューのタスク群、すなわち、ＲＥＡＤＹ−タスクの順序値（ＯＤＲ）を変更するためのシステムコールである。たとえば、図２９に示したように、ＲＥＡＤＹ状態に対応づけられる仮想キュー（Ｑ０）に、タスク（Ｅ６）、タスク（Ｅ３）、タスク（Ｅ２）、タスク（Ｅ０）、タスク（Ｅ５）の順に５つのタスクが投入されているとする。ここで、ＲＵＮ−タスクが、タスク優先順位ＰＲ＝１を指定してローテートシステムコールを発行したとする。
すると、ＰＲ＝１に対応づけられる優先キュー（Ｑ０：１）の先頭にあるタスク（Ｅ６）がいったん取り出され、タスク（Ｅ５）の後ろに順投入される。すなわち、タスク（Ｅ６）の順序値（ＯＤＲ）は「０」となり、他のタスクの順序値もそれにあわせて調整される。
ローテートシステムコールは、パラメータにより指定されたタスク優先順位ＰＲ＝１に対応づけられる優先キュー（Ｑ０：１）について、先頭のタスクの順序を最後尾に変更するためのシステムコールである。ローテートシステムコールによれば、仮想キュー（Ｑ０）に投入されているタスクの順序値（ＯＤＲ）を外部からコントロールできる。【０２２８】
ローテートシステムコールを実現するための判定回路は、「ＲＥＡＤＹ状態であって、かつ、指定されたタスク優先順位ＰＲのタスク」であることを条件として「１」を出力すればよい。あとは、比較回路群により、判定回路の出力信号が「１」となる該当タスクの中から、順序値（ＯＤＲ）が最も大きいタスクをローテーションの対象として選択すればよい。【０２２９】
２．ＷＡＩＴ状態に対応づけられる仮想キューについての機能拡張
通常、あるセマフォが解放されたとき、セマフォ待ちに対応づけられる仮想キュー（Ｑｎ）において、タスク優先順位ＰＲが最も高い優先キュー（Ｑｎ：Ｐｎ）の中から、このセマフォを獲得すべきタスクが選択される。しかし、タスク優先順位ＰＲに関わらず、もっとも順序値（ＯＤＲ）が大きなタスクにより獲得されるべき特殊なセマフォ（以下、「特殊セマフォ」とよぶ）を設定してもよい。【０２３０】
特殊セマフォを実装するために、「ＷＡＩＴ状態であって、かつ、解放セマフォを待機セマフォとするタスク」であるときに、「１」を出力する判定回路を用意すればよい。図３２の判定回路４３４は、ＱＩＤ＿Ｓ、ＣＮＤが入力され、ＥＩＤ＿ＥＮ信号を出力する回路である。これを変更し、ＱＩＤ＿Ｓ、ＣＮＤに加えてタスク優先順位ＰＲ＿Ｓが入力され、ＥＩＤ＿ＥＮとＰＲ＿Ａを出力する判定回路を想定する。この判定回路は、特殊セマフォの解放時においてはＰＲ＿Ａに所定値ｘを出力し、通常のセマフォの解放時においてはＰＲ＿ＡとしてＰＲ＿Ｓをそのまま出力する。このため、比較回路群は、特殊セマフォ解放時においては、各タスクのタスク優先順位ＰＲは、すべて所定値ｘであると認識することになる。結果として、比較回路群は、各タスクのタスク優先順位ＰＲに関わらず、判定回路の出力信号が「１」となる該当タスクの中から、順序値（ＯＤＲ）が最も小さなタスクを選択することになる。【０２３１】
以上の実施の形態および変形例から把握される発明のいろいろな態様をすでに特許請求の範囲に記載したものも含む形にて以下に例示する。改良例１に関連し、以下の発明が認識される。【０２３２】
Ｃ１．キューＩＤにより識別される複数種類の仮想キューに対して、要素ＩＤにより識別される複数個の要素の投入と抽出を制御するキュー制御回路と、
各要素に対応して設けられるレジスタであって、投入先となる仮想キューのキューＩＤと投入順位を示す順序値とを対応づけて保持する複数のキューレジスタと、を備え、
前記キュー制御回路は、
要素ＩＤおよびキューＩＤを指定する順投入コマンドが入力されるとき、前記指定された要素ＩＤの該当キューレジスタに対して、前記指定されたキューＩＤに対応する仮想キューの末尾への投入であることを示す末尾順序値と前記指定されたキューＩＤを設定し、
要素ＩＤおよびキューＩＤを指定する逆投入コマンドが入力されるとき、前記指定された要素ＩＤの該当キューレジスタに対して、前記指定されたキューＩＤに対応する仮想キューの先頭への投入であることを示す先頭順序値と前記指定されたキューＩＤを設定し、
キューＩＤを指定する抽出コマンドが入力されるとき、前記指定されたキューＩＤおよび先頭順序値を保持するキューレジスタからキューＩＤをクリアして該当要素を抽出対象とすることにより、各キューレジスタの設定情報に基づいて前記複数種類の仮想キューを管理することを特徴とする仮想キュー処理回路。【０２３３】
Ｃ２．前記キュー制御回路は、前記順投入コマンドまたは前記逆投入コマンドのいずれかが入力されるときには、コマンドにより指定されたキューＩＤを保持する他のキューレジスタの順序値を調整することを特徴とするＣ１に記載の仮想キュー処理回路。【０２３４】
Ｃ３．キューＩＤが指定されるとき、前記複数のキューレジスタからパラレルに出力されるキューＩＤと順序値を参照して、前記指定されたキューＩＤおよび先頭順序値に対応する要素ＩＤを出力する抽出候補回路、を更に備え、
前記キュー制御回路は、前記抽出候補回路から出力された要素ＩＤの該当キューレジスタからキューＩＤをクリアすることを特徴とするＣ３に記載の仮想キュー処理回路。【０２３５】
Ｃ４．仮想キューは、更に、抽出の優先度に応じて複数の優先キューの集合として定義され、
前記キューレジスタは、優先キューを特定するための優先度も保持し、
前記キュー制御回路は、
要素ＩＤおよびキューＩＤに加えて優先度を指定する順投入コマンドが入力されるとき、前記指定された要素ＩＤの該当キューレジスタに対して、前記指定された優先度も設定し、
要素ＩＤおよびキューＩＤに加えて優先度を指定する逆投入コマンドが入力されるとき、前記指定された要素ＩＤの該当キューレジスタに対して、前記指定された優先度も設定し、
キューＩＤを指定する抽出コマンドが入力されるとき、前記指定されたキューＩＤを保持し、そのうち最も高い優先度が設定され、かつ、そのうち最も先頭に近い順序値を設定されているキューレジスタからキューＩＤをクリアすることを特徴とするＣ１に記載の仮想キュー処理回路。【０２３６】
Ｃ５．前記キュー制御回路は、キューＩＤを指定する前記抽出コマンドが入力されるときには、前記指定されたキューＩＤを保持する他のキューレジスタの順序値を調整することを特徴とするＣ４に記載の仮想キュー処理回路。【０２３７】
Ｃ６．キューＩＤが指定されるとき、前記複数のキューレジスタからパラレルに出力されるキューＩＤ、順序値および優先度に基づいて、前記指定されたキューＩＤを保持し、そのうち最も高い優先度が設定され、かつ、そのうち最も先頭に近い順序値を保持するキューレジスタに対応する要素ＩＤを出力する抽出候補回路、を更に備え、
前記キュー制御回路は、前記抽出候補回路から出力された要素ＩＤの該当キューレジスタからキューＩＤをクリアすることを特徴とするＣ５に記載の仮想キュー処理回路。【０２３８】
Ｃ７．タスク実行のためのデータを一時的に保持する処理レジスタと、
命令（instruction）およびオペランドをメモリから前記処理レジスタにロードし、前記処理レジスタの命令とオペランドにしたがってタスクを実行する実行制御回路と、
タスクスケジューリングのための状態データを保持するレジスタであって、複数のタスクに対してそれぞれ対応づけられる複数の状態レジスタと、
タスクの実行状態に対応づけられる複数種類の仮想キューに対して、タスクＩＤにより識別される複数個のタスクの投入と抽出を制御することにより、タスクの実行状態を管理するタスク切換回路と、
複数の前記状態レジスタからパラレルに出力される状態データを入力として、所定の選択条件によりタスクを選択するタスク選択回路と、を備え、
前記状態レジスタは、状態データの一部として、該当タスクの実行状態に対応づけられる仮想キューのキューＩＤと仮想キューへの投入順位を示す順序値とを対応づけて保持し、
前記実行制御回路は、実行中の第１のタスクが所定のシステムコール命令を実行するとき、所定のシステムコール信号を前記タスク切換回路に送信し、
前記タスク選択回路は、ＲＥＡＤＹ（レディ）状態に対応する仮想キューであるレディキューのキューＩＤおよび前記レディキューの先頭位置を示す先頭順序値を保持する状態レジスタを特定し、前記特定した状態レジスタに対応する第２のタスクを次の実行対象として選択し、
前記タスク切換回路は、前記システムコール信号を受信するとき、前記第２のタスクの状態レジスタからキューＩＤをクリアし、前記第１のタスクの状態レジスタに対して、ＲＵＮ（ラン）状態とは異なる別の実行状態に対応づけられる仮想キューのキューＩＤと順序値を設定し、前記処理レジスタのデータを所定の記憶領域に退避させると共に、前記第２のタスクについて前記記憶領域に退避されていたデータを前記処理レジスタにロードすることを特徴とするタスク制御装置。【０２３９】
Ｃ８．前記タスク切換回路は、前記第１のタスクを前記別の実行状態としてＲＥＡＤＹ状態に移行させるときには、前記第１のタスクの状態レジスタに対して前記レディキューのキューＩＤと先頭順序値を設定することを特徴とするＣ７に記載のタスク制御装置。【０２４０】
Ｃ９．前記タスク選択回路は、ＷＡＩＴ（ウェイト）解除条件の成立待機状態であるＷＡＩＴ状態に対応づけられる仮想キューとしてウェイトキューが設定される場合において、前記ＷＡＩＴ解除条件が成立するとき、前記ウェイトキューのキューＩＤと先頭順序値を保持する状態レジスタに該当するタスクを選択し、
前記タスク切換回路は、前記選択されたタスクの状態レジスタに対して、レディキューのキューＩＤと前記レディキューの末尾への投入を示す末尾順序値を設定することを特徴とするＣ７に記載のタスク制御装置。【０２４１】
Ｃ１０．前記状態レジスタは、状態データの一部としてタスク優先度を保持し、
前記タスク選択回路は、タスク切り換えに際してレディキューのキューＩＤを設定されているタスクが複数あるときには、それらのうち最も高いタスク優先度を設定され、かつ、それらのうち最も先頭に近い順序値を設定されているタスクを実行対象として選択することを特徴とするＣ７に記載のタスク処理装置。
【産業上の利用可能性】
【０２４２】
本発明によれば、マルチタスク処理において、より効率的なタスクの実行制御が実現される。
【図１】
2009090684.tif 000003
【図２】
2009090684.tif 000004
【図３】
2009090684.tif 000005
【図４】
2009090684.tif 000006
【図５】
2009090684.tif 000007
【図６】
2009090684.tif 000008
【図７】
2009090684.tif 000009
【図８（ａ）】
2009090684.tif 000010
【図８（ｂ）】
2009090684.tif 000011
【図９】
2009090684.tif 000012
【図１０】
2009090684.tif 000013
【図１１】
2009090684.tif 000014
【図１２】
2009090684.tif 000015
【図１３】
2009090684.tif 000016
【図１４】
2009090684.tif 000017
【図１５】
2009090684.tif 000018
【図１６】
2009090684.tif 000019
【図１７】
2009090684.tif 000020
【図１８】
2009090684.tif 000021
【図１９】
2009090684.tif 000022
【図２０】
2009090684.tif 000023
【図２１】
2009090684.tif 000024
【図２２】
2009090684.tif 000025
【図２３】
2009090684.tif 000026
【図２４】
2009090684.tif 000027
【図２５】
2009090684.tif 000028
【図２６】
2009090684.tif 000029
【図２７】
2009090684.tif 000030
【図２８】
2009090684.tif 000031
【図２９】
2009090684.tif 000032
【図３０】
2009090684.tif 000033
【図３１】
2009090684.tif 000034
【図３２】
2009090684.tif 000035
【図３３】
2009090684.tif 000036
【図３４】
2009090684.tif 000037
【図３５】
2009090684.tif 000038
【図３６】
2009090684.tif 000039
【図３７】
2009090684.tif 000040
【図３８】
2009090684.tif 000041
【図３９】
2009090684.tif 000042
【図４０】
2009090684.tif 000043
【図４１】
2009090684.tif 000044
【図４２】
2009090684.tif 000045
【図４３】
2009090684.tif 000046
【図４４】
2009090684.tif 000047
【図４５】
2009090684.tif 000048
【国際調査報告】
2009090684.tif 000049
2009090684.tif 000050
2009090684.tif 000051