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