(57)【要約】      （修正有）【課題】マルチタスク処理において、効率的なタスクの実行制御を実現する。【解決手段】タスク処理装置は、ＣＰＵ、退避回路、タスク制御回路を含む。タスク制御回路２１０は、タスク選択回路とタスクごとに対応づけられた状態記憶部を備える。ＣＰＵは、所定のシステムコール命令を実行するとき、その旨をタスク制御回路に通知する。タスク制御回路は、システムコール命令の実行を通知されると、タスク選択回路からの出力に応じて次に実行すべきタスクを選択する。割込回路４００が高速割込要求信号を受信すると、タスク切換回路２１０は割込回路４００により指定される割込操作命令を実行することにより、タスクの状態遷移を制御する。【選択図】図２０
2010049700.tif 000002
【特許請求の範囲】
【請求項１】
タスク実行のためのデータを一時的に保持する処理レジスタと、
命令（instruction）およびオペランドをメモリから前記処理レジスタにロードし、前記処理レジスタの命令とオペランドにしたがってタスクを実行する実行制御回路と、
タスクの実行状態を示す状態データを保持する状態レジスタと、
タスクの実行状態を制御するタスク切換回路と、
前記状態データに基づいて、所定の選択条件によりタスクを選択するタスク選択回路と、
外部からの割込要求信号を処理する割込回路と、を備え、
前記実行制御回路は、実行対象となる命令が所定のシステムコール命令であるか否かを判定する命令復号器を有し、実行中の第１のタスクが所定のシステムコール命令を実行するときには所定のシステムコール信号を前記タスク切換回路に送信し、
前記タスク選択回路は、実行可能に待機している状態を示すＲＥＡＤＹ（レディ）状態のタスクの中から次の実行対象となるタスクを選択し、
前記タスク切換回路は、前記システムコール信号を受信したときの前記タスク選択回路からの出力により次の実行対象となる第２のタスクを選択し、前記処理レジスタのデータを所定の記憶領域に退避させるとともに、前記第１のタスクについての状態データをタスク実行中を示すＲＵＮ（ラン）状態から別の状態に設定変更し、前記第２のタスクについて前記記憶領域に退避されていたデータを前記処理レジスタにロードするとともに前記第２のタスクについての状態データをＲＥＡＤＹ状態からＲＵＮ状態に変更した後、前記実行制御回路にタスクの実行を許可し、
前記実行制御回路は、前記システムコール信号を送信した後、前記タスク切換回路からタスクの実行を許可されたことを条件として、前記第２のタスクを実行し、
前記割込回路は、前記割込要求信号を受信したとき、前記割込要求信号にあらかじめ対応づけられている割込操作命令を前記タスク切換回路に送信し、
前記タスク切換回路は、前記割込操作命令にしたがってタスクの状態データを変更することを特徴とするタスク処理装置。
【請求項２】
前記割込回路は、
外部から割込要求信号を受信して一時的に保持し、保持されている１以上の割込要求信号の中からいずれかの割込要求信号を処理対象として選択する信号選択回路と、
前記選択された割込要求信号に対応する割込操作命令を前記タスク切換回路に送信する操作回路と、を含み、
前記タスク切換回路は、前記割込操作命令の実行を完了したとき、前記割込回路に対して操作完了信号を送信し、
前記信号選択回路は、前記操作完了信号が受信されたことを条件として、次の処理対象となる割込要求信号を前記操作回路に送信することを特徴とする請求項１に記載のタスク処理装置。
【請求項３】
前記タスク切換回路は、前記割込操作命令の実行を完了したとき、前記割込回路のうちの前記操作回路に前記操作完了信号を送信し、
前記操作回路は、前記操作完了信号を受信したとき、前記信号選択回路に選択可能信号を送信し、
前記信号選択回路は、前記選択可能信号を受信したこと条件として、次の処理対象となる割込要求信号を前記操作回路に送信することを特徴とする請求項２に記載のタスク処理装置。
【請求項４】
前記割込回路は、
割込要求信号と割込操作命令とを対応づけた割込テーブルを保持するメモリ、を更に含み、
前記操作回路は、前記割込テーブルを参照して、前記選択された割込要求信号に対応する割込操作命令を特定し、前記特定した割込操作命令を前記タスク切換回路に送信することを特徴とする請求項２に記載のタスク処理装置。
【請求項５】
前記メモリは、一の割込要求信号に対して複数の割込操作命令を対応づけ可能なテーブルとして前記割込テーブルを保持し、
前記タスク切換回路は、前記割込回路から受信した割込操作命令において、後続の割込操作命令の存在が指定されているときには、前記操作回路に後続要求信号を送信し、
前記操作回路は、前記後続要求信号を受信したとき、前記割込テーブルを参照して、前記割込操作命令と同じ割込要求信号に対応づけられている後続の割込操作命令を前記タスク切換回路に送信し、
前記タスク切換回路は、前記割込回路から受信した割込操作命令において、後続の割込操作命令の不存在が指定されているときには、前記割込操作命令の実行を完了したときに前記操作完了信号を前記割込回路に送信することを特徴とする請求項４に記載のタスク処理装置。
【請求項６】
前記割込回路は、複数種類の割込要求信号のうちの一部である高速割込要求信号についての割込操作命令を前記タスク切換回路に送信し、
前記タスク切換回路は、前記高速割込要求信号以外の通常割込要求信号を受信したときには、所定の割込タスクを実行するためのデータを前記処理レジスタにロードさせた上で、前記割込タスクにより前記通常割込要求信号に対応した処理を実行させることを特徴とする請求項１に記載のタスク処理装置。
【請求項７】
前記処理レジスタのデータを退避させるためのレジスタであって、複数のタスクに対してそれぞれ対応づけられる複数の退避レジスタ、を更に備え、
前記タスク切換回路は、前記システムコール信号を受信したとき、前記第１のタスクに対応づけられている退避レジスタに前記処理レジスタのデータを退避させ、前記第２のタスクに対応づけられている退避レジスタのデータを前記処理レジスタにロードすることを特徴とする請求項１に記載のタスク処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、ＯＳ（Operating System）の機能に関し、特に、割り込み処理に関する。
【背景技術】
【０００２】
パーソナルコンピュータのような汎用機器用のＯＳに限らず、携帯電話のような専用機器用のＯＳにも高度な機能が求められつつある。特に、１つのＣＰＵ（Central Processing Unit）で複数のタスクを実行可能なＯＳ（以下、このようなタイプのＯＳのことを「マルチタスクＯＳ」ともよぶ）が多くの電子機器に搭載されるようになってきている。
【０００３】
マルチタスクＯＳは、ＣＰＵの処理時間を単位時間（タイムスライス）に分割し、複数のタスクにタイムスライスを順番に割り当てる。各タスクは、ＯＳからタイムスライスを与えられたときだけＣＰＵを使用できる。各タイムスライスにおいては一つのタスクが実行される。タイムスライスはユーザからみて非常に短い時間なので、複数のタスクはあたかも同時実行されているかのようにみえる。このような処理方法によれば、タスクＡが入力待機状態に至りＣＰＵの処理能力を当面必要としなくなったとき、別のタスクＢに実行権を与えることでＣＰＵの処理能力を有効活用できる。ここでいう実行権とは、ＣＰＵの使用権と同義である。
【０００４】
マルチタスクＯＳがタスクの実行権の切り換えることを「タスクスイッチ」とよぶ。タスクスイッチは、タイムスライスが経過したときや、タスクが所定命令を実行したときに発生する。マルチタスクＯＳは、タスクスイッチの実行タイミングに至ると、実行中のタスクのコンテキスト情報をＴＣＢ（Task Control Block）に退避させる。コンテキスト情報とは、タスク実行時においてＣＰＵのレジスタに格納されていたデータやタスクの実行状態に関するデータである。ＴＣＢとは、タスク固有の情報を保持するためにメモリに確保される領域である。マルチタスクＯＳは、実行中のタスクのコンテキスト情報をＴＣＢに退避させたあと、次に実行権を割り当てるタスクを選択し、そのタスクのＴＣＢからコンテキスト情報を読み出して、ＣＰＵレジスタにロードする。このようにして、各タスクはタイムスライスを単位として少しずつ自己の処理を進めていく。
【０００５】
マルチタスクＯＳは、複数のタスクを効率的に実行できるというメリットがあるが、コンテキスト情報の退避・ロードというオーバーヘッドが新たに発生するというデメリットもある。通常、マルチタスクＯＳのメリットはタスクスイッチにともなうオーバーヘッドを補って余りある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平１１−２７２４８０号公報
【特許文献２】特開２００１−７５８２０号公報
【非特許文献】
【０００７】
【非特許文献１】森久直、坂巻佳壽美、重松宏志、「組込み制御システム向けリアルタイムＯＳのハードウェア化（Hardware implementation of a read-time operating system for embedded control system）」、東京都立産業技術研究所研究報告、日本、２００５年８月４日（原稿受付）、８、ｐ．５５−５８
【発明の概要】
【発明が解決しようとする課題】
【０００８】
近年においては、決められた時間内に処理が完了することを厳密に要求するリアルタイムＯＳ（以下、「ＲＴＯＳ（Real-Time Operating System）」）が組込システム（Enbeded System）を中心として普及しつつある。このような時間的要件の厳しいＲＴＯＳにおいては、タスクスイッチ時のオーバーヘッドがシステム全体のパフォーマンスに大きく影響することがある。
【０００９】
また、ＲＴＯＳは、ＤＭＡ（Direct Memory Access）転送の完了、通信パケットの受信、あるいは、キーボードの押下といった不定期的に発生するさまざまな外部要因にも即時的に対応しなければならない。通常、外部要因の発生を示す割込要求信号が受信されると、ＲＴＯＳは、特別なタスクを起動して「割り込み処理」を実行する。ＲＴＯＳのパフォーマンスを向上させる上では、このような外部要因対応時におけるオーバーヘッドの抑制は特に重要である。
【００１０】
本発明は、本発明者による上記課題認識に基づいて完成されたものであり、その目的は、マルチタスク処理においてより効率的にタスクを実行制御するための技術を提供することであり、特に、割り込み処理の高速化を実現するための技術、を提供することにある。
【課題を解決するための手段】
【００１１】
本発明のある態様は、タスク処理装置である。
この装置は、処理レジスタと、メモリから処理レジスタにデータをロードし、処理レジスタのデータにしたがってタスクを実行する実行制御回路と、タスクごとの状態データを保持する状態レジスタと、タスクの実行状態を制御するタスク切換回路と、所定の選択条件によりタスクを選択するタスク選択回路と、外部からの割込要求信号を処理する割込回路と、を備える。
実行制御回路は、第１のタスクがシステムコール命令を実行するとき、その旨をタスク切換回路に通知する。タスク選択回路は、実行可能に待機している状態を示すＲＥＡＤＹ（レディ）状態のタスクの中から実行対象となるタスクを選択する。
タスク切換回路は、システムコール命令実行時におけるタスク選択回路からの出力により次の実行対象となる第２のタスクを選択し、処理レジスタのデータを所定の記憶領域に退避させるとともに、第１のタスクの状態データを設定変更し、選択した第２のタスクについて記憶領域に退避されていたデータを処理レジスタにロードするとともにその状態データをＲＥＡＤＹ状態からＲＵＮ（ラン）状態に変更したあと、実行制御回路にタスクの実行を許可する。実行制御回路は、システムコール信号を送信した後、この実行許可を条件として、第２のタスクを実行する。
一方、割込回路は、外部から割込要求信号を受信すると、その割込要求信号に対応づけられている割込操作命令をタスク切換回路に送信する。タスク切換回路は、この割込操作命令にしたがってタスクの状態データを設定変更することにより、割込要求信号に対応する。
【００１２】
処理レジスタにロードされるデータは、命令（instruction）とオペランド、オペランドを持たない命令、あるいは、プログラムカウンタやスタックポインタのような単純なデータであってもよい。このような処理方法によれば、状態レジスタによりタスクの状態を管理するので、タスク切換回路はタスク選択回路からの出力に基づいてタスクスイッチを実行できる。そして、外部から割込要求信号が受信されたときには、タスク切換回路がその割込要求信号に対応づけられている割込操作命令にしたがって状態レジスタのデータを設定変更するため、割込要求信号にハードウェア・レベルで高速に対応できることになる。
【００１３】
なお、以上の構成要素の任意の組合せ、本発明を方法、システム、記録媒体、コンピュータプログラムにより表現したものもまた、本発明の態様として有効である。
【発明の効果】
【００１４】
本発明によれば、マルチタスク処理において、より効率的なタスクの実行制御が実現される。
【図面の簡単な説明】
【００１５】
【図１】タスクの状態遷移図である。
【図２】一般的なＲＴＯＳの概念図である。
【図３】ソフトウェアＲＴＯＳが実行される一般的なＣＰＵの回路図である。
【図４】基本例におけるＲＴＯＳの概念図である。
【図５】基本例におけるタスク処理装置の回路図である。
【図６】図５のＣＰＵの回路図である。
【図７】実行制御回路１５２がＣＰＵクロックを停止させる仕組みを示す回路図である。
【図８（ａ）】割込要求信号発生時における各種信号の関係を示すタイムチャートである。
【図８（ｂ）】システムコール実行時における各種信号の関係を示すタイムチャートである。
【図９】パイプライン処理におけるＣＰＵクロックの停止タイミングを説明するための模式図である。
【図１０】状態記憶部とタスク切換回路の関係を示す回路図である。
【図１１】一般的なＲＴＯＳによるＲＵＮ−タスク選択に際して利用されるタスクレディリストを示す図である。
【図１２】実行選択回路の回路図である。
【図１３】一般的なＲＴＯＳによるセマフォ処理において利用されるウェイトセマフォリストを示す図である。
【図１４】セマフォ選択回路の回路図である。
【図１５】基本例におけるタスク切換回路の状態遷移図である。
【図１６】図５のタスク処理装置のうち、タスク制御回路を搭載しないタスク処理装置の回路図である。
【図１７】図５のタスク処理装置のうち、退避回路を搭載しないタスク処理装置の回路図である。
【図１８】一般的なソフトウェアＯＳによる割り込み処理のタイムチャートである。
【図１９】改良例におけるタスク処理装置の回路図である。
【図２０】割込回路の回路図である。
【図２１】記憶部のデータ構造図である。
【図２２】割込操作命令のデータ構造である。
【図２３】高速割り込み処理の過程を示すシーケンス図である。
【図２４】改良例におけるタスク切換回路の状態遷移図である。
【図２５】改良例のタスク処理装置による高速割り込み処理の処理過程を示すタイムチャートである。
【発明を実施するための形態】
【００１６】
本実施例のタスク処理装置１００は、マルチタスクＯＳのタスクスケジューリングを電子回路により実現し、更に、割り込み処理アルゴリズムをハードウェア・ロジックとして実装することにより、マルチタスクＯＳとしての処理効率を向上させている。
まず、本実施例においてマルチタスクＯＳのタスクスケジューリングを電子回路により実現するタスク処理装置１００について「基本例」として説明する。そのあと、割り込み処理アルゴリズムの実装により、更なる高速化を実現する方法を「改良例」として説明する。以下、「本実施例」というときには、原則として、「基本例」および「改良例」の両方を示すものとする。
｛基本例｝
【００１７】
本実施例に示すタスク処理装置１００は、マルチタスクＯＳのタスクスケジューリング機能を電子回路により実現している。タスク処理装置１００の詳細を説明する前に、まず図１に関連してタスクの状態遷移について説明する。ここでは一般的なマルチタスクＯＳにおけるタスクの状態遷移として説明するが、タスク処理装置１００によるタスクの状態遷移についても同じである。また、タスク処理装置１００において実行されるシステムコールについても概説する。図２および図３に関連して一般的なマルチタスクＯＳの設計思想について述べた上で、図４から図１０に関連して、基本例におけるタスク処理装置１００の処理方法について詳述する。更に、セマフォ（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）として提供されてもよい。記憶部４０６の内容をアプリケーションにより書き換え可能であれば、高速割り込み処理の内容をソフトウェアにより設定変更できる。
【０１４９】
図２３は、高速割り込み処理の過程を示すシーケンス図である。
まず、信号選択回路４０２は、処理対象となる高速割込要求信号ＩＮＴＲ（Ｈ）＿ｎを選択し（Ｓ１３０）、ＱＩＮＴ＿ｎをアサートする（Ｓ１３２）。操作回路４０４は、ＩＳＲＯＰをアサートして、高速割り込み処理の最中である旨を信号選択回路４０２に通知する（Ｓ１３４）。信号選択回路４０２は、ＩＳＲＯＰをアサートされると、新たな高速割込要求信号を受信しても、バッファリングしておき、ＱＩＮＴをアサートすることはない。
【０１５０】
一方、操作回路４０４は、ＱＩＮＴ＿ｎをアサートされると、ＩＳＲ＿ＲＱをアサートして、高速割り込み処理の開始をタスク切換回路２１０に要求する（Ｓ１３６）。このとき、タスク切換回路２１０は、ＣＰＵクロック（ＣＬＫ）を停止させ、高速割り込み処理の開始に備える。操作回路４０４は、ＱＩＮＴ＿ｎに対応するアドレスＡＤＤ［ｎ］をＤＳＣ＿ＡＤＤに指定して、記憶部４０６から割込操作命令ｐ０を読み出す（Ｓ１３８）。割込操作命令ｐ０は、ＩＳＲ＿ＤＴ[３１：０]として、タスク切換回路２１０に送信される（Ｓ１４０）。
【０１５１】
タスク切換回路２１０は、受信した割込操作命令ｐ０にしたがって、セマフォテーブル２１２やイベントテーブル２１４、状態記憶部２２０の設定内容を変更する。より具体的には、タスク切換回路２１０は、一般タスクが、リリースセマフォシステムコール（シグナリングセマフォシステムコール）やセットイベントシステムコール（セットフラグシステムコール）を発行するときと同等の処理プロセスを実行することにより、セマフォテーブル２１２やイベントテーブル２１４、状態記憶部２２０の設定内容を変更する。割込操作命令の処理内容については、基本例に示したシステムコール命令の処理内容と同様である。割込操作命令の最上位ビットに「１」が設定されていれば、タスク切換回路２１０は、ＩＳＲ＿ＮＸをアサートして次の割込操作命令ｐ１を操作回路４０４に要求する（Ｓ１４４）。操作回路４０４は、次の割込操作命令ｐ１をロードし（Ｓ１４６）、割込操作命令ｐ１はタスク切換回路２１０に送信される（Ｓ１４８）。
【０１５２】
タスク切換回路２１０が最後の割込操作命令ｐｘを実行したとき、すなわち、最上位ビットに「０」が設定されている割込操作命令ｐｘを実行したとき、タスク切換回路２１０はＩＳＲ＿ＥＮＤをアサートする（Ｓ１５２）。操作回路４０４は、高速割り込み処理の完了を認識し、ＩＳＲＯＰをネゲートする（Ｓ１５４）。こうして、信号選択回路４０２は次の高速割込要求信号を選択可能となる。
【０１５３】
図２４は、改良例におけるタスク切換回路２１０の状態遷移図である。
改良例においては、図１５に示した状態遷移図に加えて、高速割り込み処理（Ａ６）が追加されている。また、通常割り込み処理（Ａ３）は、図１５に示した割り込み処理（Ａ３）と同じである。そのほかにも、基本例と同一の符号を付した構成は、同一の処理内容を示している。
【０１５４】
タスク実行中（Ａ２）において、高速割込要求信号ＩＮＴＲ（Ｈ）が検出されると（Ｓ２４）、ＩＳＲ＿ＲＱがアサートされて、高速割り込み処理（Ａ６）が実行される。割込回路４００がタスク切換回路２１０に割込操作命令を送信すると（Ｓ２６）、タスク切換回路２１０は対応したシステムコール処理（Ａ４）を実行する。システムコール命令の実行が完了すると、高速割り込み処理（Ａ６）に状態遷移する（Ｓ２８）。更に処理すべき割込操作命令が残っていなければ、高速割り込み処理は終了して（Ｓ３０）、次に実行すべき一般タスクが選択される（Ａ５）。
【０１５５】
図２５は、改良例のタスク処理装置１００による高速割り込み処理の処理過程を示すタイムチャートである。
同図においては、まず、一般タスク実行中に割込要求信号ＩＮＴＲが検出されている。即時対応すべき割込要求信号である場合、ＣＰＵクロック（ＣＬＫ）の停止により、実行中の一般タスクは中断され、割込回路４００とタスク切換回路２１０による高速割り込み処理が開始される（Ｓ１６０）。
【０１５６】
割込回路４００は、適宜、割込操作命令を読み出し、タスク切換回路２１０が割込操作命令として指定されるシステムコール命令を実行する。こうして一連のシステムコールにより実現される高速割り込み処理が完了すると（Ｓ１６２）、タスク切換回路２１０は次のＲＵＮ−タスクを選択する（Ｓ１６４）。選択後、ＣＰＵクロック（ＣＬＫ）が再開され、一般タスクによる通常処理が再開される（Ｓ１６６）。
【０１５７】
改良例に示したタスク処理装置１００によれば、高速割り込み処理を割込回路４００とタスク切換回路２１０の協働によりハードウェア・レベルで実現できる。本発明者らの実験によると、基本例におけるタスク処理装置１００に比べて、改良例におけるタスク処理装置１００は更に約４倍の速度で動作することが確認されている。記憶部４０６を書き込み可能メモリとして形成することにより、高速割り込み処理であっても、その処理内容をある程度柔軟に設定できる。
【０１５８】
従来、ＯＳをはじめとするソフトウェアを高速実行するためにさまざまな方法が試みられてきた。こういった試みは、ＣＰＵクロック数の増加、メモリ容量やレジスタ容量の増加、あるいは、複数のＣＰＵによる並列処理、更には、ネットワーク分散処理といった大規模化・複雑化を指向することが多い。
これに対して、本実施例に示したタスク処理装置１００の場合、既存のＣＰＵ１５０に退避回路１２０やタスク制御回路２００を追加することにより、処理効率を飛躍的に向上させている。ソフトウェアＯＳの場合、本来実行したいタスクスイッチ等の処理を実現するために、ＴＣＢやタスクレディリストの管理といった付随的処理を実行せざるを得ない。これに対して、タスク処理装置１００は、タスクスイッチやタスクの状態管理、割り込み処理をハードウェア・ロジックにより実現しているため、このようなソフトウェア特有のオーバーヘッドから解放されている。このため、消費電力やコストの増加を抑制しつつ高速化を実現するという理想的なシステムとなっている。改良例に示したように、高速割り込み処理のアルゴリズムを電子回路により実現することにより、いっそうの高速化が実現される。
【０１５９】
以上、本発明を実施例をもとに説明した。実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【産業上の利用可能性】
【０１６０】
本発明によれば、マルチタスク処理において、より効率的なタスクの実行制御が実現される。
【図１】
2010049700.tif 000003
【図２】
2010049700.tif 000004
【図３】
2010049700.tif 000005
【図４】
2010049700.tif 000006
【図５】
2010049700.tif 000007
【図６】
2010049700.tif 000008
【図７】
2010049700.tif 000009
【図８（ａ）】
2010049700.tif 000010
【図８（ｂ）】
2010049700.tif 000011
【図９】
2010049700.tif 000012
【図１０】
2010049700.tif 000013
【図１１】
2010049700.tif 000014
【図１２】
2010049700.tif 000015
【図１３】
2010049700.tif 000016
【図１４】
2010049700.tif 000017
【図１５】
2010049700.tif 000018
【図１６】
2010049700.tif 000019
【図１７】
2010049700.tif 000020
【図１８】
2010049700.tif 000021
【図１９】
2010049700.tif 000022
【図２０】
2010049700.tif 000023
【図２１】
2010049700.tif 000024
【図２２】
2010049700.tif 000025
【図２３】
2010049700.tif 000026
【図２４】
2010049700.tif 000027
【図２５】
2010049700.tif 000028