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