(57)【要約】【課題】限られた演算資源を用いて障害の検出および障害の特定を実現することができる。【解決手段】演算装置は、同一の機能を有し異なる実装がなされた第１のソフトウェアモジュール、第２のソフトウェアモジュール、および第３のソフトウェアモジュールが格納される記憶部と、第１のソフトウェアモジュール、第２のソフトウェアモジュール、第３のソフトウェアモジュールを実行する演算部と、演算部による第１のソフトウェアモジュールの出力、および第２のソフトウェアモジュールの出力に基づき障害を検出する検出部と、検出部が障害を検出すると、第３のソフトウェアモジュールの使用を開始し、第１のソフトウェアモジュールの出力と、第２のソフトウェアモジュールの出力と、第３のソフトウェアモジュールの出力と、に基づき障害のあるソフトウェアモジュールを特定する障害特定部と、を備える。【選択図】図１
2019020864.tif 000002
【特許請求の範囲】
【請求項１】
同一の機能を有し異なる実装がなされた第１のソフトウェアモジュール、第２のソフトウェアモジュール、および第３のソフトウェアモジュールが格納される記憶部と、
前記第１のソフトウェアモジュール、前記第２のソフトウェアモジュール、前記第３のソフトウェアモジュールを実行する演算部と、
前記演算部による前記第１のソフトウェアモジュールの出力、および前記第２のソフトウェアモジュールの出力に基づき障害を検出する検出部と、
前記検出部が障害を検出すると、前記第３のソフトウェアモジュールの使用を開始し、前記第１のソフトウェアモジュールの出力と、前記第２のソフトウェアモジュールの出力と、前記第３のソフトウェアモジュールの出力と、に基づき障害のあるソフトウェアモジュールを特定する障害特定部と、を備える演算装置。
【請求項２】
請求項１に記載の演算装置において、
前記障害特定部により障害があることが特定されたソフトウェアモジュールの使用を停止する演算装置。
【請求項３】
請求項２に記載の演算装置において、
前記検出部は、前記障害特定部が前記第１のソフトウェアモジュールおよび前記第２のソフトウェアモジュールのいずれか一方を障害があるソフトウェアモジュールとして特定すると、前記第１のソフトウェアモジュールおよび前記第２のソフトウェアモジュールのうち障害があることが特定されていないソフトウェアモジュール、および前記第３のソフトウェアモジュールの出力に基づき障害を検出する演算装置。
【請求項４】
請求項１に記載の演算装置において、
前記第１のソフトウェアモジュール、前記第２のソフトウェアモジュール、および前記第３のソフトウェアモジュールには、３２ビットＣＰＵ用のソフトウェアモジュールと、６４ビットＣＰＵ用のソフトウェアモジュールとが含まれる演算装置。
【請求項５】
請求項１に記載の演算装置において、
前記第１のソフトウェアモジュール、および前記第２のソフトウェアモジュールは並列に実行される演算装置。
【請求項６】
請求項１に記載の演算装置において、
前記演算部は第１コアおよび第２コアを備え、
前記障害特定部は、前記第１コアが演算した前記第１のソフトウェアモジュールの出力と、前記第２コアが演算した前記第２のソフトウェアモジュールの出力とが一致しない場合に、前記第２コアが演算した前記第１のソフトウェアモジュールの出力と、前記第１コアが演算した前記第２のソフトウェアモジュールの出力とを用いて、前記第１コアまたは前記第２コアに障害があることを特定する演算装置。
【請求項７】
請求項１に記載の演算装置において、
他の前記演算装置と通信を行う通信部と、
現在の計算負荷の大きさを前記通信部を介して前記他の演算装置に出力する負荷算出部とをさらに備え、
前記障害特定部は、受信した現在の前記計算負荷に基づき前記第３のソフトウェアモジュールの出力を算出させる前記演算装置を決定する演算指令部とをさらに備える演算装置。
【請求項８】
請求項１に記載の演算装置において、
前記第１のソフトウェアモジュール、前記第２のソフトウェアモジュール、および前記第３のソフトウェアモジュールのそれぞれには複数の関数が含まれ、
前記複数の関数のそれぞれについて前記検出部の動作を規定する出力照合表をさらに備え、
前記検出部は、前記出力照合表を参照して前記関数ごとに障害検出の条件を判断する演算装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算装置に関する。
【背景技術】
【０００２】
車載制御装置では、要求される処理内容の高度化が進んでおり、一般のサーバーやワークステーション等で行われている技術やソフトウェアを利用することも増えつつある。このようなソフトウェアは従来の車載制御装置において行われていた開発手法によって作成されておらず、その品質は必ずしも高くない。しかも車載制御装置では、ソフトウェアのバグといった障害が発生したとしても、動作を継続させなければならず、障害の検出のみならず、障害箇所を特定し切り離すことが必要になる。この目的のため、同じ機能を持つ複数の異なる実装を照らし合わせてチェックすることで、車載制御装置全体の最終的な品質を高めることが行われており、多数決を行うことで一つの実装で障害が発生しても動作を継続させることができる。
特許文献１には、予め設定されたアプリケーションによる処理を実行し、実行された処理結果を比較してデータの診断及び修復を行う診断修復装置において、所定のデータを３以上の複数のデータ領域に記憶する記憶手段と、前記所定のデータを前記３以上の複数のデータ領域に異なる形式で書き込み、前記アプリケーションの実行時に前記３以上の複数のデータ領域にそれぞれ書き込んだデータを読み込んで照合し、照合の結果が不一致であった場合に所定の修復を行い、修復後のデータを用いて前記アプリケーションを実行する処理プログラム実行手段と、前記アプリケーションを実行した結果と、少なくとも１つの他の診断修復装置で前記アプリケーションを実行した結果とを照合する照合処理手段が開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１３−１０９５３２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１に記載されている発明では、限られた演算資源を用いて障害の検出および障害の特定を実現することができない。
【課題を解決するための手段】
【０００５】
本発明の第１の態様による演算装置は、同一の機能を有し異なる実装がなされた第１のソフトウェアモジュール、第２のソフトウェアモジュール、および第３のソフトウェアモジュールが格納される記憶部と、前記第１のソフトウェアモジュール、前記第２のソフトウェアモジュール、前記第３のソフトウェアモジュールを実行する演算部と、前記演算部による前記第１のソフトウェアモジュールの出力、および前記第２のソフトウェアモジュールの出力に基づき障害を検出する検出部と、前記検出部が障害を検出すると、前記第３のソフトウェアモジュールの使用を開始し、前記第１のソフトウェアモジュールの出力と、前記第２のソフトウェアモジュールの出力と、前記第３のソフトウェアモジュールの出力と、に基づき障害のあるソフトウェアモジュールを特定する障害特定部と、を備える。
【発明の効果】
【０００６】
本発明によれば、限られた演算資源を用いて障害の検出および障害の特定を実現することができる。
【図面の簡単な説明】
【０００７】
【図１】第１の実施の形態におけるＥＣＵ１００の構成を表すブロック図
【図２】第１モジュール入力表１５の一例を示す図
【図３】第１モジュール出力表１６の一例を示す図
【図４】第１出力照合表１７の一例を示す図
【図５】第１モジュール管理表１８の一例を示す図
【図６】ＥＣＵ１００の動作例を示す図
【図７】障害検出処理を示すフローチャート
【図８】障害特定処理を示すフローチャート
【図９】第２の実施の形態におけるＥＣＵ１００Ａの構成を表すブロック図
【図１０】第２の実施の形態における第１モジュール実行部１３Ｂの動作を表すフローチャート
【図１１】第３の実施の形態における制御システムＳの構成を表すブロック図
【図１２】第３の実施の形態における障害特定処理を示すフローチャート
【発明を実施するための形態】
【０００８】
―第１の実施の形態―
以下、図１〜図８を参照して、制御装置であるＥＣＵの第１の実施の形態を説明する。
【０００９】
（構成）
図１は、ＥＣＵ１００すなわち電子制御装置（Ｅｌｅｃｔｒｏｎｉｃ  Ｃｏｎｔｒｏｌ  Ｕｎｉｔ）の構成を表すブロック図である。ＥＣＵ１００は、演算装置であるＣＰＵ１１０および、主記憶領域であるメモリ１２０を有する。メモリ１２０には後述するように複数のモジュールが格納される。
【００１０】
モジュールとは、複数のアプリケーションから共通に利用可能なソフトウェアである。モジュールとはたとえば、ライブラリ、関数、関数の一部、または共通に利用される機能に特化したアプリケーションなどである。本実施の形態では、モジュールはアプリケーションから呼びされる複数の関数からなるソフトウェア、たとえば動的にリンクされるライブラリ（Ｄｙｎａｍｉｃ  Ｌｉｎｋ  Ｌｉｂｒａｒｙ）であり、アプリケーションとは独立している。モジュールへの入力は、これらの関数に対する引数である。モジュールの出力は、これらの関数の返り値である。また本実施の形態では符号４１で表すＰモジュール、符号４２で表すＱモジュール、および符号４３で表すＲモジュールの３つのモジュールを説明するが、これらをまとめて単に「モジュール」とも呼ぶ。
【００１１】
Ｐモジュール４１、Ｑモジュール４２、およびＲモジュール４３はいずれも同じ機能を有し、いずれのモジュールを用いる場合であっても、同一の入力に対しては同一の出力が得られることが期待される。ただしこれらのモジュールは実装が異なっており、バイナリ一致ではない。Ｐモジュール４１、Ｑモジュール４２、およびＲモジュール４３はたとえば、ある規格化されているライブラリの第１の実装、第２の実装、および第３の実装である。Ｒモジュール４３よりもＰモジュール４１およびＱモジュール４２の信頼性が高く、換言すると完成度が高い。またたとえばＣＰＵ１１０が３２ビットＣＰＵ用に作成されたアプリケーションと６４ビットＣＰＵ用に作成されたアプリケーションの両方が実行可能な場合は、以下の構成でもよい。すなわちＰモジュール４１が３２ビットＣＰＵ用の第１の実装、Ｑモジュール４２が６４ビットＣＰＵ用の第１の実装、Ｒモジュール４３が３２ビットＣＰＵ用の第２の実装であってもよい。
【００１２】
ＣＰＵ１１０は、汎用的な計算が可能な演算装置であり、並列に動作可能な２つのＣＰＵコア、すなわち第１ＣＰＵコア１１１と第２ＣＰＵコア１１２とを有する。ただしＣＰＵ１１０は、３つ以上のＣＰＵコアを有していてもよいし、１つのＣＰＵが論理的に複数のコアを有するようにふるまう機能、いわゆるハードウエアハイパースレディング機能を有してもよい。さらにＣＰＵ１１０は、半導体チップとして単体のものであってもよいし、以下で述べるメモリ１２０を一つの半導体チップ上に搭載した、いわゆるＳｏＣ（Ｓｙｓｔｅｍ−ｏｎ−Ｃｈｉｐ）であってもよい。
【００１３】
メモリ１２０は、揮発性である、たとえばＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）などから構成される主記憶装置である。メモリ１２０には、ＣＰＵ１１０が実行するコードおよび読み書きするデータを含むプログラムが配置される。本実施の形態では、第１ＣＰＵコア１１１の使用するプログラムと第２ＣＰＵコア１１２が実行するプログラムを、それぞれ第１プログラム１１と第２プログラム２１とする。第１プログラム１１および第２プログラム２１は同様の構成を有し同様の動作を行う。第１ＣＰＵコア１１１と第２ＣＰＵコア１１２は通信が可能であり、これにより第１プログラム１１と第２プログラム２１とが情報の授受が可能である。
【００１４】
第１プログラム１１は、第１アプリケーション１２と、第１モジュール実行部１３とを有する。第１モジュール実行部１３は、Ｐモジュール４１と、Ｒモジュール４３と、第１モジュール入力表１５と、第１モジュール出力表１６と、第１出力照合表１７と、第１モジュール管理表１８とを有する。第２プログラム２１は、第２アプリケーション２２と、第２モジュール実行部２３とを有する。第２モジュール実行部２３は、Ｑモジュール４２と、Ｒモジュール４３と、第２モジュール入力表２５と、第２モジュール出力表２６と、第２出力照合表２７と、第２モジュール管理表２８とを有する。
【００１５】
第１アプリケーション１２と第２アプリケーション２２は同一、いわゆるバイナリ一致の関係にある。第１プログラム１１および第２プログラム２１は同様の構成を有し同様の動作を行う。仮に第１プログラム１１および第２プログラム２１に備えられるいずれのモジュールにもバグ等の障害がなく動作する場合には、いずれのアプリケーションの実行結果も同一のものとなる。図示していない照合装置などを用いて、第１プログラム１１と第２プログラム２１の実行結果を照合して、最終的なＥＣＵ１００の出力とすることによって、安全性と信頼性を高めて制御ソフトウェアを実行することができる。  
【００１６】
第２プログラム２１に含まれるＲモジュール４３は、第１プログラム１１に含まれるＲモジュール４３と同一、すなわちバイナリ一致の関係にある。第２モジュール入力表２５と、第２モジュール出力表２６、第２出力照合表２７、および第２モジュール管理表２８のそれぞれは、第１モジュール入力表１５、第１モジュール出力表１６、第１出力照合表１７、および第１モジュール管理表１８のそれぞれと構成が同一である。以下では第１プログラム１１の構成および動作を主に説明する。
【００１７】
第１プログラム１１の第１アプリケーション１２は、ＥＣＵ１００における主要な機能を実現するソフトウェアである。なお本実施の形態では、簡単のために第１アプリケーション１２は一つとするが、複数のアプリケーションを備えてもよい。第１アプリケーション１２はモジュールの機能を必要とする時に、第１モジュール実行部１３を呼び出し、モジュールを実行してその出力を得る。以下では簡単のためにこの処理を「第１アプリケーション１２からモジュールを呼び出す」と表現するが、実際には後述するようにモジュールの実行には第１モジュール実行部１３が介在する。
【００１８】
第１モジュール実行部１３は、第１アプリケーション１２から呼び出されてモジュールを実行する。第１モジュール実行部１３は、第１アプリケーション１２から呼び出されると１つのモジュールを選択して実行し、後述する所定の条件を満たす場合に第２モジュール実行部２３におけるモジュールの実行結果と比較する。なお後述するように、第２モジュール実行部２３は第１モジュール実行部１３とは異なるモジュールを使用している。この比較により使用したいずれのモジュールにも障害がないと判断する場合は算出結果を第１アプリケーション１２に出力する。しかし、両者が不一致などの理由でいずれかのモジュールに障害が発生していると判断する場合は、第１モジュール実行部１３はもう一つのモジュールを使用して障害のあるモジュールを特定する。すなわちＥＣＵ１００は通常は、換言すると障害があると判断するまでは、第１モジュール実行部１３と第２モジュール実行部２３が異なるモジュールを１つずつ、合計２つのモジュールのみを使用する。そして障害があると判断すると、３つ目のモジュールを使用して障害があるモジュールを特定する。
【００１９】
第１モジュール入力表１５には、第１アプリケーション１２がモジュールを呼び出して何らかの入力が行われるたびにモジュールへの入力が追記される。第１モジュール出力表１６には、モジュールが出力を行うたびにその出力が記録される。第１出力照合表１７には、モジュールが備えるそれぞれの関数について、その関数の返り値が比較可能なものであるかを示す情報が予め記録される。第１出力照合表１７は、モジュールの出力を比較するか否かを判断する際に参照される。第１モジュール管理表１８には、モジュールの障害の有無が記載される。第１モジュール管理表１８の記載に基づき、実行するモジュールが選択される。以下、各構成を詳述する。
【００２０】
（第１モジュール入力表１５）
図２は、第１モジュール入力表１５の一例を示す図である。ただし図２では、一度に複数の関数が呼び出された場合の例を示しており、１つの関数の１回呼び出しが第１モジュール入力表１５の1行に相当する。また第１モジュール入力表１５の各行は、呼び出された順に並んでいる。第１モジュール入力表１５の最初の列である「Ｎｏ．」には、各行の番号が格納される。なお各行の順番と識別が可能であれば、数字以外の識別子を用いてもよい。第１モジュール入力表１５の２番目の列である「呼び出し関数」には、各呼び出しにおいて呼び出された関数を識別する情報、たとえば関数名や関数のアドレス番地が格納される。第１モジュール入力表１５の３番目の列である「入力」には、各呼び出しにおけるモジュールへの入力が格納される。なお図２に示す例では全ての呼び出しにおいて何らかの入力がされているが、入力の値が存在せず引数を持たない関数の場合には引数がないことを示す情報、たとえば「なし」や「−」が記録される。第１モジュール実行部１３は、第１アプリケーション１２がモジュールを呼び出す際に、第１モジュール入力表１５に新たな行を追加し、関数の識別子とモジュールへの入力を記録する。
【００２１】
（第１モジュール出力表１６）
図３は、第１モジュール出力表１６の一例を示す図である。第１モジュール出力表１６の各行は、いずれかのモジュールからの１回の出力に対応する。モジュールの出力は入力に応じて発生するので、第１モジュール出力表１６の各行はモジュールへの１回ずつの呼び出し、すなわち第１モジュール入力表１５の各行に対応する。第１モジュール出力表１６の最初の列である「Ｎｏ．」には、各行の番号が格納される。なお各行の順番と識別が可能であれば、数字以外の識別子を用いてもよい。第１モジュール出力表１６の２番目の列である「出力」には、それぞれの呼び出しにおけるモジュールの出力が格納される。なお出力値がない場合は出力値がないことを示す情報、たとえば「なし」や「−」が記録される。第１モジュール実行部１３は、モジュールを実行してその出力が得られると、第１モジュール出力表１６に新たな行を追加してその出力を追記する。
【００２２】
ただし第１モジュール出力表１６には実行した全てのモジュールの出力が格納される。１つのテーブルに複数のモジュールの出力が格納されてもよいし、モジュールごとに異なるテーブルに出力が格納されてもよい。
【００２３】
（第１出力照合表１７）
図４は、第１出力照合表１７の一例を示す図である。第１出力照合表１７の各行は、モジュールに備えられる各関数の出力が比較が可能であるか否かを示す情報が格納される。第１出力照合表１７の最初の列である「関数」には、関数の識別子が格納される。第１出力照合表１７の第二の列である「出力比較区分」には、その関数の出力の比較を行うか否かを示す情報、たとえば、゛Ｃｏｍｐａｒｅ゛、゛Ｉｇｎｏｒｅ゛、および゛Ｃｏｍｐａｒｅ  ｉｆ  ｅｒｒｏｒ゛のいずれかである。゛Ｃｏｍｐａｒｅ゛は比較の対象であることを表し、゛Ｉｇｎｏｒｅ゛は比較の対象ではないことを表す。また゛Ｃｏｍｐａｒｅ  ｉｆ  ｅｒｒｏｒ゛は、出力がエラーを示す値であった場合にはその内容を比較し、成功した場合には比較しないことを表す。
【００２４】
゛Ｃｏｍｐａｒｅ  ｉｆ  ｅｒｒｏｒ゛が適用される関数は、たとえば次のような関数である。すなわちその関数は、動的にメモリ領域を確保して成功時には正の整数で確保した領域の先頭アドレスを返し、失敗時には負の整数でエラーの種類を返す。この関数を複数のモジュールでそれぞれ実行した場合に、正常に領域が確保できれば両者は異なる値を出力するので比較する意味がない。しかし失敗した場合にはエラーの種類が異なればモジュールに何らかの問題があることがわかる。このように、特定条件下でのみ出力を比較する関数を規定することにより、比較をしない関数を減らすことができ、単純に゛Ｃｏｍｐａｒｅ゛と゛Ｉｇｎｏｒｅ゛の二種類とするよりも、障害の検出できる頻度を増やすことができる。
【００２５】
（第１モジュール管理表１８）
図５は、第１モジュール管理表１８の一例を示す図である。第１モジュール管理表１８の各行には、各モジュールの動作状況が格納される。第１モジュール管理表１８の最初の列である「モジュール」にはモジュールを識別する識別子が格納される。次の列である「動作状況」には、そのモジュールの動作状況が格納される。動作状況は、モジュールが正常であるか何らかの問題があるかを、それぞれ゛ＯＫ゛と゛ＮＧ゛で表している。初期状態では、全てのモジュールは゛ＯＫ゛であり、後で述べるように出力が不一致となり障害があるモジュールが特定され、障害があることが特定されたモジュールは゛ＮＧ゛となる。なお第１モジュール実行部１３は、そのモジュールのうち「動作状況」が゛ＯＫ゛のモジュールを使用して出力を得ることで、障害のないモジュールを使用し続けることができる。
【００２６】
（動作例）
図６は、ＥＣＵ１００の動作例を示す図である。図６（ａ）〜図６（ｄ）はすべて同一の時刻における情報を示しており、図６（ａ）は第１モジュール入力表１５を示す図、図６（ｂ）はＰモジュール４１の出力である第１モジュール出力表１６を示す図、図６（ｃ）はＱモジュール４２の出力である第２モジュール出力表２６を示す図、図６（ｄ）はＲモジュール４３の出力である第１モジュール出力表１６Ａの例を示す図である。なお第１出力照合表１７は、図４に例示したものを使用して説明する。なおＲモジュール４３の出力は第１モジュール出力表１６に含まれるが、ここでは説明のために第１モジュール出力表１６とは独立した第１モジュール出力表１６Ａに格納されるとして説明する。
【００２７】
まず、Ｐモジュール４１およびＱモジュール４２がそれぞれ第１プログラム１１と第２プログラム２１で使用されて動作した。その結果、図６（ａ）の第１モジュール入力表１５に記載されているように、３回のモジュール呼び出しがあり、Ｆｕｎｃｔｉｏｎ  Ａ、Ｆｕｎｃｔｉｏｎ  Ｂ、Ｆｕｎｃｔｉｏｎ  Ｃがこの順で呼ばれた。この際のＰモジュール４１の出力は、図６（ｂ）の第１モジュール出力表１６に示すように、順に、０、１００、−１であった。その一方でＱモジュール４２の出力は、図６（ｃ）の第２モジュール出力表２６に示すように、順に、０、２００、−２であった。
【００２８】
図４に示す第１出力照合表１７によれば、Ｆｕｎｃｔｉｏｎ  Ａは゛Ｃｏｍｐａｒｅ゛なので照合を行うが、Ｐモジュール４１とＱモジュール４２の出力は一致しており問題はない。次のＦｕｎｃｔｉｏｎ  Ｂは゛Ｉｇｎｏｒｅ゛なので照合は行わず、Ｐモジュール４１とＱモジュール４２の出力は一致していないが問題はない。最後のＦｕｎｃｔｉｏｎ  Ｃは゛Ｃｏｍｐａｒｅ  ｉｆ  ｅｒｒｏｒ゛であり、Ｐモジュール４１とＱモジュール４２の出力はいずれも負数であるのでエラーである。
【００２９】
したがってＰモジュール４１とＱモジュール４２の出力を比較する。両者の出力を比較すると、゛−１゛と゛−２゛なので両者は不一致であり、Ｐモジュール４１とＱモジュール４２のいずれかに障害があると判断される。ここでいずれに障害があるかを判断するために、Ｒモジュール４３に対して同様の入力が行われ、図６（ｄ）の第１モジュール出力表１６Ａに示す結果となった。Ｐモジュール４１とＱモジュール４２とでは出力が不一致となったＦｕｎｃｔｉｏｎ  Ｃの出力は、図６（ｄ）ではその結果は゛−２゛である。すなわち、Ｒモジュール４３の出力はＱモジュール４２と一致し、Ｐモジュール４１とは一致しない。多数決により、Ｑモジュール４２およびＲモジュール４３が正常であり、Ｐモジュール４１に障害があることが特定できる。
【００３０】
（フローチャート）
図７および図８は、図６を参照して説明した動作例を実現する第１モジュール実行部１３の動作を表すフローチャートである。図７は障害検出処理、図８は障害特定処理の詳細を示す。なお第２プログラム２１に備えられる第２モジュール実行部２３の動作は、第１プログラム１１の第１モジュール実行部１３の動作とほぼ同様である。以下では両者に共通する点は第１プログラム１１の第１モジュール実行部１３のみを説明する。
【００３１】
第１モジュール実行部１３は、第１アプリケーション１２がモジュールを呼び出すと図７のフローチャートにより動作が表されるプログラムを実行する。第１アプリケーション１２がモジュールを呼び出すと、第１モジュール実行部１３にはモジュールの関数の識別子と入力値とが与えられる。第１モジュール実行部１３は、この識別子および入力値を第１モジュール入力表１５の新たな行に追記する（Ｓ７０１）。次に第１モジュール実行部１３は、第１アプリケーション１２の呼び出しを実行するためのモジュールを選択する（Ｓ７０２）。
【００３２】
モジュールの選択は、第１モジュール実行部１３が備えるモジュールのうち、第１モジュール管理表１８で゛ＯＫ゛であるモジュールから選択する。ただし第１モジュール実行部１３は、第１プログラム１１と第２プログラム２１で動作するモジュールが異なるようにモジュールを選択する。そのためにたとえば、第１モジュール実行部１３はモジュールを昇順に選択し、第２モジュール実行部２３はモジュールを降順に選択する。昇順に選択とは、Ｐモジュール４１を最優先で選択し、Ｐモジュール４１がＮＧの場合はＱモジュール４２を選択し、Ｑモジュール４２もＮＧの場合はＲモジュール４３を選択する選択方法である。降順に選択とは、昇順とは逆の順番に選択する選択方法である。ただしそれぞれのプログラムに備えられていないモジュールは選択できないので、昇順および降順の場合は上述した順番であってそのプログラムに備えられるモジュールを選択する。
【００３３】
第１モジュール実行部１３は、選択したモジュールの関数を実行して出力値を得る（Ｓ７０３）。次に照合を行うために、第２プログラム２１の第２モジュール実行部２３における第２モジュール出力表２６の内容を取得する（Ｓ７０５）。第１モジュール実行部１３は、以下に説明するＳ７０６〜Ｓ７１０の処理を第１モジュール出力表１６に記載された各行について、処理対象とする行（以下、「処理対象行」）を１行ずつ変化させて繰り返し実行する（Ｓ７０５Ａ）。ただし第１アプリケーション１２がモジュールを呼び出すたびに第１モジュール実行部１３が図７に示す全ての動作を行う場合は、出力表には１行しか記載されないのでＳ７０５Ａおよび後述するＳ７１０Ａは存在しないものとして扱ってよい。
【００３４】
第１モジュール実行部１３は、処理対象行における呼び出し関数を特定し、第１出力照合表１７を参照してその関数の出力比較区分を取得し、その出力比較区分が゛Ｉｇｎｏｒｅ゛であるか否かを判断する（Ｓ７０６）。第１モジュール実行部１３は、その出力比較区分が゛Ｉｇｎｏｒｅ゛であると判断する場合（Ｓ７０６：Ｙｅｓ）はＳ７１０Ａに進む。第１モジュール実行部１３は、その出力比較区分が゛Ｉｇｎｏｒｅ゛ではないと判断する場合は（Ｓ７０６：Ｎｏ）、出力比較区分が゛Ｃｏｍｐａｒｅ  ｉｆ  ｅｒｒｏｒ゛であるか否かを判断する（Ｓ７０７）。第１モジュール実行部１３は、その出力比較区分が゛Ｃｏｍｐａｒｅ  ｉｆ  ｅｒｒｏｒ゛であると判断する場合（Ｓ７０７：Ｙｅｓ）はＳ７０８に進む。第１モジュール実行部１３は、その出力比較区分が゛Ｃｏｍｐａｒｅ  ｉｆ  ｅｒｒｏｒ゛ではないと判断する場合（Ｓ７０６：Ｎｏ）はＳ７１０に進む。
【００３５】
第１モジュール実行部１３はＳ７０８では、第１プログラム１１における処理対象行の出力値、および第２プログラム２１における処理対象行の出力値が、両方とも成功を示す値であるか、それとも少なくとも一方は失敗を示す値であるかを判断する。第１モジュール実行部１３は、両方とも成功を示す値であると判断する場合は評価が不要なのでＳ７１０Ａに進み、少なくとも一方は失敗を示す値であると判断する場合はステップＳ７０９に進む。第１モジュール実行部１３はステップＳ７０９では、第１プログラム１１における処理対象行の出力値、および第２プログラム２１における処理対象行の出力値が、両方ともエラーを示す値であるか、片方のみがエラーを示す値であるかを判断する。
【００３６】
第１モジュール実行部１３は両方ともエラーを示す値であると判断する場合は比較のためにステップＳ７１０に進み、片方のみがエラーを示す値であると判断する場合はステップＳ７２０の障害特定処理に進む。ただし障害特定処理の詳細は次の図８を参照して後に説明する。第１モジュール実行部１３はステップＳ７１０では、第１プログラム１１における処理対象行の出力値、および第２プログラム２１における処理対象行の出力値が一致するか否かを判断する。第１モジュール実行部１３は、両者が一致すると判断する場合はステップＳ７１０Ａに進み、両者が一致しないと判断する場合はステップＳ７２０の障害特定処理に進む。
【００３７】
ステップＳ７１０Ａでは、第１モジュール実行部１３は出力表の全ての行を処理対象としたか否かを判断し、処理対象としていない行があると判断する場合はその行を処理対象としてステップＳ７０６に戻る。第１モジュール実行部１３は出力表の全ての行を処理対象としたと判断する場合はステップＳ７１１に進む。第１モジュール実行部１３はステップＳ７１１では、第１モジュール入力表１５および第１モジュール出力表１６に格納されている情報を消去する。これにより、次に図７に示す処理が実行された際に同じ照合が実行されることを避けることができ、次回の照合時間を短縮できる。次に第１モジュール実行部１３は、Ｓ７０３で得た出力値を第１アプリケーション１２に渡し図７に示す処理を終了する（Ｓ７１２）。
【００３８】
図８は、障害特定処理の詳細を示すフローチャートである。図８のフローチャートで示す処理は、図７のステップＳ７０９またはステップＳ７１０において否定判定されると実行される。図８ではまず、第１モジュール実行部１３は、第１モジュール管理表１８から゛ＯＫ゛となっているモジュールであって、自身が使用したモジュールおよびＳ７０５によって得た出力を行ったモジュール以外のモジュールを選択する（Ｓ８０１）。Ｓ７０５によって得た出力を行ったモジュールの特定は、第２プログラム２１から通信で取得してもよいし、予め知得した第２モジュール実行部２３におけるモジュールの選択方法により特定してもよい。Ｓ８０１において選択したモジュールを以下では代替モジュールと呼ぶ。第１モジュール実行部１３は、図７に示す処理において出力が不一致となった関数について、第１モジュール入力表１５に記載されている入力値を代替モジュールに入力し、その出力値を得る（Ｓ８０２）。
【００３９】
そして第１モジュール実行部１３は、その出力値をこれまでの２つと比較する（Ｓ８０３）。第１モジュール実行部１３は、代替モジュールの出力が図７のＳ７１０において比較した２つのいずれかの出力値と一致するか否かを判断する（Ｓ８０４）。第１モジュール実行部１３は、いずれかと一致すると判断する場合（Ｓ８０４：Ｙｅｓ）は、一致しない方の出力を行ったモジュールに障害があると特定し、そのモジュールを第１モジュール管理表１８で゛ＮＧ゛とする（Ｓ８０５）。そして第１モジュール実行部１３は、Ｓ７１１と同様に第１モジュール入力表１５と第１モジュール出力表１６の内容をクリアする（Ｓ８０６）。さらに第１モジュール実行部１３は、多数派の出力値、すなわち、代替モジュールの出力値を第１アプリケーション１２に出力して（Ｓ８０７）図８に示す処理を終了する。
【００４０】
第１モジュール実行部１３は、Ｓ８０４においてモジュール３つの出力が全て一致しないと判断する場合（Ｓ８０４：Ｎｏ）は、全てのモジュールに障害がある可能性を考慮して障害時の処理へと移行する（Ｓ８１１）。障害時の処理とはたとえば、縮退運転など機能を制限して安全を確保する処理である。ただしＳ８１１に到達するケースは２つ以上のモジュールが同じ問題、たとえばバグを有しているなどのケースであり、発生確率は極めて低い。
【００４１】
（動作の説明）
第１プログラム１１および第２プログラム２１は、同じ動作を行うアプリケーションがそれぞれ動作している。このため、第１プログラム１１および第２プログラム２１の動作は、モジュールにバグなどの障害がなければ、同じ動作を行う。また図１に示すように、第１プログラム１１および第２プログラム２１に備えられるモジュールは、それぞれＰモジュール４１とＲモジュール４３、Ｑモジュール４２とＲモジュール４３である。第１プログラム１１はＰモジュール４１を優先し、第２プログラム２１はＱモジュール４２を優先して選択するので、第１プログラム１１と第２プログラム２１はそれぞれ、同じ入力を異なるモジュールに入力する。したがってこれらの出力は同じ値になることが期待され、これを第１モジュール実行部１３が照合する。両者が不一致である場合には、いずれかのモジュールに障害があることがわかるため、障害を有するモジュールの出力を第１アプリケーション１２がそのまま使用することを防ぐことができる。
【００４２】
さらに両者が不一致の場合には、第１モジュール実行部１３が代替モジュールとして前述の例でいえばＲモジュール４３を選択し、第１モジュール実行部１３はＲモジュール４３の実行によって第３の出力値を得る。第１モジュール実行部１３は、Ｐモジュール４１、Ｑモジュール４２、およびＲモジュール４３の３つの値を比較し多数決により正しい出力を決定する。そして第１モジュール実行部１３は、多数決における少数派に属する出力値を出力したモジュールが障害を有するモジュールと判断し、第１モジュール管理表１８のそのモジュールの動作状況に゛ＮＧ゛を記録する。
【００４３】
第１アプリケーション１２は前述の多数決による多数派の値を用いて動作を継続する。そして第１モジュール実行部１３は、たとえばＰモジュール４１に障害があることが特定されたとすると、以降のモジュールの呼び出しではＲモジュール４３を使用する。これにより、いずれかのモジュールに障害があることが判明した後でも、二つのモジュールによる照合を継続することができ、第１アプリケーション１２が誤ったモジュールの出力に基づく動作を防止することができる。すなわち、一つのモジュールが障害を有していても処理を継続できる効果と、２種類のモジュールの出力の照合による安全性の担保の効果の両方を得ることができる。
【００４４】
さらに、ＥＣＵ１００における計算資源の利用は、機能の実現を行う第１アプリケーション１２が大半であり、モジュールによる使用は少ない。上述したようにＥＣＵ１００は、モジュールの出力を比較するので、第１アプリケーション１２の出力を比較する場合に比べてＣＰＵ１１０の演算資源およびメモリ１２０の記憶資源の消費を削減することができる。さらにＥＣＵ１００は、障害特定処理が実行されるまでは２種のモジュールしか実行しないことから、同様に演算資源の利用も削減することができる。
【００４５】
上述した第１の実施の形態によれば、次の作用効果が得られる。
（１）ＥＣＵ１００は、同一の機能を有し異なる実装がなされたＰモジュール４１、Ｑモジュール４２、およびＲモジュール４３が格納されるメモリ１２０と、Ｐモジュール４１、Ｑモジュール４２、およびＲモジュール４３を実行するＣＰＵ１１０と、ＣＰＵ１１０によるＰモジュール４１の出力およびＱモジュール４２の出力に基づき障害を検出する第１モジュール実行部１３および第２モジュール実行部２３（図７のＳ７０６〜Ｓ７１０）と、を備える。ＥＣＵ１００はさらに、図７に示す障害検出処理により障害が検出されるとＲモジュール４３の使用を開始し、Ｐモジュール４１の出力と、Ｑモジュール４２の出力と、Ｒモジュール４３の出力と、に基づき障害のあるソフトウェアモジュールを特定する第１モジュール実行部１３および第２モジュール実行部２３（図８のＳ８０４）と、を備える。すなわちＥＣＵ１００は、３つのモジュールを備えるが障害が検出されるまではそのうち２つのモジュールしか使用せず、障害が検出されて障害のあるモジュールを特定するために３つ目のモジュールを使用する。そのためＥＣＵ１００は、限られた演算資源を用いて障害の検出および障害の特定を実現することができる。
【００４６】
（２）ＥＣＵ１００は、障害があることが特定されたソフトウェアモジュールの使用を停止する（図８のＳ８０４〜Ｓ８０５）。そのためＥＣＵ１００は、障害のないソフトウェアモジュールを用いて動作を継続することができる。
【００４７】
（３）ＥＣＵ１００は、第１モジュール実行部１３がＰモジュール４１およびＱモジュール４２のいずれか一方を障害があるソフトウェアモジュールとして特定すると（図８のＳ８０４：Ｙｅｓ、Ｓ８０５）、Ｐモジュール４１およびＱモジュール４２のうち障害があることが特定されていないソフトウェアモジュール、およびＲモジュール４３の出力に基づき障害を検出する（図７のＳ７０２）。
【００４８】
（４）Ｐモジュール４１、Ｑモジュール４２、およびＲモジュール４３には、３２ビットＣＰＵ用のソフトウェアモジュールと、６４ビットＣＰＵ用のソフトウェアモジュールとが含まれる。幅広い環境での実行を可能とすべく、換言すると複数種類のＣＰＵに対応する目的でライブラリが３２ビットＣＰＵ用と６４ビットＣＰＵ用のそれぞれについて作成されることが多い。それらを利用することにより、独自の実装を行ったライブラリを１つ作成することで上述した第１の実施の形態を実施することができる。
【００４９】
（５）Ｐモジュール４１およびＱモジュール４２は、異なるＣＰＵコアで並列に実行される。そのため迅速にＰモジュール４１およびＱモジュール４２の出力を得て迅速に障害の有無を判断することができる。
【００５０】
（６）Ｐモジュール４１、Ｑモジュール４２、およびＲモジュール４３のそれぞれには複数の関数が含まれる。複数の関数のそれぞれについて障害検出処理のＳ７０６およびＳ７０７の動作を規定する第１出力照合表１７を備える。第１モジュール実行部１３は、第１出力照合表１７を参照して関数ごとに障害検出の条件を判断する。そのためＥＣＵ１００は、正常な動作が行われても出力値が一定ではない関数、たとえば動的にメモリ領域を確保し、確保した領域の先頭アドレスを返す関数などを含むソフトウェアモジュールにも対応することができる。
【００５１】
（変形例１）
図７においては、常に出力の照合を行うこととしたが、照合をモジュールの呼び出しのたびに行わないとしてもよい。たとえば、モジュールの呼び出しが一定の回数、たとえば３回ごとに照合を行ってもよい。この場合には、カウンタを利用して呼び出し回数を計数し、３の倍数となった場合にのみ照合を行う。また一定の時間、たとえば１０ｍｓごとに照合を行ってもよい。この場合には、時間を計測するタイマデバイスなどを利用して、前回の照合から１０ｍｓ以上経過した場合に照合を行う。照合を行わなかった場合には、そのモジュールの呼び出しの入力と出力は、第１モジュール入力表１５と第１モジュール出力表１６に追記される。
【００５２】
この場合はクリア処理（Ｓ７１１）を行わないので、まとめて照合を後で行うことができる。第１アプリケーション１２には得たモジュールの出力をそのまま渡せばよい。これにより、以下のような効果が得られる。照合処理は、毎回行うとその照合処理の時間によって、第１アプリケーション１２の制御処理に影響がある可能性がある。そこで何らかの基準にしたがい、まとめて照合処理を行うことによってその影響を低減できる。さらに周期処理の待ち時間など影響の少ないタイミングで照合処理を行うことも可能となる。なおまとめて照合を行う場合には、アプリケーションには間違った値がすでに出力された可能性がある。したがって障害が検出された場合には、障害が検出されたモジュールを利用したアプリケーションは、他方の正常であるアプリケーションの状態を引き継いで実行を継続させるなどの対処が必要である。
【００５３】
（変形例２）
図７および図８に示すフローチャートでは、障害が特定された後でもモジュール選択を行い二重系を維持するものとした。しかし障害が特定された場合は、障害が検出されたモジュールを利用したアプリケーションを停止させ、以降は他方のアプリケーションのみ動作を継続させてもよい。本変形例は、障害が検出されたモジュールを利用したアプリケーションに対して他方の正常であるアプリケーションの状態を引き継いで実行を継続させることが困難な場合に特に有効である。すなわち本変形は、再起動や修復までの一時的な処理として有用である。
【００５４】
（変形例３）
上述した実施の形態では、第１プログラム１１および第２プログラム２１の両方が図８のフローチャートで示す処理を実行していた。しかし第１プログラム１１と第２プログラム２１がそれぞれ代替モジュールとして選択するモジュールが同一、たとえば上述のようにＲモジュール４３であるときには、片方の処理のみで十分である。したがって、代替モジュールの実行と比較処理（Ｓ８０１〜Ｓ８０４）は、いずれか片方のプログラムのモジュール実行部のみが行い、その結果を他方のモジュール実行部に伝達してもよい。本変形例によれば、照合処理を行わない他方のプログラムあるいはＣＰＵコアにおいては、その間別の処理を実行することができ、ＣＰＵの利用効率を向上させることができる。
【００５５】
（変形例４）
ＥＣＵ１００は、Ｐモジュール４１、Ｑモジュール４２、およびＲモジュール４３の３つのモジュールを有したが、４種類以上のモジュールを有してもよい。たとえば、第１プログラム１１はＰモジュール４１とＲモジュール４３、第２プログラム２１はＱモジュール４２とＺモジュールを有してもよい。この場合は障害特定の処理において、第１プログラム１１の第１モジュール実行部１３はＲモジュール４３、第２プログラム２１はＺモジュールを実行する。
【００５６】
なおモジュールが偶数個なので２：２になり多数決ができない場合には、奇数個のモジュールを追加して、それぞれのモジュール実行部で複数個のモジュールを実行してもよい。本変形例によれば、より多くの種類のモジュールを利用することで、障害の確率をさらに下げることができる。また同一の機能を有し実装が異なるＮ種類のモジュールを用いることにより、Ｎ−２個のモジュールに障害が発生するまで第１の実施の形態において説明した動作、すなわち障害検出処理および障害特定処理を継続することができる。これによって、動作の継続性や可用性を向上させる効果が得られる。
【００５７】
（変形例５）
第１出力照合表１７の「出力比較区分」は、図４において゛Ｃｏｍｐａｒｅ゛、゛Ｉｇｎｏｒｅ゛、゛Ｃｏｍｐａｒｅ  ｉｆ  ｅｒｒｏｒ゛の３種類のみを示した。しかし「出力比較区分」はこれに限定されない。たとえば、エラーの種類は問わず成功時のみ比較する区分を設けてもよいし、エラーと成功のどちらかであったかのみを比較する区分を設けてもよい。さらに出力値の一部、たとえば上位３ビットや下位１ビットのみ比較する区分を設けてもよい。本変形例によれば、利用するモジュールの仕様にあわせて区分を作成することで、障害判定の精度を向上させ、迅速な障害の検出が行うことができる。
【００５８】
（変形例６）
上述した実施の形態では、第１プログラム１１および第２プログラム２１は、それぞれ１つのアプリケーションのみを備えた。しかし各プログラムがモジュールを使用するアプリケーションを複数備えてもよい。この場合は、第１モジュール入力表１５には、呼び出し元のアプリケーションを識別する列が追加され、呼び出し元のアプリケーションと呼び出された関数との関係を示す情報が格納される。本変形例によれば、モジュールが複数のアプリケーションから共有して利用される場合でも、上述した実施の形態における効果を得ることができる。
【００５９】
（変形例７）
上述した実施の形態では、ソフトウェアモジュールであるＰモジュール４１やＲモジュール４３は、第１アプリケーション１２と異なるものとして説明した。しかしソフトウェアモジュールは静的にリンクされるライブラリであり、第１アプリケーション１２に予め組み込まれてもよい。この場合は、たとえばＰモジュール４１への入力およびＰモジュール４１からの出力は、第１アプリケーション１２の内部で実行される。
【００６０】
（変形例８）
図８のＳ８０１において、代替モジュールは以下のように選択された。第１モジュール実行部１３は、第１モジュール管理表１８において動作状況が゛ＯＫ゛であるモジュールであって、自身が使用したモジュールおよびＳ７０５によって得た出力を行ったモジュール以外のモジュールを選択した。すなわちＳ８０１では第１モジュール実行部１３および第２モジュール実行部２３のいずれでも使われなかったモジュールを選択した。しかし自身が実行していない方のモジュール、すなわちＳ７０５によって得た出力を行ったモジュールもさらに実行してもよい。
【００６１】
本変形例によれば、次の作用効果が得られる。
（７）ＣＰＵ１１０は、第１ＣＰＵコア１１１および第２ＣＰＵコア１１２を備える。障害特定部は、第１ＣＰＵコア１１１が演算したＰモジュール４１の出力と、第２ＣＰＵコア１１２が演算したＱモジュール４２の出力とが一致しない場合に、第２ＣＰＵコア１１２が演算したＰモジュール４１の出力と、第１ＣＰＵコア１１１が演算したＱモジュール４２の出力とを用いて、第１ＣＰＵコア１１１または第２ＣＰＵコア１１２に障害があることを特定する。
【００６２】
そのため本変形例ではハードウエア障害にも対応することができる。たとえば第１プログラム１１が実行したＰモジュール４１の出力値を出力値Ａ、第２プログラム２１が実行したＱモジュール４２の出力値を出力値Ｂ１、第１プログラム１１が実行したＱモジュール４２の出力値を出力値Ｂ２、第１プログラム１１が実行した代替モジュールであるＲモジュール４３の出力値を出力値Ｃとする。このときＥＣＵ１００は、出力値Ｂ１と出力値Ｂ２とを比較することにより、出力値Ａと出力値Ｂ１の不一致が、出力値Ｂ１を実行したＣＰＵコア等のハードウェア障害によるものかを判定することができる。
【００６３】
（変形例９）
図７のＳ７０２におけるモジュールの選択は、あらかじめ設定された優先度に基づいて行われてもよい。この場合はたとえば、第１モジュール管理表１８のそれぞれの行に優先度が設定される。そして第１モジュール実行部１３は、動作状況が゛ＯＫ゛であるモジュールであって優先度が最も高いモジュールを選択する。第２モジュール管理表２８および第２モジュール実行部２３も同様である。
【００６４】
（変形例１０）
第１ＣＰＵコア１１１および第２ＣＰＵコア１１２は、ＣＰＵコア間の通信を行う代わりに、必要な情報が格納されているメモリ１２０の領域を読み込んでもよい。ただしこの場合は、他方のＣＰＵコアもモジュールの出力を得ていることを確認する必要がある。この確認は、同期的な通信を用いる場合には明らかであるし、第１モジュール出力表１６に記録されている行数を検査することで行ってもよい。なお他方のＣＰＵコアがモジュールの出力を得ていない場合には、他方のＣＰＵコアがモジュールの出力を得るまで待機する。
【００６５】
（変形例１１）
上述した複数のモジュールは、同一のアーキテクチャを対象とした同一の機能を有する異なるバージョンや異なるリビジョンのライブラリであってもよい。バージョンやリビジョンの違いにより、実装が異なる場合があるからである。
さらに上述した複数のモジュールは、全ての機能が同一でなくてもよく、プアプリケーションから使用される関数を含んでいれば、その他の関数を含んでいてもよい。たとえばアプリケーションがモジュールに備えられる関数Ａ，関数Ｂ、関数Ｃを呼び出す場合に、あるモジュールは関数Ａ〜Ｃのみを備え、他のモジュールは関数Ａ〜Ｃに加えて関数Ｄをさらに備えてもよい。
【００６６】
―第２の実施の形態―
図９〜図１０を参照して、制御装置であるＥＣＵの第２の実施の形態を説明する。以下の説明では、第１の実施の形態と同じ構成要素には同じ符号を付して相違点を主に説明する。特に説明しない点については、第１の実施の形態と同じである。本実施の形態では、主に、ＣＰＵコアを１つのみ備える点で、第１の実施の形態と異なる。
【００６７】
図９は、第２の実施の形態におけるＥＣＵ１００Ａの構成を表すブロック図である。
図９において、ＥＣＵ１００ＡのＣＰＵ１１０Ａは、第１ＣＰＵコア１１１を有する。第１ＣＰＵコア１１１は、第１プログラム１１を動作させる。第１プログラム１１の第１モジュール実行部１３Ｂは、Ｐモジュール４１、Ｑモジュール４２、およびＲモジュール４３の３つのモジュールを動作させる。
【００６８】
図１０は、第２の実施の形態における第１モジュール実行部１３Ｂの動作を表すフローチャートである。図１０では第１の実施の形態における図７と同一の処理には同一のステップ番号を付す。すなわち図７との相違点は、Ｓ７０２の代わりにＳ７０２Ａを実行する点、Ｓ７０３の代わりにＳ７０３Ａを実行する点、およびＳ７０５を実行しない点である。その他のステップは図７と同様なので説明を省略する。
【００６９】
Ｓ７０１を実行すると第１モジュール実行部１３Ｂは、第１アプリケーション１２の呼び出しを実行するためのモジュールを２つ選択する（Ｓ７０２Ａ）。この選択方法は第１の実施の形態と同様である。そして第１モジュール実行部１３Ｂは、選択したそれぞれのモジュールの関数を実行して出力値を得る（Ｓ７０３Ａ）。これ以後の処理は第１の実施の形態と同様なので説明を省略する。
【００７０】
本実施の形態では、第１ＣＰＵコア１１１上で第１アプリケーション１２がモジュールを呼び出すと、第１モジュール実行部１３はＰモジュール４１とＱモジュール４２とを用いて計算を実行し、その出力値を比較する。すなわち、第１の実施形態では第１プログラム１１と第２プログラム２１とで別々に行っていたモジュールの実行を１つのプログラム内で行うものである。したがって、障害検出のために行う処理としては、２つの異なるモジュールに対して同じ入力を与えてその出力を比較する処理という点では、第１の実施の形態と同様である。また障害を特定するために代替モジュールを選択して実行しその出力を得る点も第１の実施の形態と同様である。さらに、代替モジュールの実行および比較を行うプログラムが１つである点は、第１の実施の形態における変形例３と同様である。すなわち本実施の形態でも、第１の実施形態と同様の障害の検出と特定が可能である。
【００７１】
本実施の形態を第１の実施の形態と比較すると、モジュール呼び出しのたびに、１つのＣＰＵコアで２つのモジュールを実行するために、障害検出のために必要な１つのＣＰＵコアあたりの演算資源は増加する。しかし本実施の形態では複数のＣＰＵコアを必要としないため、ＥＣＵ１００上で必要なＣＰＵコアの数は減らすことができる。そのためＥＣＵ１００のコストの削減効果、または使用しなくなるＣＰＵコアで別の処理を行うことで、効率を増加させる効果が得られる。なお、本実施形態においても、第１の実施形態で挙げた変形例は同様に適用可能である。
【００７２】
―第３の実施の形態―
図１１〜図１２を参照して、制御装置であるＥＣＵの第３の実施の形態を説明する。以下の説明では、第１の実施の形態と同じ構成要素には同じ符号を付して相違点を主に説明する。特に説明しない点については、第１の実施の形態と同じである。本実施の形態では、主に、障害の特定に別のＥＣＵを用いる点で、第１の実施の形態と異なる。
【００７３】
図１１は、第３の実施の形態における制御システムＳの構成を表すブロック図である。制御システムＳは、第１ＥＣＵ１００１と、第２ＥＣＵ１００２と、代替実行ＥＣＵ１００３とを備える。第１ＥＣＵ１００１、第２ＥＣＵ１００２、および代替実行ＥＣＵ１００３はそれぞれ、第１ネットワークインタフェース１１９、第２ネットワークインタフェース２１９、および第３ネットワークインタフェース１１１０を備え、ネットワークＸを介して相互に通信ができる。ネットワークＸの物理的な特性、およびネットワークＸにおいて使用される通信プロトコルは特に制限されない。ネットワークＸはたとえば、ＣＡＮ（Ｃａｒ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）またはＩＥＥＥ８０２．３に対応する。
【００７４】
第１ＥＣＵ１００１は、ＣＰＵ１１０と、メモリ１２０とを備える。第２ＥＣＵ１００２は、ＣＰＵ２１０と、メモリ２２０とを備える。代替実行ＥＣＵ１００３は、ＣＰＵ３１０とメモリ３２０とを備える。ＣＰＵ１１０、ＣＰＵ２１０、およびＣＰＵ３１０のハードウエア構成は第１の実施の形態におけるＣＰＵ１１０と同様である。図１１に示すように、Ｐモジュール４１は第１ＥＣＵ１００１に格納され、Ｑモジュール４２は第２ＥＣＵ１００２に格納され、Ｒモジュール４３は代替実行ＥＣＵ１００３に格納される。第１モジュール実行部１３Ｃは、第１の実施の形態における第１モジュール実行部１３に相当するが、Ｒモジュール４３を備えない点が第１モジュール実行部１３と異なる。第２モジュール実行部２３Ｃは、第１の実施の形態における第２モジュール実行部２３に相当するが、Ｒモジュール４３を備えない点が第２モジュール実行部２３と異なる。
【００７５】
第１ＥＣＵ１００１のＣＰＵ１１０に内蔵される第１ＣＰＵコア１１１は、第１の実施の形態における第１ＣＰＵコア１１１と同様の動作を行う。ただし本実施の形態では、第２ＣＰＵコア１１２との通信はネットワークＸを介して行われる点が第１の実施の形態と異なる。また第１ＥＣＵ１００１の第１モジュール実行部１３Ｃは、Ｒモジュール４３を自ら実行せずに代替実行ＥＣＵ１００３から実行結果を取得する。
【００７６】
第２ＥＣＵ１００２のＣＰＵ２１０に内蔵される第２ＣＰＵコア１１２は、第１の実施の形態における第２ＣＰＵコア１１２と同様の動作を行う。ただし本実施の形態では、第１ＣＰＵコア１１１との通信はネットワークＸを介して行われる点が第１の実施の形態と異なる。また第２ＥＣＵ１００２の第２モジュール実行部２３Ｃは、Ｒモジュール４３を自ら実行せずに代替実行ＥＣＵ１００３から実行結果を取得する。
【００７７】
代替実行ＥＣＵ１００３は、障害検出時に障害のあるモジュールを特定するためにＲモジュール４３を実行する。代替実行ＥＣＵ１００３は、障害の特定を行う代替モジュール実行部１１４０をメモリ３２０に備える。代替モジュール実行部１１４０はＣＰＵコア１１５１により実行される。代替モジュール実行部１１４０は、障害特定のためのＲモジュール４３と、モジュール入力受信部１１４１と、モジュール出力送信部１１４２とを備える。モジュール入力受信部１１４１は、第３ネットワークインタフェース１１１０を介して、モジュールの関数を実行するための入力を受信する。モジュール出力送信部１１４２は、第３ネットワークインタフェース１１１０を介して、モジュールの関数を実行した出力を送信する。
【００７８】
代替モジュール実行部１１４０は、第１ＥＣＵ１００１または第２ＥＣＵ１００２から入力値を受信すると、Ｒモジュール４３にその入力値を入力する。そして代替モジュール実行部１１４０は得られた演算結果を入力値の送信元に送信する。
【００７９】
図１２は、本実施形態における第１モジュール実行部１３Ｃおよび第２モジュール実行部２３Ｃにおける障害特定処理を示すフローチャートである。図１２では第１の実施の形態における図８と同一の処理には同一のステップ番号を付す。すなわち図８との相違点は、Ｓ８０１の代わりにＳ１２０１を実行する点、Ｓ８０２の代わりにＳ１２０２を実行する点である。その他のステップは図８と同様なので説明を省略する。以下では第１モジュール実行部１３Ｃおよび第２モジュール実行部２３Ｃを代表して第１モジュール実行部１３Ｃの動作を説明する。
【００８０】
第１モジュール実行部１３Ｃは、障害特定処理を開始すると、代替実行ＥＣＵ１１３０に入力値を送信する（Ｓ１２０１）。そして第１モジュール実行部１３Ｃは、代替実行ＥＣＵ１１３０から代替モジュール実行部１１４０によるＲモジュール４３を用いた演算結果を受信する（Ｓ１２０２）。その他のステップは図８と同様なので説明を省略する。
【００８１】
上述した第３の実施の形態によれば、各モジュールを実行するＥＣＵが異なる場合でも、第１の実施の形態と同様に障害の検出と特定が可能である。
【００８２】
（第３の実施の形態の変形例１）
上述した第３の実施の形態では、第１プログラム１１および第２プログラム２１が異なるＥＣＵにおいて実行された。しかし第１の実施形態におけるＥＣＵ１００と同様に、同一ＥＣＵの異なるＣＰＵコアにおいて実行してもよい。この場合は、障害検出の処理は第１の実施例と同じであり、障害特定の処理のみが第３の実施の形態で示した処理となる。これによって、必要なＥＣＵの数を削減することができる。
【００８３】
（第３の実施の形態の変形例２）
第１プログラム１１および第２プログラム２１が同一ＥＣＵの異なるＣＰＵコアにおいて実行され、さらに同一のＥＣＵが、代替モジュール実行部１１４０を実行する第３のＣＰＵコアを備えてもよい。この場合は、ネットワークインタフェース１１１０および通信ネットワークバス１１２０は、同一ＥＣＵ内のコア間通信を行うものとして実現できる。これによって、必要なＥＣＵの数を１つとすることができる。
【００８４】
（第３の実施の形態の変形例３）
上述した第３の実施の形態では、第１ＥＣＵ１１０１および第２ＥＣＵ１１０２を一組のみ示した。しかし同様の処理を行うＥＣＵの組が複数存在してもよい。そしてこれらのＥＣＵの組において、代替実行ＥＣＵ１１３０を共有してもよい。代替実行ＥＣＵ１１３０は、障害が検出されたときのみ動作するため、代替実行ＥＣＵ１１３０の稼働率は低い。そのため複数組のＥＣＵからの要求に応じて処理を実行することで、代替実行ＥＣＵ１１３０の稼働率を向上させることができる。
【００８５】
またこの場合に、複数組のＥＣＵはそれぞれ同一のモジュールを使用してもよいし、異なるモジュールを使用してもよい。たとえば機能Ａを有するモジュールＳ，モジュールＴ，モジュールＵ、および機能Ｂを有するモジュールＶ，モジュールＷ、モジュールＸが存在し、モジュールＳ，モジュールＴ，モジュールＶ，およびモジュールＷをそれぞれ異なるＥＣＵに格納される場合を想定する。この場合に、代替実行ＥＣＵ１１３０がモジュールＸおよびモジュールＷを備え、モジュールＳ，モジュールＴ，モジュールＶ，およびモジュールＷを備える各ＥＣＵから入力される入力値に応じてモジュールＸまたはモジュールＷの算出結果を各ＥＣＵに送信すると以下の効果が得られる。すなわち、必要な代替実行ＥＣＵの数を削減することができる。
【００８６】
（第３の実施の形態の変形例４）
上述した第３の実施の形態の変形例３において、代替実行ＥＣＵ１１３０は複数あってもよい。さらに、いずれかのプログラムを実行するＥＣＵが、代替実行ＥＣＵ１１３０としての機能を兼ね備えてもよい。これにより、変形例３の場合と比較して、障害特定ＥＣＵ一つが故障しても障害特定の機能を他のＥＣＵによって継続することができる。
【００８７】
プログラムを実行するＥＣＵが代替実行ＥＣＵ１１３０としての機能を兼ね備える場合はさらに、それぞれの代替実行ＥＣＵ１１３０は他の代替実行ＥＣＵ１１３０における処理負荷の大きさと障害状況を監視する機能を有してもよい。この場合は代替モジュール実行部１１４０は、ＣＰＵ３１０の現在の計算負荷の大きさ、およびＲモジュール４３を用いた演算処理を行っているか否かを示す情報を周囲の装置に送信する機能を有する。第１モジュール実行部１３Ｃおよび第２モジュール実行部２３Ｃは、それぞれの代替実行ＥＣＵ１１３０から受信した情報に基づきＲモジュール４３を用いた演算を実行させる代替実行ＥＣＵ１１３０を決定する。具体的には第１モジュール実行部１３Ｃおよび第２モジュール実行部２３Ｃは、Ｒモジュール４３を用いた演算を行っておらず、かつＣＰＵ３１０の現在の計算負荷が最も低い代替実行ＥＣＵ１１３０を特定し、その代替実行ＥＣＵ１１３０にＲモジュール４３を用いた演算を実行させる。
【００８８】
本変形例によれば、次の作用効果が得られる。
（８）第１ＥＣＵ１００１は、他の演算装置と通信を行う第１ネットワークインタフェース１１９と、現在の計算負荷の大きさを通信部を介して他の演算装置に出力する代替モジュール実行部１１４０とを備える。第１モジュール実行部１３Ｃは、受信した現在の計算負荷に基づき第３のソフトウェアモジュールの出力を算出させる代替実行ＥＣＵ１００３を決定する。そのため複数の代替実行ＥＣＵ１００３の負荷を平準化することができる。
【００８９】
（第３の実施の形態の変形例５）
上述した第３の実施の形態では、障害特定処理は、第１ＥＣＵ１００１の第１モジュール実行部１３Ｃ、または第２ＥＣＵ１００２の第２モジュール実行部２３Ｃにおいて実行された。しかし障害特定処理は、代替モジュール実行部１１４０において実行されてもよい。この場合に代替実行ＥＣＵ１００３は、第１ＥＣＵ１００１および第２ＥＣＵ１００２において実行されたモジュールの出力値も取得する。代替モジュール実行部１１４０における障害特定処理は、図１２におけるＳ８０３，Ｓ８０４と同様である。代替モジュール実行部１１４０は、障害が特定されたモジュールを示す情報を各ＥＣＵに送信する。第１モジュール実行部１３Ｃおよび第２モジュール実行部２３Ｃはその情報を受信し、Ｓ８０５以降の処理を実行する。本変形例によれば、第１ＥＣＵ１００１および第２ＥＣＵ１００２の第１モジュール実行部１３Ｃおよび第２モジュール実行部２３Ｃの処理負荷と代替モジュール実行部１１４０の処理負荷のバランスをとることができる。
【００９０】
上述した実施の形態、および変形例では各ＣＰＵコアが１つのプログラムを動作させるとしたが、それぞれのＣＰＵコアが複数のプログラムを動作していてもよいし、複数のＣＰＵコアが一つのプログラムを共有してもよい。この場合、それぞれのＣＰＵコアが実行するコードの一部または全部や、ＣＰＵコアが使用するデータの一部または全部が異なり、異なるコードとデータが必要なだけ格納されている構成であってもよい。また、ＣＰＵ１１０が実行するコードや読み込みのみ行うデータなどを不揮発性のメモリに配置し、読み書きするデータを揮発性のメモリに格納する構成であってもよい。
【００９１】
上述した各実施の形態および変形例は、それぞれ組み合わせてもよい。上記では、種々の実施の形態および変形例を説明したが、本発明はこれらの内容に限定されるものではない。本発明の技術的思想の範囲内で考えられるその他の態様も本発明の範囲内に含まれる。
【符号の説明】
【００９２】
３…モジュール
１１…第１プログラム
１２…第１アプリケーション
１３、１３Ｂ，１３Ｃ…第１モジュール実行部
１５…第１モジュール入力表
１６…第１モジュール出力表
１７…第１出力照合表
１８…第１モジュール管理表
２１…第２プログラム
２２…第２アプリケーション
２３、２３Ｃ…第２モジュール実行部
２５…第２モジュール入力表
２６…第２モジュール出力表
２７…第２出力照合表
２８…第２モジュール管理表
４１…Ｐモジュール
４２…Ｑモジュール
４３…Ｒモジュール
１１０…ＣＰＵ
１１１…第１ＣＰＵコア
１１２…第２ＣＰＵコア
【図１】
2019020864.tif 000003
【図２】
2019020864.tif 000004
【図３】
2019020864.tif 000005
【図４】
2019020864.tif 000006
【図５】
2019020864.tif 000007
【図６】
2019020864.tif 000008
【図７】
2019020864.tif 000009
【図８】
2019020864.tif 000010
【図９】
2019020864.tif 000011
【図１０】
2019020864.tif 000012
【図１１】
2019020864.tif 000013
【図１２】
2019020864.tif 000014