(57)【要約】      （修正有）【課題】ハードウェアを極力追加することなく暴走を検出できるプロセッサを提供する。【解決手段】プロセッサは実行する命令の１つとして監視分岐命令を備える。プロセッサは、監視分岐命令をデコードすると、パイプライン処理部１１に発生する遅延スロットにタスク監視用の命令を組み込んで、タスク監視用の命令を実行した後に分岐を行う。１段目のパイプラインで監視分岐命令ＢＴＭがデコードされて実行されると、デコードに伴い生成されたタスク監視用の命令Ａ、Ｂが、２段目及び３段目のパイプラインにおいて実行され、タスクの監視が行われる。その後、４段目のパイプラインにおいて分岐先命令Ａが実行される。【選択図】図４
2016197365.tif 000002
【特許請求の範囲】
【請求項１】
命令の実行を複数段のパイプラインで処理するパイプライン処理部（１１）を備えたプロセッサにおいて、
前記命令の１つとして監視機能付き分岐命令を備え、
前記監視機能付き分岐命令をデコードすると、当該パイプライン処理部に発生する遅延スロットに、タスク監視用の命令が組み込まれ、
前記タスク監視用の命令を実行した後に分岐を行うことを特徴とするプロセッサ。
【請求項２】
前記監視機能付き分岐命令をデコードした回数をカウントするカウンタ（７）を備え、
前記タスク監視用の命令は、前記カウンタの値に基づいて生成される演算命令であることを特徴とする請求項１記載のプロセッサ。
【請求項３】
前記演算命令は、前記監視機能付き分岐命令により指定される識別データを演算の対象とすることを特徴とする請求項２記載のプロセッサ。
【請求項４】
前記識別データは、前記監視機能付き分岐命令のオペランド部に配置されていることを特徴とする請求項３記載のプロセッサ。
【請求項５】
前記タスク監視用の命令は、前記監視機能付き分岐命令の直前にフェッチした命令（以下、直前命令と称す）に付与されている識別データに基づいて生成される演算命令であることを特徴とする請求項１記載のプロセッサ。
【請求項６】
前記監視機能付き分岐命令は、前記各関数の末部に配置され、
前記直前命令には、対応する判定値及び参照値が付与されており、
前記演算命令は、前記直前命令の識別データと、直前に実行された関数における直前命令に付与されている判定値とを演算対象とするもので、
前記演算の結果として得られた判定値を、前記参照値と比較することでタスクの監視を行うことを特徴とする請求項５記載のプロセッサ。
【請求項７】
前記識別データは、前記直前命令のオペランド部に配置されていることを特徴とする請求項５又は６記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、タスクの暴走を検知する機能を備えたプロセッサに関する。
【背景技術】
【０００２】
マイクロプロセッサにおいては、タスクの暴走を検知する機能を備えているものがある。例えば特許文献１には、マイクロプロセッサのプログラムが異常な分岐命令を実行したときの暴走を検出するため、識別データメモリ３に、分岐命令により読み込む数値（識別データ）を格納し、レジスタ４が識別データメモリ３から識別データ１６を読み込んで判定データ１７を出力する。判定回路６は、判定データ１７の順序を監視し、識別データ１６が正常に識別データメモリ３から読み出されているか否かを監視する構成が開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平１１−２１２８２８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、特許文献１の構成では、暴走を検出するために、マイクロプロセッサ１とは別にカウンタ５や判定回路６等のハードウェアを追加しており、マイクロプロセッサ１を含むシステムが大型化することになる。
本発明は上記事情に鑑みてなされたものであり、その目的は、ハードウェアを極力追加することなく暴走を検出できるプロセッサを提供することにある。
【課題を解決するための手段】
【０００５】
請求項１記載のプロセッサによれば、命令の実行を複数段のパイプラインで処理する構成において、命令の１つとして監視機能付き分岐命令を備える。そして、監視機能付き分岐命令をデコードすると、パイプライン処理部に発生する遅延スロットにタスク監視用の命令を組み込んで、タスク監視用の命令を実行した後に分岐を行う。このように構成すれば、プロセッサは、監視機能付き分岐命令のデコードに伴いタスクの監視を行うことができるので、タスク監視機能を実現するためのハードウェアを外部に追加する必要が無く、プロセッサを含むシステムを小型に構成できる。
【図面の簡単な説明】
【０００６】
【図１】第１実施形態であり、プロセッサの構成を概略的に示す機能ブロック図
【図２】監視分岐命令及び無条件分岐命令のフォーマットの一例を示す図
【図３】パイプライン処理部の１段目で、無条件分岐命令がデコードされて実行され多状態を示す図
【図４】パイプライン処理部の１段目で、監視分岐命令がデコードされて実行され多状態を示す図
【図５】タスク監視処理の内容を示すフローチャート
【図６】第２実施形態であり、プロセッサの構成を概略的に示す機能ブロック図
【図７】プロセッサが実行するＭａｉｎ（）関数を示す図
【図８】関数ｆｕｎＡ〜ｆｕｎＤに対応する識別データ，判定値，参照値等を示す図
【図９】関数ｆｕｎＡ〜ｆｕｎＤの実行に伴うタスク監視処理の実行をイメージ的に示す図
【図１０】図９の処理に対応するフローチャート
【発明を実施するための形態】
【０００７】
（第１実施形態）
以下、第１実施形態について説明する。図１に示すように、本実施形態のプロセッサ１は、外部の記憶部２より命令をフェッチして命令保持部（レジスタ）３に保持する。命令保持部３に保持された命令は、デコーダ部４においてデコードされると、マルチプレクサ５を介して演算部６に入力される。また、プロセッサ１により実行される命令の１つとして「監視機能付き分岐命令（以下、監視分岐命令と称す）」が用意されており、デコーダ部４が監視分岐命令をデコードすると、当該命令に含まれているデータ等が分岐命令カウンタ部７に入力される。分岐命令カウンタ部７は、監視分岐命令の実行回数をカウントするカウンタであり、そのカウンタ値に応じて、後述するようにタスクの実行状態を監視するための監視命令を生成し、演算部６に入力する。
【０００８】
演算部６の演算結果は、汎用レジスタ８及び判定値レジスタ９に入力されており、汎用レジスタ８，判定値レジスタ９に格納されたデータは、マルチプレクサ１０を介して演算部６に入力される。尚、マルチプレクサ５及び１０の切り換え制御は、図示しない制御部により行われる。
【０００９】
図２に示すように、無条件分岐命令ＢＲは、第１オペランドに分岐先のアドレスであるターゲットアドレスのみが配置される。これに対して監視分岐命令ＢＴＭは、オペランド１にターゲットアドレスが配置されるのは同様だが、第２オペランドに「識別データ」が埋め込まれている。この識別データは即値でも良いし、識別データが記憶されているリソースのアドレスであっても良い。
【００１０】
図３に示すように、プロセッサ１が備えているパイプライン処理部１１において、１段目のパイプラインで無条件分岐命令ＢＲがデコードされて実行されると、例えば２段目及び３段目のパイプラインにおいてフェッチされた命令は実行されず破棄命令（遅延スロット）となる。そして、４段目のパイプラインにおいてフェッチされた命令Ａが分岐先となり、そこから実行される。
【００１１】
これに対して、図４に示すように、１段目のパイプラインで監視分岐命令ＢＴＭがデコードされて実行されると、前記デコードに伴い生成されたタスク監視用の命令Ａ，Ｂが、２段目及び３段目のパイプラインにおいて実行され、タスクの監視が行われる。その後、４段目のパイプラインにおいて分岐先命令Ａが実行される。
【００１２】
次に、本実施形態の作用について説明する。図５に示すように、プロセッサ１は、記憶部２よりタスク（関数）に含まれている命令をフェッチして命令保持部３に読み込む（Ｓ１）。そして、デコーダ部４は、保持された命令をデコードするが、この時デコードした命令が「監視分岐命令」であれば、当該命令の第２オペランドより直接，又は第２オペランドが示すアドレスより識別データを取得して演算部６に出力する。また、分岐命令カウンタ部７のカウンタ値を更新（インクリメント）するための指示を行う（Ｓ２）。
【００１３】
すると、分岐命令カウンタ部７は、更新されたカウンタ値に対応する演算子（演算命令，タスク監視用の命令）を生成する（Ｓ３）。ここでは、例えばカウンタ値「１」は加算，「２」は乗算，「３」は乗数を２倍した乗算，…といったように、カウンタ値に対応する演算子を予め設定しておき、各演算子に対応する命令コードを、例えば図示しない専用装置に保持しておく。そして、分岐命令カウンタ部７は、上記対応関係に従い演算子を前記専用装置に指定し、指定した演算子に対応する命令コードを前記専用装置より読み出して演算部６に入力する。
【００１４】
続いて、演算部６において分岐命令が実行されると（Ｓ４）、演算部６は、以下のようにしてタスクの監視処理を実行する。ステップＳ２で取得された識別データと、初期値が不定である「判定値」とに対し、分岐命令カウンタ部７が生成した演算子を用いて演算を行う。得られた演算結果は、新たな「判定値」として汎用レジスタ８に格納する（Ｓ５）。そして、現在実行中のタスクの終了時に、ステップＳ５で得られた判定値と、演算結果についての参照値とを比較して（タスク監視用の命令）異常判定を行う（Ｓ６）。
【００１５】
ここで、参照値については識別データに対応するものを予め汎用レジスタ８に格納しておくか、又は記憶部２に記憶しておき、ステップＳ６の実行時に読み出すようにしても良い。また、初回の演算を実行する段階では参照値は不定であるが、最初に実行する演算をデータ転送命令（Ｍｏｖ，第２実施形態参照）にすれば、参照値が不定であっても問題はない。
【００１６】
尚、図４においては、２段目のパイプラインで実行されるのがステップＳ５の処理に対応し、３段目のパイプラインで実行されるのがステップＳ６の処理に対応する。また、分岐命令カウンタ部７がカウンタ値に応じて生成する演算子は、実行される各命令に対応する必要がある。そのためには、例えば各命令を循環的に実行するループの冒頭において、分岐命令カウンタ部７をリセットすれば良い。
【００１７】
以上のように本実施形態によれば、プロセッサ１が実行する命令の１つとして監視分岐命令を備え、プロセッサ１は、監視分岐命令をデコードすると、パイプライン処理部１１に発生する遅延スロットにタスク監視用の命令を組み込んで、タスク監視用の命令を実行した後に分岐を行う。このように構成すれば、プロセッサ１は監視分岐命令のデコードに伴いタスクの監視を行うことができるので、特許文献１のようにタスク監視機能を実現するためのハードウェアを外部に追加する必要が無く、プロセッサ１を含むシステムを小型に構成できる。
【００１８】
そして、監視分岐命令をデコードした回数をカウントする分岐命令カウンタ部７を備え、タスク監視用の命令を、分岐命令カウンタ部７のカウンタ値に基づいて生成される演算子とするので、カウンタ値に応じて異なる演算を実行させることができる。このように、プロセッサ１の内部に追加するハードウェアは、分岐命令カウンタ部７等の極小規模なものであるから、プロセッサ１自体が大型化することも回避できる。また、識別データの即値又はアドレスを監視分岐命令の第２オペランド部に配置したので、識別データの取得を容易に行うことができる。
【００１９】
（第２実施形態）
以下、第１実施形態と同一部分には同一符号を付して説明を省略し、異なる部分について説明する。図６に示すように、第２実施形態のプロセッサ２１は、分岐命令カウンタ部７が監視命令生成部２２に置き換えられている。そして、プロセッサ２１は、図７に示すように、Ｍａｉｎ（）関数（メインルーチン）において関数ｆｕｎＡ〜ｆｕｎＤを繰り返し実行するようにプログラミングされており、各関数ｆｕｎＡ〜ｆｕｎＤの末部には監視分岐命令が記述されているものとする。
【００２０】
図８に示すように、各関数ｆｕｎＡ〜ｆｕｎＤについては、例えば６ビットの識別データが付与されており、この識別データは、各関数ｆｕｎＡ〜ｆｕｎＤで「中身」として実行される演算子に対応している。例えば、関数ｆｕｎＡの識別データ「１００１０１」は演算子Ｍｏｖ（転送命令）に対応し、関数ｆｕｎＢの識別データ「００１１００」は演算子ＳＵＢＡ（減算命令）に対応している。識別データは、例えば第１実施形態では監視分岐命令について図２に示したように、各関数の「中身」である命令のオペランド部に配置しても良い。
【００２１】
また、各関数ｆｕｎＡ〜ｆｕｎＤに対応して、タスク監視命令の演算結果である判定値と、その判定値と比較するための参照値とがあり、これらは第１実施形態と同様に汎用レジスタ８や記憶部２等に記憶されている。プロセッサ２１が、関数ｆｕｎＡ〜ｆｕｎＤを順次実行する際の処理の流れの概略は、図９に示すようになる。
【００２２】
初回に関数ｆｕｎＡを実行する際の判定値は不定となっている。そして、関数ｆｕｎＡ自体（中身）を実行した後に監視分岐命令を実行するが（この時点でｆｕｎＢの命令実行が予約される）、ここでは、識別データ「１００１０１」を監視命令生成部２２に入力すると、対応する演算子Ｍｏｖが生成される。これは、関数ｆｕｎＡの中身としてその直前に実行した命令であるから「直前命令」に対応する。したがって、実行されるタスク監視命令の内容は、識別データ「１００１０１」を演算子Ｍｏｖにより、オペランドで指定されている所定の領域（例えば汎用レジスタ８）に転送する（監視命令Ａ）、というものになる（不定の判定値は使用されない）。
【００２３】
すると、演算結果である判定値は、転送先の内容である「１００１０１」になる。この場合、正常な演算結果は識別データ「１００１０１」になることが既知であるから、参照値としては予め「１００１０１」を用意できる。これらの処理が正常に実行されれば、判定値と参照値とは一致する。その比較照合処理が、監視命令Ｂとなる。
【００２４】
次に、分岐先である関数ｆｕｎＢを実行し、その後監視分岐命令を実行する。ここでは、識別データ「００１１００」を監視命令生成部２２に入力すると、対応する演算子ＳＵＢＡが生成される。したがって、実行されるタスク監視命令の内容は、図８にも例示しているように、関数ｆｕｎＡの判定値「１００１０１」より、関数ｆｕｎＢの識別データ「００１１００」を減算する、というものになる。
【００２５】
すると、演算結果である判定値は、「０１１００１」になる。この場合、正常な演算結果は「０１１００１」になることが既知であるから、参照値としては予め「０１１００１」を用意できる。これらの処理が正常に実行されれば、判定値と参照値とは一致する。以上のようにして、引き続き関数ｆｕｎＣ，ｆｕｎＤについても同様に実行する。
【００２６】
図１０に示すフローチャートにおいて、ステップＳ１１〜Ｓ１３は、第１実施形態のステップＳ１〜Ｓ３とほぼ同様の処理であり、「監視分岐命令」以外の命令であれば（Ｓ１３：ＮＯ）当該命令をパイプライン処理部１１において実行し（Ｓ２０）、ステップＳ１１に戻る。
【００２７】
一方、ステップＳ１３において、デコードした命令が「監視分岐命令」であれば（ＹＥＳ）、直前にデコードした命令の識別データを監視命令生成部２２にセットする（Ｓ１４）。すると、監視命令生成部２２が識別データに対応した演算子を生成し（Ｓ１５）、演算部６が分岐命令を実行する（Ｓ１６）。続いて、演算部６が、１つ前に実行した関数の判定値と、現在実行中の関数の識別データとについて、ステップＳ１５で生成した演算子により演算を実行し、新たに判定値を生成する（Ｓ１７）。そして、生成した判定値と参照値とが一致するか否かを判断し（Ｓ１８）一致すれば（ＹＥＳ）Ｍａｉｎ（）にリターンし、一致しなければ（ＮＯ）「異常検出」とする（Ｓ１９）。
【００２８】
尚、ステップＳ１３においてデコードされた命令が無条件分岐命令であった場合、ステップＳ２０で実行される命令には遅延スロットが含まれる。そして、ステップＳ１７及びＳ１８は、図４に示したように遅延スロットに埋め込まれて実行されるから、ステップＳ１６とステップＳ２０とがパイプライン処理部１１において実行されるタイミングは同じになる。
【００２９】
また、ステップＳ１８及びＳ１９の処理については、上記のように各関数内で個別に実行する形態に限らない。例えば、Ｍａｉｎ（）関数内で最後に実行される関数ｆｕｎＤにおいて、その中身を実行した後に、全ての関数ｆｕｎＡ〜ｆｕｎＤについて一括して異常の有無を判定し、何れの関数で異常があったのかを特定しても良い。
【００３０】
以上のように第２実施形態によれば、プロセッサ２１はＭａｉｎ（）関数内に配置されている複数の関数ｆｕｎＡ〜ｆｕｎＤを繰り返し実行する。そして、監視分岐命令を各関数ｆｕｎＡ〜ｆｕｎＤの末部に配置し、監視分岐命令の直前に実行される命令については、対応する判定値及び参照値を付与しておく。
【００３１】
そして、識別データより生成される演算子は、直前命令の識別データと、直前に実行された関数での直前命令に付与されている判定値とを演算対象とし、その演算の結果として得られた判定値を参照値と比較することでタスクの監視を行う。したがって、複数の関数を繰り返し実行するプロセッサ２１において、タスク監視処理を効率的に行うことができる。この場合、識別データは、直前命令のオペランド部に配置することで、識別データの取得を容易に行うことができる。
【００３２】
本発明は上記した、又は図面に記載した実施形態にのみ限定されるものではなく、以下のような変形又は拡張が可能である。
第２実施形態において、Ｍａｉｎ（）関数内で実行する関数の数は「４」に限らず、適宜変更して良い。
第２実施形態において、命令自体のバイナリコードを「識別データ」として使用しても良い。
【符号の説明】
【００３３】
図面中、１はプロセッサ、７は分岐命令カウンタ部、１１はパイプライン処理部、２１はプロセッサ、２２は監視命令生成部を示す。
【図１】
2016197365.tif 000003
【図２】
2016197365.tif 000004
【図３】
2016197365.tif 000005
【図４】
2016197365.tif 000006
【図５】
2016197365.tif 000007
【図６】
2016197365.tif 000008
【図７】
2016197365.tif 000009
【図８】
2016197365.tif 000010
【図９】
2016197365.tif 000011
【図１０】
2016197365.tif 000012