(57)【要約】【課題】本発明は、動作環境のバグかあるいはコンパイラのバグかを判別することができる情報処理装置を提供することを課題とする。【解決手段】第１動作環境４１及び第２動作環境４２と、異なるコンパイラ２１，２２によってそれぞれ変換された第１アプリ３１及び第２アプリ３２を有する情報処理装置１であって、第１動作環境４１ではアプリ３１，３２が実行され、第２動作環境４２ではアプリ３１，３２が実行され、処理結果比較手段６１は、第１動作環境４１上でのアプリ３１，３２と第２動作環境４２上でのアプリ３１，３２に同一のデータがそれぞれ入力された場合、第１アプリ３１が実行される第１動作環境４１での処理結果と、第２アプリ３２が実行される第１動作環境４１での処理結果と、第１アプリ３１が実行される第２動作環境４２での処理結果と、第２アプリ３２が実行される第２動作環境４２での処理結果とを比較することを特徴とする。【選択図】図１
2010282551.tif 000002
【特許請求の範囲】
【請求項１】
同一のデータが入力されると異なる処理過程を経て同一の処理結果を出力する第１動作環境及び第２動作環境と、前記動作環境上で実行された場合に同一のデータが入力されると異なる処理過程を経て同一の処理結果データを動作環境に出力する第１アプリケーション及び第２アプリケーションを有する情報処理装置であって、
前記第１動作環境では、前記第１アプリケーション及び前記第２アプリケーションが実行され、
前記第２動作環境では、少なくとも前記第１アプリケーションが実行され、
前記第１動作環境上で実行される前記第１アプリケーション及び前記第２アプリケーションと前記第２動作環境上で実行される前記第１アプリケーションに同一のデータがそれぞれ入力された場合、前記第１アプリケーションが実行される前記第１動作環境での処理結果と、前記第２アプリケーションが実行される前記第１動作環境での処理結果と、前記第１アプリケーションが実行される前記第２動作環境での処理結果とを比較する処理結果比較手段を備えることを特徴とする情報処理装置。
【請求項２】
前記第２動作環境では、前記第１アプリケーション及び前記第２アプリケーションが実行され、
前記処理結果比較手段は、前記第１動作環境上で実行される前記第１アプリケーション及び前記第２アプリケーションと前記第２動作環境上で実行される前記第１アプリケーション及び前記第２アプリケーションに同一のデータがそれぞれ入力された場合、前記第１アプリケーションが実行される前記第１動作環境での処理結果と、前記第２アプリケーションが実行される前記第１動作環境での処理結果と、前記第１アプリケーションが実行される前記第２動作環境での処理結果と、前記第２アプリケーションが実行される前記第２動作環境での処理結果とを比較することを特徴とする請求項１に記載する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置に関する。
【背景技術】
【０００２】
高い信頼性が要求される制御システムには、ハードウエアのＣＰＵ[Central Processing Unit]が故障した場合に誤った演算値による不具合を防止するために、２個のＣＰＵを備えるものがある。また、制御システムにはＯＳ[Operating System]が搭載されるものがあり、デュアルＣＰＵのシステムでは各ＣＰＵにＯＳがそれぞれ搭載される。ＯＳ上でアプリケーション（以下、「アプリ」と記載）を実行する場合、アプリのソースコードをコンパイラで変換してマシン語の実行プログラムを生成し、このマシン語プログラムをＯＳ上で実行する。
【０００３】
上記のような制御システムにはソフトウエアとしてはＯＳ、アプリのソースコード、コンパイラ（マシン語プログラム）があるが、これらのソフトウエアにバグが含まれている場合もアプリのマシン語プログラムをＯＳ上で実行すると誤った演算値を出力する。制御システム開発においては、ソフトウエアのＯＳ、アプリのソースコード、コンパイラのうち、アプリのソースコードについては開発者による徹底したテストによってバグが取り除かれるが、ＯＳとコンパイラについてはブラックボックスである。そこで、ＯＳやコンパイラのバグを検出する方法が各種提案されている。例えば、特許文献１には、１つのアプリのソースコードを複数のコンパイラでそれぞれ変換して複数のマシン語プログラムを生成し、この複数のマシン語プログラムに同一のデータを入力してそれぞれ実行し、複数の演算値を比較することによって複数のコンパイラのバグを間接的に検出することが記載されている。異なるコンパイラの同じ箇所に全く同じバグが存在する可能性は極めて低いので、複数のマシン語プログラム（複数のコンパイラ）による各演算値が異なる場合にはいずれかのコンパイラにバグが有ると推定できる。
【０００４】
さらに、コンパイラとＯＳのバグを検出する方法としては、以下の方法が考えられる。図１６には、２個のＣＰＵ１５１，１５２を備えており、各ＣＰＵ１５１，１５２に異なるＯＳ１４１，１４１が搭載される制御システム１００を示している。この制御システム１００では、アプリのソースコード１１０を第１コンパイラ１２１で変換してマシン語プログラムの第１アプリ１３１を生成するとともに、ソースコード１１０を第２コンパイラ１２２で変換してマシン語プログラムの第２アプリ１３２を生成する。そして、この２個のアプリ１３１，１３２を異なるＯＳ１４１，１４２上で実行することによって、ＯＳとコンパイラのバグを検出する。
【０００５】
この制御システム１００でのフェイルセーフ処理を図１７のフローチャートに沿って説明する。まず、第１アプリ１３１と第２アプリ１３２に同じデータが入力されると、第１ＣＰＵ１５１では第１アプリ１３１を第１ＯＳ１４１上で実行して制御演算値ａを出力し（Ｓ２１０）、第２ＣＰＵ１５２では第２アプリ１３２を第２ＯＳ１４２上で実行して制御演算値ｂを出力する（Ｓ２２０）。第１ＣＰＵ１５１では、制御演算値ａを第２ＣＰＵ１５２に送信するとともに（Ｓ２１１）、第２ＣＰＵ１５２からの制御演算値ｂを受信する（Ｓ２１２）。また、第２ＣＰＵ１５２では、制御演算値ｂを第１ＣＰＵ１５１に送信するとともに（Ｓ２２１）、第１ＣＰＵ１５１からの制御演算値ａを受信する（Ｓ２２２）。
【０００６】
そして、第１ＣＰＵ１５１（比較部１６０）では、２個の制御演算値ａ，ｂを比較し（Ｓ２１３）、ａとｂとが同じ値か否かを判定する（Ｓ２１４）。また、第２ＣＰＵ１５２（比較部１６０）でも、２個の制御演算値ａ，ｂを比較し（Ｓ２２３）、ａとｂとが同じ値か否かを判定する（Ｓ２２４）。そして、比較部１６０（第１ＣＰＵ１５１、第２ＣＰＵ１５２）では、Ｓ２１４でａとｂが同じ値と判定しかつＳ２２４でａとｂが同じ値と判定した場合（Ｓ２３０）、ＯＳとコンパイラにはバグは無いと判断し、その制御演算値ａ（ｂ）を出力する（Ｓ２３１）。比較部１６０では、Ｓ２１４でａとｂが異なる値と判定しかつＳ２２４でａとｂが異なる値と判定した場合（Ｓ２３２）、ＯＳとコンパイラの少なくとも一方にバグが有ると判断し、システムをシャットダウンする（Ｓ２３３）。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００５−１４１４０６号公報
【特許文献２】特開２００４−３５５２３３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記したような検出方法では、２個のＯＳ１４１，１４２及び２個のマシン語プログラムのアプリ１３１，１３２（コンパイラ１２１，１２２）の少なくとも一方にバグが有ることは検出できるが、ＯＳのバグかあるいはコンパイラのバグかを判別できない。つまり、異なるコンパイラで変換された異なるマシン語プログラムが同一内容の処理ができる異なるＯＳ上でそれぞれ実行されているので、どちらか一方のコンパイラのバグによりどちらかのマシン語プログラムにバグが組み込まれたのかあるいはどちらか一方のＯＳのバグにより異なる演算値を出力したのかを判別できない。そのため、バグが有ると判定した場合には、安全側の処理（シャットダウン等）でしか対処できない。
【０００９】
そこで、本発明は、動作環境のバグかあるいはコンパイラのバグかを判別することができる情報処理装置を提供することを課題とする。
【課題を解決するための手段】
【００１０】
本発明に係る情報処理装置は、同一のデータが入力されると異なる処理過程を経て同一の処理結果を出力する第１動作環境及び第２動作環境と、動作環境上で実行された場合に同一のデータが入力されると異なる処理過程を経て同一の処理結果データを動作環境に出力する第１アプリケーション及び第２アプリケーションを有する情報処理装置であって、第１動作環境では、第１アプリケーション及び第２アプリケーションが実行され、第２動作環境では、少なくとも第１アプリケーションが実行され、第１動作環境上で実行される第１アプリケーション及び第２アプリケーションと第２動作環境上で実行される第１アプリケーションに同一のデータがそれぞれ入力された場合、第１アプリケーションが実行される第１動作環境での処理結果と、第２アプリケーションが実行される第１動作環境での処理結果と、第１アプリケーションが実行される第２動作環境での処理結果とを比較する処理結果比較手段を備えることを特徴とする。
【００１１】
この情報処理装置は、複数の動作環境（例えば、ＯＳ）と複数のアプリケーションを有している。第１動作環境と第２動作環境とは、バグが無い場合、同一のデータが入力されると、異なる処理過程で処理するが同一の処理結果を出力する。第１アプリケーションと第２アプリケーションとは、例えば、同一のアプリケーションのソースコードが異なるコンパイラによってそれぞれ変換されたアプリケーションであり、動作環境上で実行される。第１アプリケーションと第２アプリケーションとは、バグが無い場合、同一のデータが入力されると、異なる処理過程で処理するが同一の処理結果データを動作環境に出力する。特に、情報処理装置では、第１動作環境上で第１アプリケーションと第２アプリケーションがそれぞれ実行され、第２動作環境上で少なくとも第１アプリケーションが実行される。ここで、情報処理装置では、第１動作環境上で実行される第１アプリケーション、第１動作環境上で実行される第２アプリケーション、第２動作環境上で実行される第１アプリケーションに同一のデータをそれぞれ入力する。すると、第１動作環境では、第１アプリケーションが実行されて処理結果データを出力するとその所定結果データに応じて処理結果を出力するとともに、第２アプリケーションが実行されて処理結果データを出力するとその処理結果データに応じて処理結果を出力する。第２動作環境では、第１アプリケーションが実行されて処理結果データを出力するとその処理結果データに応じて処理結果を出力する。そして、情報処理装置では、処理結果比較手段により、その３つの処理結果を比較する。この比較において、３つの処理結果が同じ場合には動作環境及びアプリケーションにバグは無いと判定でき、３つの処理結果が同じでない場合にはどの処理結果（どの動作環境上でのどのアプリケーションによる処理結果）が異なっているかによって動作環境のバグかあるいはアプリケーションのバグ（ひいては、コンパイラのバグ）かを判別することができる。このように、情報処理装置では、第１動作環境に第１、第２アプリケーションを配置し、第２動作環境に少なくとも第１アプリケーションを配置し、その処理結果を比較することにより、動作環境のバグかあるいはコンパイラのバグかを判別することができる。
【００１２】
本発明の上記情報処理装置は、第２動作環境では、第１アプリケーション及び第２アプリケーションが実行され、処理結果比較手段は、第１動作環境上で実行される第１アプリケーション及び第２アプリケーションと第２動作環境上で実行される第１アプリケーション及び第２アプリケーションに同一のデータがそれぞれ入力された場合、第１アプリケーションが実行される第１動作環境での処理結果と、第２アプリケーションが実行される第１動作環境での処理結果と、第１アプリケーションが実行される第２動作環境での処理結果と、第２アプリケーションが実行される第２動作環境での処理結果とを比較する。
【００１３】
この情報処理装置では、第１動作環境上で第１アプリケーションと第２アプリケーションが実行され、第２動作環境上でも第１アプリケーションと第２アプリケーションが実行される。ここで、情報処理装置では、第１動作環境上で実行される第１アプリケーション、第１動作環境上で実行される第２アプリケーション、第２動作環境上で実行される第１アプリケーション、第２動作環境上で実行される第２アプリケーションに同一のデータをそれぞれ入力する。すると、第１動作環境では、上記と同様に、第１アプリケーションよる処理結果を出力するとともに、第２アプリケーションによる処理結果を出力する。第２動作環境では、第１アプリケーションが実行されて処理結果データを出力するとその処理結果データに応じて処理結果を出力するとともに、第２アプリケーションが実行されて処理結果データを出力するとその処理結果データに応じて処理結果を出力する。そして、情報処理装置では、処理結果比較手段により、その４つの処理結果を比較する。この比較において、４つの処理結果が同じ場合には動作環境及びアプリケーションにバグは無いと判定でき、４つの処理結果が同じでない場合には同じ値になる処理結果と異なる値になる処理結果の組み合わせによって動作環境のバグかあるいはアプリケーションのバグ（ひいては、コンパイラのバグ）かを判別することができ、組み合わせのパターンによってはどちらの動作環境のバグかも判別することができる。このように、情報処理装置では、第１動作環境と第２動作環境に第１、第２アプリケーションをそれぞれ配置し、その処理結果を比較することにより、動作環境のバグかあるいはコンパイラのバグかをより高精度に判別することができ、動作環境のバグと判別した場合にはどちらの動作環境のバグかを判別できるパターンもある。
【発明の効果】
【００１４】
本発明によれば、異なる動作環境に第１、第２アプリケーションをそれぞれ配置し、その処理結果を比較することにより、動作環境のバグかあるいはコンパイラのバグかを判別することができる。
【図面の簡単な説明】
【００１５】
【図１】第１の実施の形態に係るＡＢＳシステムのＥＣＵの構成図である。
【図２】図１のＥＣＵにおける２個のコンパイラと２個のＯＳの組み合わせによる各制御演算値の比較の判別パターンの一覧表である。
【図３】図１のＥＣＵにおける第１ＣＰＵでの処理の流れを示すフローチャートである。
【図４】図１のＥＣＵにおける第２ＣＰＵでの処理の流れを示すフローチャートである。
【図５】第２の実施の形態に係るＡＢＳシステム＋ＡＣＣシステムのＥＣＵの構成図である。
【図６】図５のＥＣＵにおける２個のコンパイラと２個のＯＳの組み合わせによるＡＢＳ側の各制御演算値の比較の判別パターンの一覧表である。
【図７】図５のＥＣＵにおける２個のコンパイラと２個のＯＳの組み合わせによるＡＣＣ側の各制御演算値の比較の判別パターンの一覧表である。
【図８】図５のＥＣＵにおける第１ＣＰＵでの処理（前半部）の流れを示すフローチャートである。
【図９】図５のＥＣＵにおける第１ＣＰＵでの処理（後半部）の流れを示すフローチャートである。
【図１０】図５のＥＣＵにおける第２ＣＰＵでの処理（前半部）の流れを示すフローチャートである。
【図１１】図５のＥＣＵにおける第２ＣＰＵでの処理（後半部）の流れを示すフローチャートである。
【図１２】第３の実施の形態に係るＡＢＳシステムのＥＣＵの構成図である。
【図１３】図１２のＥＣＵにおける２個のコンパイラと２個のＯＳの組み合わせによる各制御演算値の比較の判別パターンの一覧表である。
【図１４】図１２のＥＣＵにおける第１ＣＰＵでの処理の流れを示すフローチャートである。
【図１５】図１２のＥＣＵにおける第２ＣＰＵでの処理の流れを示すフローチャートである。
【図１６】従来の制御システムの構成図である。
【図１７】図１６の制御システムにおけるフェイルセーフ処理の流れを示すフローチャートである。
【発明を実施するための形態】
【００１６】
以下、図面を参照して、本発明に係る情報処理装置の実施の形態を説明する。なお、各図において同一又は相当する要素については同一の符号を付し、重複する説明を省略する。
【００１７】
本実施の形態では、本発明に係る情報処理装置を、車両に搭載されるシステム（特に、ＥＣＵ[Electronic Control Unit]）に適用する。本実施の形態に係るシステムのＥＣＵは、２個のＣＰＵを備えており、各ＣＰＵ上に異なるＯＳがそれぞれ搭載されるＥＣＵである。また、本実施の形態に係るシステムのＥＣＵは、２個の異なるコンパイラを有しており、制御アプリのソースコードが２個の異なるコンパイラによってそれぞれ変換された２個のマシン語プログラムを有している。本実施の形態には、３つの形態があり、第１の実施の形態がＡＢＳ[Anti-lock Brake System]システムを統括制御するＥＣＵ（２個のＯＳに２個のマシン語プログラムをそれぞれ配置）であり、第２の実施の形態がＡＢＳシステムとＡＣＣ[Adaptive Cruise Control]を統括制御するＥＣＵ（２個のＯＳに（ＡＢＣの２個＋ＡＣＣの２個）のマシン語プログラムをそれぞれ配置）であり、第３の実施の形態がＡＢＳシステムを統括制御するＥＣＵ（一方のＣＰＵに２個のマシン語プログラムを配置し、他方のＣＰＵに１個のマシン語プログラムを配置）である。
【００１８】
なお、以下の説明では、ＥＣＵの内部構成及びフェイルセーフ処理について詳細に説明する。ＡＢＳ制御やＡＣＣ制御は従来の制御が適用されるので、各制御の具体的な処理については説明を省略する。
【００１９】
図１及び図２を参照して、第１の実施の形態に係るＡＢＳシステムのＥＣＵ１について説明する。図１は、第１の実施の形態に係るＡＢＳシステムのＥＣＵの構成図である。図２は、図１のＥＣＵにおける２個のコンパイラと２個のＯＳの組み合わせによる各制御演算値の比較の判別パターンの一覧表である。
【００２０】
ＥＣＵ１は、電子制御ユニットであり、ＡＢＳシステムを統括制御する。ＥＣＵ１は、ソフトウエアとしてＡＢＳアプリ１０、第１コンパイラ２１と第２コンパイラ２２、第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２、第１ＯＳ４１と第２ＯＳ４２を有している。また、ＥＣＵ１は、ハードウエアとして第１ＣＰＵ５１と第２ＣＰＵ５２、ＲＯＭ[Read Only Memory]、ＲＡＭ[Random AccessMemory]などを備えている。さらに、ＥＣＵ１は、各ＣＰＵ５１，５２で各アプリが実行されることによって比較部６１，出力処理部７１が構成される。この比較部６１と出力処理部７１は、第１ＣＰＵ５１側と第２ＣＰＵ５２側の両方に構成され、両側で同様の処理がそれぞれ行われる。
【００２１】
なお、第１の実施の形態では、第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２が特許請求の範囲に記載する第１アプリケーションと第２アプリケーションに相当し、第１ＯＳ４１と第２ＯＳ４２が特許請求の範囲に記載する第１動作環境と第２動作環境に相当し、比較部６１が特許請求の範囲に記載する処理結果比較手段に相当する。
【００２２】
ＡＢＳアプリ１０は、開発者によって所定のプログラミング言語（例えば、Ｃ言語）で作成されたソフトウエアであり、ＡＢＳ制御を行うためのソースコードである。本実施の形態では、ＡＢＳアプリ１０にはバグが存在しないこととして、フェイルセーフ処理を説明する。なお、ソースコードのＡＢＳアプリ１０もＥＣＵ１に搭載され、ＥＣＵ１において第１コンパイラ２１と第２コンパイラ２２で第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２に変換されてもよいし、あるいは、ＡＢＳアプリ１０はＥＣＵ１に搭載されずに、第１コンパイラ２１と第２コンパイラ２２で予め変換された第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２だけがＥＣＵ１に搭載されていてもよい。
【００２３】
コンパイラ２１，２２は、所定のプログラミング言語で作成されたソースコードをＣＰＵ５１，ＣＰＵ５２で実行できるマシン語プログラム（オブジェクトコード）に変換するためのソフトウエアである。第１コンパイラ２１と第２コンパイラ２２とは、異なるコンパイラであり、同じソースコードを異なるマシン語プログラムに変換する。
【００２４】
第１ＡＢＳアプリ３１は、ソースコードのＡＢＳアプリ１０が第１コンパイラ２１によって変換されたマシン語プログラムである。第２ＡＢＳアプリ３２は、ソースコードのＡＢＳアプリ１０が第２コンパイラ２２によって変換されたマシン語プログラムである。第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２は、第１ＯＳ４１（第１ＣＰＵ５１）及び第２ＯＳ４２（第１ＣＰＵ５２）上にそれぞれ搭載される。第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２とは、コンパイラ２１，２２にバグが無い場合、同一のデータがそれぞれ入力されてＯＳ４１，４２上で実行されると、異なる処理過程でそれぞれ処理を行うが、同一の処理結果データをＯＳ４１，４２に出力する。
【００２５】
ＯＳ４１，４２は、ＥＣＵ１全体を管理する基本ソフトウエアである。第１ＯＳ４１と第２ＯＳ４２とは、異なるＯＳである。第１ＯＳ４１は、第１ＣＰＵ５１に搭載される。第２ＯＳ４２は、第２ＣＰＵ５２に搭載される。第１ＯＳ４１と第２ＯＳ４２とは、バグが無い場合、同一のデータがそれぞれ入力されると、異なる処理過程でそれぞれ処理を行うが、同一の処理結果を出力する。
【００２６】
第１ＣＰＵ５１では、第１ＡＢＳアプリ３１及び第２ＡＢＳアプリ３２に同じ所定のデータ（例えば、各種センサで検出される検出データ）が入力される毎に、第１ＯＳ４１上で第１ＡＢＳアプリ３１及び第２ＡＢＳアプリ３２を実行する。第１ＯＳ４１上で第１ＡＢＳアプリ３１を実行すると、入力データに対する処理結果データを第１ＯＳ４１に出力し、その処理結果データが入力されると第１ＯＳ４１ではその処理結果データに応じた制御演算値ａを出力する。第１ＯＳ４１上で第２ＡＢＳアプリ３２を実行すると、入力データに対する処理結果データを第１ＯＳ４１に出力し、その処理結果データが入力されると第１ＯＳ４１ではその処理結果データに応じた制御演算値ｂを出力する。そして、第１ＣＰＵ５１では、その制御演算値ａ，ｂを第２ＣＰＵ５２に送信するとともに、第２ＣＰＵ５２からの制御演算値ｃ，ｄを受信する。
【００２７】
第２ＣＰＵ５２では、第１ＡＢＳアプリ３１及び第２ＡＢＳアプリ３２に同じ所定のデータ（第１ＣＰＵ５１側で入力される所定のデータと同じデータ）が入力される毎に、第２ＯＳ４２上で第１ＡＢＳアプリ３１及び第２ＡＢＳアプリ３２を実行する。第２ＯＳ４２上で第１ＡＢＳアプリ３１を実行すると、入力データに対する処理結果データを第２ＯＳ４２に出力し、その処理結果データが入力されると第２ＯＳ４２ではその処理結果データに応じた制御演算値ｃを出力する。第２ＯＳ４２上で第２ＡＢＳアプリ３２を実行すると、入力データに対する処理結果データを第２ＯＳ４２に出力し、その処理結果データが入力されると第２ＯＳ４２ではその処理結果データに応じた制御演算値ｄを出力する。そして、第２ＣＰＵ５２では、その制御演算値ｃ，ｄを第１ＣＰＵ５１に送信するとともに、第１ＣＰＵ５１からの制御演算値ａ，ｂを受信する。
【００２８】
比較部６１では、制御演算値ａ，ｂ，ｃ，ｄを比較し、制御演算値ａ，ｂ，ｃ，ｄが同じ値かあるいは異なる値かによって図２に示す判別パターンに従って各判定処理を行う。
【００２９】
ａ，ｂ，ｃ，ｄ全て同じ値の場合、比較部６１では、第１コンパイラ２１（第１ＡＢＳアプリ３１）と第２コンパイラ２２（第２ＡＢＳアプリ３２）及び第１ＯＳ４１と第２ＯＳ４２にバグが無いと判断し、通常のＡＢＳ制御を行うと判定する。
【００３０】
ａとｃが同じ値であり、ｂとｄが同じ値であるが、ａ，ｃとｂ，ｄとが異なる値の場合、比較部６１では、第１ＯＳ４１と第２ＯＳ４２にはバグが無いが、第１コンパイラ２１と第２コンパイラ２２のいずれか一方にバグが有ると判断する。この場合、ＯＳ４１，４２は共に正常に実行できるが、ＡＢＳアプリ３１，３２の一方は正常に実行できないので、比較部６１では、安全側の処理としてＡＢＳ制御を停止すると判定する。これによって、システム自体は停止していないので、ＯＳ４１，４２上でＡＢＳ制御以外のアプリ（例えば、ＡＢＳ制御異常のときの警報ランプ点灯処理）を実行している場合、そのアプリを実行することができる。
【００３１】
ａとｂが同じ値であり、ｃとｄが同じ値であるが、ａ，ｂとｃ，ｄとが異なる値の場合、比較部６１では、第１コンパイラ２１と第２コンパイラ２２にはバグが無いが、第１ＯＳ４１と第２ＯＳ４２のいずれか一方にバグが有ると判断する。この場合、ＯＳ４１，４２のどちらが正常に実行できないのか判別できないので、比較部６１では、安全側の処理としてシステムを停止すると判定する。
【００３２】
ａとｂとｃが同じ値であり、ｄだけが異なる値の場合、比較部６１では、第１コンパイラ２１と第２コンパイラ２２及び第１ＯＳ４１にはバグが無いが、第２ＯＳ４２にバグが有ると判断する。この場合、第２ＯＳ４２だけが正常に実行できないと判別できているので、比較部６１では、正常な第１ＯＳ４１側だけでＡＢＳ制御を続行すると判定する。なお、第２ＯＳ４２の一部にバグが有るが、第２ＯＳ４２の正常に動作している部分で第１ＡＢＳアプリ３１が実行されたので、ａ，ｂとｃとが同じ値になったと推定できる。
【００３３】
ａとｂとｄが同じ値であり、ｃだけが異なる値の場合、比較部６１では、第１コンパイラ２１と第２コンパイラ２２及び第１ＯＳ４１にはバグが無いが、第２ＯＳ４２にバグが有ると判断する。この場合、第２ＯＳ４２だけが正常に実行できないと判別できているので、比較部６１では、正常な第１ＯＳ４１側だけでＡＢＳ制御を続行すると判定する。なお、第２ＯＳ４２の一部にバグが有るが、第２ＯＳ４２の正常に動作している部分で第２ＡＢＳアプリ３２が実行されたので、ａ，ｂとｄとが同じ値になったと推定できる。
【００３４】
ｂとｃとｄが同じ値であり、ａだけが異なる値の場合、比較部６１では、第１コンパイラ２１と第２コンパイラ２２及び第２ＯＳ４２にはバグが無いが、第１ＯＳ４１にバグが有ると判断する。この場合、第１ＯＳ４１だけが正常に実行できないと判別できているので、比較部６１では、正常な第２ＯＳ４２側だけでＡＢＳ制御を続行すると判定する。なお、第１ＯＳ４１の一部にバグが有るが、第１ＯＳ４１の正常に動作している部分で第２ＡＢＳアプリ３２が実行されたので、ｃ，ｄとｂとが同じ値になったと推定できる。
【００３５】
ａとｃとｄが同じ値であり、ｂだけが異なる値の場合、比較部６１では、第１コンパイラ２１と第２コンパイラ２２及び第２ＯＳ４２にはバグが無いが、第１ＯＳ４１にバグが有ると判断する。この場合、第１ＯＳ４１だけが正常に実行できないと判別できているので、比較部６１では、正常な第２ＯＳ４２側だけでＡＢＳ制御を続行すると判定する。なお、第１ＯＳ４１の一部にバグが有るが、第１ＯＳ４１の正常に動作している部分で第１ＡＢＳアプリ３１が実行されたので、ｃ，ｄとａとが同じ値になったと推定できる。
【００３６】
なお、上記以外のパターンの場合、コンパイラ２１，２２に共にバグが有るか、ＯＳ４１，４２に共にバグが有るか、あるいは、コンパイラ２１，２２の少なくも一方及びＯＳ４１，４２の少なくとも一方にバグが有るパターンであるが、このようなパターンは極めて稀であり、無視できる。ただし、このパターンに万が一なった場合には、安全側の処理としてシステムを停止するとよい。
【００３７】
出力処理部７１では、比較部６１で通常のＡＢＳ制御を行うと判定した場合、ＯＳ４１，４２のいずれか一方（例えば、第１ＯＳ４１）から出力された制御演算値ａ（ｂ，ｃ，ｄ）に応じた制御信号を出力する。また、出力処理部７１では、比較部６１でＡＢＳ制御を停止すると判定した場合、ＡＢＳリレーをＯＦＦし、ＡＢＳアプリ３１，３２を共に終了する。また、出力処理部７１では、比較部６１でシステムを停止すると判定した場合、シャットダウンするかあるいは電源をＯＦＦする。また、出力処理部７１では、比較部６１で第１ＯＳ４１側でＡＢＳ制御だけを続行すると判定した場合、第１ＯＳ４１から出力された制御演算値ａ（ｂ）に応じた制御信号を出力する。また、出力処理部７１では、比較部６１で第２ＯＳ４２側だけでＡＢＳ制御を続行すると判定した場合、第２ＯＳ４２から出力された制御演算値ｃ（ｄ）に応じた制御信号を出力する。
【００３８】
図１及び図２を参照して、ＥＣＵ１でのフェイルセーフ処理の流れについて説明する。特に、第１ＣＰＵ５１側での処理については図３のフローチャートに沿って説明し、第２ＣＰＵ５２側での処理については図４のフローチャートに沿って説明する。図３は、図１のＥＣＵにおける第１ＣＰＵでの処理の流れを示すフローチャートである。図４は、図１のＥＣＵにおける第２ＣＰＵでの処理の流れを示すフローチャートである。
【００３９】
ＡＢＳシステムが起動され、データが入力される毎に、第１ＣＰＵ５１では第１ＯＳ４１上で第１ＡＢＳアプリ３１及び第２ＡＢＳアプリ３２が実行され、第２ＣＰＵ５２では第２ＯＳ４２上で第１ＡＢＳアプリ３１及び第２ＡＢＳアプリ３２が実行される。
【００４０】
第１ＣＰＵ５１では、第１ＡＢＳアプリ３１による制御演算値ａを出力するとともに（Ｓ１０）、第２ＡＢＳアプリ３２による制御演算値ｂを出力する（Ｓ１１）。そして、第１ＣＰＵ５１では、制御演算値ａ，ｂを第２ＣＰＵ５２に送信する（Ｓ１２）。また、第１ＣＰＵ５１では、第２ＣＰＵ５２からの制御演算値ｃ，ｄを受信する（Ｓ１３）。
【００４１】
第２ＣＰＵ５２では、第１ＡＢＳアプリ３１による制御演算値ｃを出力するとともに（Ｓ３０）、第２ＡＢＳアプリ３２による制御演算値ｄを出力する（Ｓ３１）。そして、第２ＣＰＵ５２では、制御演算値ｃ，ｄを第１ＣＰＵ５１に送信する（Ｓ３２）。また、第２ＣＰＵ５２では、第１ＣＰＵ５１からの制御演算値ａ，ｂを受信する（Ｓ３３）。
【００４２】
第１ＣＰＵ５１では、制御演算値ａ，ｂ，ｃ，ｄを比較する（Ｓ１４）。そして、第１ＣＰＵ５１では、ａ＝ｂ＝ｃ＝ｄの場合にはＳｔａｔｕｓ１に０を代入し、ａ＝ｃ≠ｂ＝ｄの場合にはＳｔａｔｕｓ１に１を代入し、ａ＝ｂ＝ｃ≠ｄの場合にはＳｔａｔｕｓ１に２を代入し、ａ＝ｂ＝ｄ≠ｃの場合にはＳｔａｔｕｓ１に２を代入し、ａ≠ｂ＝ｃ＝ｄの場合にはＳｔａｔｕｓ１に３を代入し、ｂ≠ａ＝ｃ＝ｄの場合にはＳｔａｔｕｓ１に３を代入し、これら以外のパターンの場合にはＳｔａｔｕｓ１に４を代入する（Ｓ１５）。そして、第１ＣＰＵ５１では、Ｓｔａｔｕｓ１を第２ＣＰＵ５２に送信する（Ｓ１６）。また、第１ＣＰＵ５１では、第２ＣＰＵ５２からのＳｔａｔｕｓ２を受信する（Ｓ１７）。
【００４３】
第２ＣＰＵ５２では、制御演算値ａ，ｂ，ｃ，ｄを比較する（Ｓ３４）。そして、第２ＣＰＵ５２では、ａ＝ｂ＝ｃ＝ｄの場合にはＳｔａｔｕｓ２に０を代入し、ａ＝ｃ≠ｂ＝ｄの場合にはＳｔａｔｕｓ２に１を代入し、ａ＝ｂ＝ｃ≠ｄの場合にはＳｔａｔｕｓ２に２を代入し、ａ＝ｂ＝ｄ≠ｃの場合にはＳｔａｔｕｓ２に２を代入し、ａ≠ｂ＝ｃ＝ｄの場合にはＳｔａｔｕｓ２に３を代入し、ｂ≠ａ＝ｃ＝ｄの場合にはＳｔａｔｕｓ２に３を代入し、これら以外のパターンの場合にはＳｔａｔｕｓ２に４を代入する（Ｓ３５）。そして、第２ＣＰＵ５２では、Ｓｔａｔｕｓ２を第１ＣＰＵ５１に送信する（Ｓ３６）。また、第２ＣＰＵ５２では、第１ＣＰＵ５１からのＳｔａｔｕｓ１を受信する（Ｓ３７）。
【００４４】
第１ＣＰＵ５１では、Ｓｔａｔｕｓ１とＳｔａｔｕｓ２が同じか否かを判定する（Ｓ１８）。Ｓｔａｔｕｓ１とＳｔａｔｕｓ２が同じと判定した場合、第１ＣＰＵ５１では、Ｓｔａｔｕｓ１を判別する（Ｓ１９）。Ｓｔａｔｕｓ１が０の場合、第１ＣＰＵ５１では、制御演算値ａ（ｂ）を用いて通常のＡＢＳ制御を行う（Ｓ２０）。Ｓｔａｔｕｓ１が１の場合、第１ＣＰＵ５１では、ＡＢＳリレーをＯＦＦするとともにＡＢＳアプリ３１，３２を終了し、ＡＢＳ制御を停止する（Ｓ２１）。Ｓｔａｔｕｓ１が２の場合、第１ＣＰＵ５１では、制御演算値ａ（ｂ）を用いてＡＢＳ制御を続行する（Ｓ２２）。Ｓｔａｔｕｓ１が３の場合、第１ＣＰＵ５１では、何も行わない（Ｓ２３）。Ｓｔａｔｕｓ１が４の場合又はＳ１８の判定でＳｔａｔｕｓ１とＳｔａｔｕｓ２が異なると判定した場合、第１ＣＰＵ５１では、システムをシャットダウンするかあるいは電源をＯＦＦし、システムを停止する（Ｓ２４）。
【００４５】
第２ＣＰＵ５２では、Ｓｔａｔｕｓ２とＳｔａｔｕｓ１が同じか否かを判定する（Ｓ３８）。Ｓｔａｔｕｓ２とＳｔａｔｕｓ１が同じと判定した場合、第２ＣＰＵ５２では、Ｓｔａｔｕｓ２を判別する（Ｓ３９）。Ｓｔａｔｕｓ２が０の場合、第２ＣＰＵ５２では、第１ＣＰＵ５１側で通常のＡＢＳ制御を行っているので、何も行わない（Ｓ４０）。Ｓｔａｔｕｓ２が１の場合、第２ＣＰＵ５２では、ＡＢＳリレーをＯＦＦするとともにＡＢＳアプリ３１，３２を終了し、ＡＢＳ制御を停止する（Ｓ４１）。Ｓｔａｔｕｓ２が２の場合、第２ＣＰＵ５２では、何も行わない（Ｓ４２）。Ｓｔａｔｕｓ２が３の場合、第２ＣＰＵ５２では、制御演算値ｃ（ｄ）を用いてＡＢＳ制御を続行する（Ｓ４３）。Ｓｔａｔｕｓ２が４の場合又はＳ３８の判定でＳｔａｔｕｓ２とＳｔａｔｕｓ１が異なると判定した場合、第２ＣＰＵ５２では、システムをシャットダウンするかあるいは電源をＯＦＦし、システムを停止する（Ｓ４４）。
【００４６】
このＥＣＵ１によれば、第１ＯＳ４１と第２ＯＳ４２に異なるコンパイラ２１，２２でそれぞれ変換された第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２をそれぞれ配置し、４通りの組み合わせでの４つの制御演算値ａ，ｂ，ｃ，ｄを比較することにより、ＯＳ４１，４２のバグかあるいはコンパイラ２１，２２のバグかを判別することができる。これによって、コンパイラ２１，２２にバグが有る場合にはコンパイラ異常（ＡＢＳアプリ異常）時のファイルセーフ処理（例えば、ＡＢＳ制御だけを停止）を実施し、ＯＳ４１，４２にバグが有る場合にはＯＳ異常時のファイルセーフ処理を実施できる。特に、ＯＳ４１，４２にバグが有る場合にどちらのＯＳにバグが有るかを判別できるときには、正常のＯＳでＡＢＳ制御を継続することができる。
【００４７】
図５〜図７を参照して、第２の実施の形態に係るＡＢＳシステム＋ＡＣＣシステムのＥＣＵ２について説明する。図５は、第２の実施の形態に係るＡＢＳシステム＋ＡＣＣシステムのＥＣＵの構成図である。図６は、図５のＥＣＵにおける２個のコンパイラと２個のＯＳの組み合わせによるＡＢＳ側の各制御演算値の比較の判別パターンの一覧表である。図７は、図５のＥＣＵにおける２個のコンパイラと２個のＯＳの組み合わせによるＡＣＣ側の各制御演算値の比較の判別パターンの一覧表である。
【００４８】
ＥＣＵ２は、電子制御ユニットであり、ＡＢＳシステムとＡＣＣシステムを統括制御する。ＥＣＵ２は、ソフトウエアとしてＡＢＳアプリ１０ＡとＡＣＣアプリ１０Ｂ、第１コンパイラ２１と第２コンパイラ２２、第１ＡＢＳアプリ３１Ａと第２ＡＢＳアプリ３２Ａ、第１ＡＣＣアプリ３１Ｂと第２ＡＣＣアプリ３２Ｂ、第１ＯＳ４１と第２ＯＳ４２を有している。また、ＥＣＵ２は、ハードウエアとして第１ＣＰＵ５１と第２ＣＰＵ５２、ＲＯＭ、ＲＡＭなどを備えている。さらに、ＥＣＵ２は、各ＣＰＵ５１，５２で各アプリが実行されることによって比較部６２，出力処理部７２が構成される。この比較部６２と出力処理部７２は、第１ＣＰＵ５１側と第２ＣＰＵ５２側の両方に構成され、両側で同様の処理がそれぞれ行われる。
【００４９】
なお、第２の実施の形態では、第１ＡＢＳアプリ３１Ａと第２ＡＢＳアプリ３２Ａ及び第１ＡＣＣアプリ３１Ｂと第２ＡＣＣアプリ３２Ｂが特許請求の範囲に記載する第１アプリケーションと第２アプリケーションに相当し、第１ＯＳ４１と第２ＯＳ４２が特許請求の範囲に記載する第１動作環境と第２動作環境に相当し、比較部６２が特許請求の範囲に記載する処理結果比較手段に相当する。
【００５０】
ＡＢＳアプリ１０Ａは、第１の実施の形態で説明したＡＢＳアプリ１０と同様のソフトウエアである。また、第１ＡＢＳアプリ３１Ａ、第２ＡＢＳアプリ３２Ａは、第１の実施の形態で説明した第１ＡＢＳアプリ３１、第２ＡＢＳアプリ３２と同様のソフトウエアである。
【００５１】
ＡＣＣアプリ１０Ｂは、開発者によって所定のプログラミング言語で作成されたソフトウエアであり、ＡＣＣ制御を行うためのソースコードである。本実施の形態では、ＡＢＳアプリ１０Ａ、ＡＣＣアプリ１０Ｂにはバグが存在しないこととして、フェイルセーフ処理を説明する。なお、ソースコードのＡＢＳアプリ１０ＡとＡＣＣアプリ１０ＢもＥＣＵ２に搭載され、ＥＣＵ２において第１コンパイラ２１と第２コンパイラ２２で第１ＡＢＳアプリ３１Ａと第２ＡＢＳアプリ３２Ａ及び第１ＡＣＣアプリ３１Ｂと第２ＡＣＣアプリ３２Ｂに変換されてもよいし、あるいは、ＡＢＳアプリ１０ＡとＡＣＣアプリ１０ＢはＥＣＵ２に搭載されずに、第１コンパイラ２１と第２コンパイラ２２で予め変換された第１ＡＢＳアプリ３１Ａと第２ＡＢＳアプリ３２Ａ及び第１ＡＣＣアプリ３１Ｂと第２ＡＣＣアプリ３２ＢだけがＥＣＵ２に搭載されていてもよい。
【００５２】
第１ＡＣＣアプリ３１Ｂは、ソースコードのＡＣＣアプリ１０Ｂが第１コンパイラ２１によって変換されたマシン語プログラムである。第２ＡＣＣアプリ３２Ｂは、ソースコードのＡＣＣアプリ１０Ｂが第２コンパイラ２２によって変換されたマシン語プログラムである。第１ＡＣＣアプリ３１Ｂと第２ＡＣＣアプリ３２Ｂは、第１ＯＳ４１（第１ＣＰＵ５１）及び第２ＯＳ４２（第１ＣＰＵ５２）上にそれぞれ搭載される。第１ＡＣＣアプリ３１Ｂと第２ＡＣＣアプリ３２Ｂとは、コンパイラ２１，２２にバグが無い場合、同一のデータがそれぞれ入力されてＯＳ４１，４２上で実行されると、異なる処理過程でそれぞれ処理を行うが、同一の処理結果データをＯＳ４１，４２に出力する。
【００５３】
第１ＣＰＵ５１では、第１ＡＢＳアプリ３１Ａ及び第２ＡＢＳアプリ３２Ａに同じ所定のデータが入力される毎に、第１ＯＳ４１上で第１ＡＢＳアプリ３１Ａ及び第２ＡＢＳアプリ３２Ａを実行する。第１ＯＳ４１上で第１ＡＢＳアプリ３１Ａを実行すると、第１の実施の形態と同様に、制御演算値ａを出力する。第１ＯＳ４１上で第２ＡＢＳアプリ３２Ａを実行すると、第１の実施の形態と同様に、制御演算値ｂを出力する。そして、第１ＣＰＵ５１では、その制御演算値ａ，ｂを第２ＣＰＵ５２に送信するとともに、第２ＣＰＵ５２からの制御演算値ｅ，ｆを受信する。
【００５４】
また、第１ＣＰＵ５１では、第１ＡＣＣアプリ３１Ｂ及び第２ＡＣＣアプリ３２Ｂに同じ所定のデータが入力される毎に、第１ＯＳ４１上で第１ＡＣＣアプリ３１Ｂ及び第２ＡＣＣアプリ３２Ｂを実行する。第１ＯＳ４１上で第１ＡＣＣアプリ３１Ｂを実行すると、入力データに対する処理結果データを第１ＯＳ４１に出力し、その処理結果データが入力されると第１ＯＳ４１ではその処理結果データに応じた制御演算値ｃを出力する。第１ＯＳ４１上で第２ＡＣＣアプリ３２Ｂを実行すると、その入力データに対する処理結果データを第１ＯＳ４１に出力し、その処理結果データが入力されると第１ＯＳ４１ではその処理結果データに応じた制御演算値ｄを出力する。そして、第１ＣＰＵ５１では、その制御演算値ｃ，ｄを第２ＣＰＵ５２に送信するとともに、第２ＣＰＵ５２からの制御演算値ｇ，ｈを受信する。
【００５５】
第２ＣＰＵ５２では、第１ＡＢＳアプリ３１Ａ及び第２ＡＢＳアプリ３２Ａに同じ所定のデータが入力される毎に、第２ＯＳ４２上で第１ＡＢＳアプリ３１Ａ及び第２ＡＢＳアプリ３２Ａを実行する。第２ＯＳ４２上で第１ＡＢＳアプリ３１Ａを実行すると、第１の実施の形態と同様に、制御演算値ｅ（ただし、第１の実施の形態では制御演算値ｃとしている）を出力する。第２ＯＳ４２上で第２ＡＢＳアプリ３２Ａを実行すると、第１の実施の形態と同様に、制御演算値ｆ（ただし、第１の実施の形態では制御演算値ｄとしている）を出力する。そして、第２ＣＰＵ５２では、その制御演算値ｅ，ｆを第１ＣＰＵ５１に送信するとともに、第１ＣＰＵ５１からの制御演算値ａ，ｂを受信する。
【００５６】
また、第２ＣＰＵ５２では、第１ＡＣＣアプリ３１Ｂ及び第２ＡＣＣアプリ３２Ｂに同じ所定のデータが入力される毎に、第２ＯＳ４２上で第１ＡＣＣアプリ３１Ｂ及び第２ＡＣＣアプリ３２Ｂを実行する。第２ＯＳ４２上で第１ＡＣＣアプリ３１Ｂを実行すると、入力データに対する処理結果データを第２ＯＳ４２に出力し、その処理結果データが入力されると第２ＯＳ４２ではその処理結果データに応じた制御演算値ｇを出力する。第２ＯＳ４２上で第２ＡＣＣアプリ３２Ｂを実行すると、入力データに対する処理結果データを第２ＯＳ４２に出力し、その処理結果データが入力されると第２ＯＳ４２ではその処理結果データに応じた制御演算値ｈを出力する。そして、第２ＣＰＵ５２では、その制御演算値ｇ，ｈを第１ＣＰＵ５１に送信するとともに、第１ＣＰＵ５１からの制御演算値ｃ，ｄを受信する。
【００５７】
比較部６２では、ＡＢＳ制御側の制御演算値ａ，ｂ，ｅ，ｆを比較し、制御演算値ａ，ｂ，ｅ，ｆが同じ値かあるいは異なる値かによって図６に示す判別パターンに従って各判定処理を行う。この各判別パターンでの判定処理は、第１の実施の形態での比較部６１の説明において制御演算値のｃをｅとし、ｄをｆとした場合に相当するので、説明を省略する。
【００５８】
また、比較部６２では、ＡＣＣ制御側の制御演算値ｃ，ｄ，ｇ，ｈを比較し、制御演算値ｃ，ｄ，ｇ，ｈが同じ値かあるいは異なる値かによって図７に示す判別パターンに従って各処理を行う。
【００５９】
ｃ，ｄ，ｇ，ｈ全て同じ値の場合、比較部６２では、第１コンパイラ２１（第１ＡＣＣアプリ３１Ｂ）と第２コンパイラ２２（第２ＡＣＣアプリ３２Ｂ）及び第１ＯＳ４１と第２ＯＳ４２にバグが無いと判断し、通常のＡＣＣ制御を行うと判定する。
【００６０】
ｃとｇが同じ値であり、ｄとｈが同じ値であるが、ｃ，ｇとｄ，ｈとが異なる値の場合、比較部６２では、第１ＯＳ４１と第２ＯＳ４２にはバグが無いが、第１コンパイラ２１と第２コンパイラ２２のいずれか一方にバグが有ると判断する。この場合、ＡＣＣアプリ３１Ｂ，３２Ｂの一方に正常に実行できない部分があるが、ＡＣＣ制御を極力継続して行うために、比較部６２では、ＡＣＣアプリを再起動すると判定する。なお、このようなパターンの場合、ＡＢＳシステム側ではＡＢＳ制御を停止したのは、ＡＢＳシステムは高い安全性が要求される安全システムであるからである。
【００６１】
ｃとｄが同じ値であり、ｇとｈが同じ値であるが、ｃ，ｄとｇ，ｈとが異なる値の場合、比較部６２では、第１コンパイラ２１と第２コンパイラ２２にはバグが無いが、第１ＯＳ４１と第２ＯＳ４２のいずれか一方にバグが有ると判断する。この場合、ＯＳ４１，４２のどちらが正常に実行できないのか判別できないので、比較部６２では、安全側の処理としてシステムを停止すると判定する。
【００６２】
ｃとｄとｇが同じ値であり、ｈだけが異なる値の場合、比較部６２では、第１コンパイラ２１と第２コンパイラ２２及び第１ＯＳ４１にはバグが無いが、第２ＯＳ４２にバグが有ると判断する。この場合、第２ＯＳ４２だけが正常に実行できないと判別できているので、比較部６２では、正常な第１ＯＳ４１側だけでＡＣＣ制御を続行すると判定する。
【００６３】
ｃとｄとｈが同じ値であり、ｇだけが異なる値の場合、比較部６２では、第１コンパイラ２１と第２コンパイラ２２及び第１ＯＳ４１にはバグが無いが、第２ＯＳ４２にバグが有ると判断する。この場合、第２ＯＳ４２だけが正常に実行できないと判別できているので、比較部６２では、正常な第１ＯＳ４１側だけでＡＣＣ制御を続行すると判定する。
【００６４】
ｄとｇとｈが同じ値であり、ｃだけが異なる値の場合、比較部６２では、第１コンパイラ２１と第２コンパイラ２２及び第２ＯＳ４２にはバグが無いが、第１ＯＳ４１にバグが有ると判断する。この場合、第１ＯＳ４１だけが正常に実行できないと判別できているので、比較部６２では、正常な第２ＯＳ４２側だけでＡＣＣ制御を続行すると判定する。
【００６５】
ｃとｇとｈが同じ値であり、ｄだけが異なる値の場合、比較部６２では、第１コンパイラ２１と第２コンパイラ２２及び第２ＯＳ４２にはバグが無いが、第１ＯＳ４１にバグが有ると判断する。この場合、第１ＯＳ４１だけが正常に実行できないと判別できているので、比較部６２では、正常な第２ＯＳ４２側だけでＡＣＣ制御を続行すると判定する。
【００６６】
なお、上記以外のパターンの場合、第１の実施の形態でも記載したように、極めて稀であり、無視できるが、このパターンに万が一なった場合にはシステムを停止するとよい。
【００６７】
出力処理部７２では、比較部６２のＡＢＳ制御側の判定で通常のＡＢＳ制御を行うと判定した場合、ＯＳ４１，４２のいずれか一方から出力されたＡＢＳ側の制御演算値ａ（ｂ，ｅ，ｆ）に応じた制御信号を出力する。また、出力処理部７２では、比較部６２のＡＢＳ制御側の判定でＡＢＳ制御を停止すると判定した場合、ＡＢＳリレーをＯＦＦし、ＡＢＳアプリ３１Ａ，３２Ａを共に終了する。また、出力処理部７２では、比較部６２のＡＢＳ制御側の判定でシステムを停止すると判定した場合、シャットダウンするかあるいは電源をＯＦＦする。また、出力処理部７２では、比較部６２のＡＢＳ制御側の判定で第１ＯＳ４１側だけでＡＢＳ制御を続行すると判定した場合、第１ＯＳ４１から出力されたＡＢＳ側の制御演算値ａ（ｂ）に応じた制御信号を出力する。また、出力処理部７２では、比較部６２のＡＢＳ制御側の判定で第２ＯＳ４２側だけでＡＢＳ制御を続行すると判定した場合、第２ＯＳ４２から出力されたＡＢＳ側の制御演算値ｅ（ｆ）に応じた制御信号を出力する。
【００６８】
出力処理部７２では、比較部６２のＡＣＣ制御側の判定で通常のＡＣＣ制御を行うと判定した場合、ＯＳ４１，４２のいずれか一方から出力されたＡＣＣ側の制御演算値ｃ（ｄ，ｇ，ｈ）に応じた制御信号を出力する。また、出力処理部７２では、比較部６２のＡＣＣ制御側の判定でＡＣＣアプリを再起動と判定した場合、ＡＣＣアプリ３１Ｂ，３２Ｂを再起動する。また、出力処理部７２では、比較部６２のＡＣＣ制御側の判定でシステムを停止すると判定した場合、シャットダウンするかあるいは電源をＯＦＦする。また、出力処理部７２では、比較部６２のＡＣＣ制御側の判定で第１ＯＳ４１側だけでＡＣＣ制御を続行すると判定した場合、第１ＯＳ４１から出力されたＡＣＣ制御側の制御演算値ｃ（ｄ）に応じた制御信号を出力する。また、出力処理部７２では、比較部６２のＡＣＣ制御側の判定で第２ＯＳ４２側だけでＡＣＣ制御を続行すると判定した場合、第２ＯＳ４２から出力されたＡＣＣ制御側の制御演算値ｇ（ｈ）に応じた制御信号を出力する。
【００６９】
図５〜図７を参照して、ＥＣＵ２でのフェイルセーフ処理の流れについて説明する。特に、第１ＣＰＵ５１側での処理については図８及び図９のフローチャートに沿って説明し、第２ＣＰＵ５２側での処理については図１０及び図１１のフローチャートに沿って説明する。図８は、図５のＥＣＵにおける第１ＣＰＵでの処理（前半部）の流れを示すフローチャートである。図９は、図５のＥＣＵにおける第１ＣＰＵでの処理（後半部）の流れを示すフローチャートである。図１０は、図５のＥＣＵにおける第２ＣＰＵでの処理（前半部）の流れを示すフローチャートである。図１１は、図５のＥＣＵにおける第２ＣＰＵでの処理（後半部）の流れを示すフローチャートである。
【００７０】
ＡＢＳシステムが起動され、ＡＢＳ側のデータが入力される毎に、第１ＣＰＵ５１では第１ＯＳ４１上で第１ＡＢＳアプリ３１Ａ及び第２ＡＢＳアプリ３２Ａが実行され、第２ＣＰＵ５２では第２ＯＳ４２上で第１ＡＢＳアプリ３１Ａ及び第２ＡＢＳアプリ３２Ａが実行される。また、ＡＣＣシステムが起動され、ＡＣＣ側のデータが入力される毎に、第１ＣＰＵ５１では第１ＯＳ４１上で第１ＡＣＣアプリ３１Ｂ及び第２ＡＣＣアプリ３２Ｂが実行され、第２ＣＰＵ５２では第２ＯＳ４２上で第１ＡＣＣアプリ３１Ｂ及び第２ＡＣＣアプリ３２Ｂが実行される。
【００７１】
第１ＣＰＵ５１では、第１ＡＢＳアプリ３１Ａによる制御演算値ａを出力するとともに（Ｓ５０）、第２ＡＢＳアプリ３２Ａによる制御演算値ｂを出力する（Ｓ５１）。また、第１ＣＰＵ５１では、第１ＡＣＣアプリ３１Ｂによる制御演算値ｃを出力するとともに（Ｓ５２）、第２ＡＣＣアプリ３２Ｂによる制御演算値ｄを出力する（Ｓ５３）。そして、第１ＣＰＵ５１では、制御演算値ａ，ｂ，ｃ，ｄを第２ＣＰＵ５２に送信する（Ｓ５４）。また、第１ＣＰＵ５１では、第２ＣＰＵ５２からの制御演算値ｅ，ｆ，ｇ，ｈを受信する（Ｓ５５）。
【００７２】
第２ＣＰＵ５２では、第１ＡＢＳアプリ３１Ａによる制御演算値ｅを出力するとともに（Ｓ８０）、第２ＡＢＳアプリ３２Ａによる制御演算値ｆを出力する（Ｓ８１）。また、第２ＣＰＵ５２では、第１ＡＣＣアプリ３１Ｂによる制御演算値ｇを出力するとともに（Ｓ８２）、第２ＡＣＣアプリ３２Ｂによる制御演算値ｈを出力する（Ｓ８３）。そして、第２ＣＰＵ５２では、制御演算値ｅ，ｆ，ｇ，ｈを第１ＣＰＵ５１に送信する（Ｓ８４）。また、第２ＣＰＵ５２では、第１ＣＰＵ５１からの制御演算値ａ，ｂ，ｃ，ｄを受信する（Ｓ８５）。
【００７３】
第１ＣＰＵ５１では、制御演算値ａ，ｂ，ｅ，ｆを比較する（Ｓ５６）。そして、第１ＣＰＵ５１では、ａ＝ｂ＝ｅ＝ｆの場合にはＳｔａｔｕｓ１１に０を代入し、ａ＝ｅ≠ｂ＝ｆの場合にはＳｔａｔｕｓ１１に１を代入し、ａ＝ｂ＝ｅ≠ｆの場合にはＳｔａｔｕｓ１１に２を代入し、ａ＝ｂ＝ｆ≠ｅの場合にはＳｔａｔｕｓ１１に２を代入し、ａ≠ｂ＝ｅ＝ｆの場合にはＳｔａｔｕｓ１１に３を代入し、ｂ≠ａ＝ｅ＝ｆの場合にはＳｔａｔｕｓ１１に３を代入し、これら以外のパターンの場合にはＳｔａｔｕｓ１１に４を代入する（Ｓ５７）。
【００７４】
また、第１ＣＰＵ５１では、制御演算値ｃ，ｄ，ｇ，ｈを比較する（Ｓ５８）。そして、第１ＣＰＵ５１では、ｃ＝ｄ＝ｇ＝ｈの場合にはＳｔａｔｕｓ１２に０を代入し、ｃ＝ｇ≠ｄ＝ｈの場合にはＳｔａｔｕｓ１２に１を代入し、ｃ＝ｄ＝ｇ≠ｈの場合にはＳｔａｔｕｓ１２に２を代入し、ｃ＝ｄ＝ｈ≠ｇの場合にはＳｔａｔｕｓ１２に２を代入し、ｃ≠ｄ＝ｇ＝ｈの場合にはＳｔａｔｕｓ１２に３を代入し、ｄ≠ｃ＝ｇ＝ｈの場合にはＳｔａｔｕｓ１２に３を代入し、これら以外のパターンの場合にはＳｔａｔｕｓ１２に４を代入する（Ｓ５９）。
【００７５】
そして、第１ＣＰＵ５１では、Ｓｔａｔｕｓ１１とＳｔａｔｕｓ１２を第２ＣＰＵ５２に送信する（Ｓ６０）。また、第１ＣＰＵ５１では、第２ＣＰＵ５２からのＳｔａｔｕｓ２１とＳｔａｔｕｓ２２を受信する（Ｓ６１）。
【００７６】
第２ＣＰＵ５２では、制御演算値ａ，ｂ，ｅ，ｆを比較する（Ｓ８６）。そして、第２ＣＰＵ５２では、ａ＝ｂ＝ｅ＝ｆの場合にはＳｔａｔｕｓ２１に０を代入し、ａ＝ｅ≠ｂ＝ｆの場合にはＳｔａｔｕｓ２１に１を代入し、ａ＝ｂ＝ｅ≠ｆの場合にはＳｔａｔｕｓ２１に２を代入し、ａ＝ｂ＝ｆ≠ｅの場合にはＳｔａｔｕｓ２１に２を代入し、ａ≠ｂ＝ｅ＝ｆの場合にはＳｔａｔｕｓ２１に３を代入し、ｂ≠ａ＝ｅ＝ｆの場合にはＳｔａｔｕｓ２１に３を代入し、これら以外のパターンの場合にはＳｔａｔｕｓ２１に４を代入する（Ｓ８７）。
【００７７】
また、第２ＣＰＵ５２では、制御演算値ｃ，ｄ，ｇ，ｈを比較する（Ｓ８８）。そして、第２ＣＰＵ５２では、ｃ＝ｄ＝ｇ＝ｈの場合にはＳｔａｔｕｓ２２に０を代入し、ｃ＝ｇ≠ｄ＝ｈの場合にはＳｔａｔｕｓ２２に１を代入し、ｃ＝ｄ＝ｇ≠ｈの場合にはＳｔａｔｕｓ２２に２を代入し、ｃ＝ｄ＝ｈ≠ｇの場合にはＳｔａｔｕｓ２２に２を代入し、ｃ≠ｄ＝ｇ＝ｈの場合にはＳｔａｔｕｓ２２に３を代入し、ｄ≠ｃ＝ｇ＝ｈの場合にはＳｔａｔｕｓ２２に３を代入し、これら以外のパターンの場合にはＳｔａｔｕｓ２２に４を代入する（Ｓ８９）。
【００７８】
そして、第２ＣＰＵ５２では、Ｓｔａｔｕｓ２１とＳｔａｔｕｓ２２を第１ＣＰＵ５１に送信する（Ｓ９０）。また、第２ＣＰＵ５２では、第１ＣＰＵ５１からのＳｔａｔｕｓ１１とＳｔａｔｕｓ１２を受信する（Ｓ９１）。
【００７９】
第１ＣＰＵ５１では、Ｓｔａｔｕｓ１１とＳｔａｔｕｓ２１が同じか否かを判定する（Ｓ６２）。Ｓｔａｔｕｓ１１とＳｔａｔｕｓ２１が同じと判定した場合、第１ＣＰＵ５１では、Ｓｔａｔｕｓ１２とＳｔａｔｕｓ２２が同じか否かを判定する（Ｓ６３）。Ｓｔａｔｕｓ１２とＳｔａｔｕｓ２２が同じと判定した場合、第１ＣＰＵ５１では、Ｓｔａｔｕｓ１１を判別する（Ｓ６４）。Ｓｔａｔｕｓ１１が０の場合、第１ＣＰＵ５１では、制御演算値ａ（ｂ）を用いて通常のＡＢＳ制御を行う（Ｓ６５）。Ｓｔａｔｕｓ１１が１の場合、第１ＣＰＵ５１では、ＡＢＳリレーをＯＦＦするとともにＡＢＳアプリ３１Ａ，３２Ａを終了し、ＡＢＳ制御を停止する（Ｓ６６）。Ｓｔａｔｕｓ１１が２の場合、第１ＣＰＵ５１では、制御演算値ａ（ｂ）を用いてＡＢＳ制御を続行する（Ｓ６７）。Ｓｔａｔｕｓ１１が３の場合、第１ＣＰＵ５１では、何も行わない（Ｓ６８）。さらに、第１ＣＰＵ５１では、Ｓｔａｔｕｓ１２を判別する（Ｓ７０）。Ｓｔａｔｕｓ１２が０の場合、第１ＣＰＵ５１では、制御演算値ｃ（ｄ）を用いて通常のＡＣＣ制御を行う（Ｓ７１）。Ｓｔａｔｕｓ１２が１の場合、第１ＣＰＵ５１では、ＡＣＣアプリ３１Ｂ，３２Ｂを再起動する（Ｓ７２）。Ｓｔａｔｕｓ１２が２の場合、第１ＣＰＵ５１では、制御演算値ｃ（ｄ）を用いてＡＣＣ制御を続行する（Ｓ７３）。Ｓｔａｔｕｓ１２が３の場合、第１ＣＰＵ５１では、何も行わない（Ｓ７４）。Ｓｔａｔｕｓ１１が４の場合又はＳｔａｔｕｓ１２が４の場合又はＳ６２の判定でＳｔａｔｕｓ１１とＳｔａｔｕｓ２１が異なると判定した場合又はＳ６３の判定でＳｔａｔｕｓ１２とＳｔａｔｕｓ２２が異なると判定した場合、第１ＣＰＵ５１では、システムをシャットダウンするかあるいは電源をＯＦＦし、システムを停止する（Ｓ６９，Ｓ７５）。
【００８０】
第２ＣＰＵ５２では、Ｓｔａｔｕｓ２１とＳｔａｔｕｓ１１が同じか否かを判定する（Ｓ９２）。Ｓｔａｔｕｓ２１とＳｔａｔｕｓ１１が同じと判定した場合、第２ＣＰＵ５２では、Ｓｔａｔｕｓ２２とＳｔａｔｕｓ１２が同じか否かを判定する（Ｓ９３）。Ｓｔａｔｕｓ２２とＳｔａｔｕｓ１２が同じと判定した場合、第２ＣＰＵ５２では、Ｓｔａｔｕｓ２１を判別する（Ｓ９４）。Ｓｔａｔｕｓ２１が０の場合、第２ＣＰＵ５２では、第１ＣＰＵ５１側で通常のＡＢＳ制御を行っているので、何も行わない（Ｓ９５）。Ｓｔａｔｕｓ２１が１の場合、第２ＣＰＵ５２では、ＡＢＳリレーをＯＦＦするとともにＡＢＳアプリ３１Ａ，３２Ａを終了し、ＡＢＳ制御を停止する（Ｓ９６）。Ｓｔａｔｕｓ２１が２の場合、第２ＣＰＵ５２では、何も行わない（Ｓ９７）。Ｓｔａｔｕｓ２１が３の場合、第２ＣＰＵ５２では、制御演算値ｅ（ｆ）を用いてＡＢＳ制御を続行する（Ｓ９８）。さらに、第２ＣＰＵ５２では、Ｓｔａｔｕｓ２２を判別する（Ｓ１００）。Ｓｔａｔｕｓ２２が０の場合、第２ＣＰＵ５２では、第１ＣＰＵ５１側で通常のＡＣＣ制御を行っているので、何も行わない（Ｓ１０１）。Ｓｔａｔｕｓ２２が１の場合、第２ＣＰＵ５２では、ＡＣＣアプリ３１Ｂ，３２Ｂを再起動する（Ｓ１０２）。Ｓｔａｔｕｓ２２が２の場合、第２ＣＰＵ５２では、何も行わない（Ｓ１０３）。Ｓｔａｔｕｓ２２が３の場合、第２ＣＰＵ５２では、制御演算値ｇ（ｈ）を用いてＡＣＣ制御を続行する（Ｓ１０４）。Ｓｔａｔｕｓ２１が４の場合又はＳｔａｔｕｓ２２が４の場合又はＳ９２の判定でＳｔａｔｕｓ２１とＳｔａｔｕｓ１１が異なると判定した場合又はＳ９３の判定でＳｔａｔｕｓ２２とＳｔａｔｕｓ１２が異なると判定した場合、第２ＣＰＵ５２では、システムをシャットダウンするかあるいは電源をＯＦＦし、システムを停止する（Ｓ９９，Ｓ１０５）。
【００８１】
このＥＣＵ２によれば、ＡＢＳ側について第１ＯＳ４１と第２ＯＳ４２に異なるコンパイラ２１，２２でそれぞれ変換された第１ＡＢＳアプリ３１Ａと第２ＡＢＳアプリ３２Ａをそれぞれ配置して４通りの組み合わせでの４つの制御演算値ａ，ｂ，ｅ，ｆを比較し、ＡＣＣ側についても第１ＯＳ４１と第２ＯＳ４２に異なるコンパイラ２１，２２でそれぞれ変換された第１ＡＣＣアプリ３１Ｂと第２ＡＣＣアプリ３２Ｂをそれぞれ配置して４通りの組み合わせでの４つの制御演算値ｃ，ｄ，ｇ，ｈを比較することにより、ＯＳ４１，４２のバグかあるいはコンパイラ２１，２２のバグかを判別することができる。これによって、コンパイラ２１，２２にバグが有る場合にはコンパイラ異常時のファイルセーフ処理（例えば、安全システムであるＡＢＳ側ではＡＢＳ制御停止、運転支援システムであるＡＣＣ側ではＡＣＣアプリ再起動）を実施し、ＯＳ４１，４２にバグが有る場合にはＯＳ異常時のファイルセーフ処理を実施できる。特に、ＯＳ４１，４２にバグが有る場合にどちらのＯＳにバグが有るかを判別できるときには、正常のＯＳでＡＢＳ制御及びＡＣＣ制御を継続することができる。
【００８２】
図１２及び図１３を参照して、第３の実施の形態に係るＡＢＳシステムのＥＣＵ３について説明する。図１２は、第３の実施の形態に係るＡＢＳシステムのＥＣＵの構成図である。図１３は、図１２のＥＣＵにおける２個のコンパイラと２個のＯＳの組み合わせによる各制御演算値の比較の判別パターンの一覧表である。
【００８３】
ＥＣＵ３は、電子制御ユニットであり、ＡＢＳシステムを統括制御する。ＥＣＵ３は、ソフトウエアとしてＡＢＳアプリ１０、第１コンパイラ２１と第２コンパイラ２２、第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２、第１ＯＳ４１と第２ＯＳ４２を有している。また、ＥＣＵ３は、ハードウエアとして第１ＣＰＵ５１と第２ＣＰＵ５２、ＲＯＭ、ＲＡＭなどを備えている。さらに、ＥＣＵ３は、各ＣＰＵ５１，５２で各アプリが実行されることによって比較部６３，出力処理部７３が構成される。この比較部６３と出力処理部７３は、第１ＣＰＵ５１側と第２ＣＰＵ５２側の両方に構成され、両側で同様の処理がそれぞれ行われる。
【００８４】
なお、第３の実施の形態では、第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２が特許請求の範囲に記載する第１アプリケーションと第２アプリケーションに相当し、第１ＯＳ４１と第２ＯＳ４２が特許請求の範囲に記載する第１動作環境と第２動作環境に相当し、比較部６３が特許請求の範囲に記載する処理結果比較手段に相当する。
【００８５】
ＥＣＵ３は、第１の実施の形態に係るＥＣＵ１と比較すると、第１ＣＰＵ５１側の構成は同じであり、第２ＣＰＵ５２側の構成が異なるので、その構成についてのみ説明する。第１ＡＢＳアプリ３１は第１ＯＳ４１（第１ＣＰＵ５１）及び第２ＯＳ４２（第１ＣＰＵ５２）上にそれぞれ搭載されるが、第２ＡＢＳアプリ３２は第１ＯＳ４１（第１ＣＰＵ５１）上にのみ搭載される。したがって、第２ＣＰＵ５２では、第１ＡＢＳアプリ３１に所定のデータ（第１ＣＰＵ５１側で入力される所定のデータと同じデータ）が入力される毎に、第２ＯＳ４２上で第１ＡＢＳアプリ３１だけを実行し、制御演算値ｃだけを出力する。
【００８６】
比較部６３では、制御演算値ａ，ｂ，ｃを比較し、制御演算値ａ，ｂ，ｃが同じ値かあるいは異なる値かによって図１３に示す判別パターンに従って各判定処理を行う。
【００８７】
ａ，ｂ，ｃ全て同じ値の場合、比較部６３では、第１コンパイラ２１（第１ＡＢＳアプリ３１）と第２コンパイラ２２（第２ＡＢＳアプリ３２）及び第１ＯＳ４１と第２ＯＳ４２にバグが無いと判断し、通常のＡＢＳ制御を行うと判定する。
【００８８】
ａとｃが同じ値であり、ｂだけが異なる値の場合、比較部６３では、第１ＯＳ４１と第２ＯＳ４２にはバグが無いが第１コンパイラ２１と第２コンパイラ２２のいずれか一方にバグが有ると判断もでき、第１コンパイラ２１と第２コンパイラ２２及び第２ＯＳ４２にバグが無いが第１ＯＳ４１にバグが有ると判断もできる。この場合、比較部６３では、安全側の処理としてＡＢＳ制御を停止すると判定する。
【００８９】
ａとｂが同じ値であり、ｃだけが異なる値の場合、比較部６３では、第１コンパイラ２１と第２コンパイラ２２にはバグが無いが、第１ＯＳ４１と第２ＯＳ４２のいずれか一方にバグが有ると判断する。この場合、ＯＳ４１，４２のどちらが正常に実行できないのか判別できないので、比較部６３では、安全側の処理としてシステムを停止すると判定する。
【００９０】
ｂとｃが同じ値であり、ａだけが異なる値の場合、比較部６３では、第１コンパイラ２１と第２コンパイラ２２及び第２ＯＳ４２にはバグが無いが、第１ＯＳ４１にバグが有ると判断する。この場合、第１ＯＳ４１だけが正常に実行できないと判別できているので、比較部６３では、正常な第２ＯＳ４２側だけでＡＢＳ制御を続行すると判定する。なお、第１ＯＳ４１の一部にバグが有るが、第１ＯＳ４１の正常に動作している部分で第２ＡＢＳアプリ３２が実行されたので、ｂとｃが同じ値になったと推定できる。
【００９１】
なお、上記以外のパターンの場合、第１の実施の形態で記載したように、極めて稀であり、無視できるが、このパターンに万が一なった場合には安全側の処理としてシステムを停止するとよい。
【００９２】
出力処理部７３は、第１の実施の形態で説明した出力処理部７１と同様の処理を行うので、説明を省略する。ただし、出力処理部７３では、第１ＯＳ４１側だけでＡＢＳ制御を続行する場合の出力処理はない。
【００９３】
図１２及び図１３を参照して、ＥＣＵ３でのフェイルセーフ処理の流れについて説明する。特に、第１ＣＰＵ５１側での処理については図１４のフローチャートに沿って説明し、第２ＣＰＵ５２側での処理については図１５のフローチャートに沿って説明する。図１４は、図１２のＥＣＵにおける第１ＣＰＵでの処理の流れを示すフローチャートである。図１５は、図１２のＥＣＵにおける第２ＣＰＵでの処理の流れを示すフローチャートである。
【００９４】
ＡＢＳシステムが起動され、データが入力される毎に、第１ＣＰＵ５１では第１ＯＳ４１上で第１ＡＢＳアプリ３１及び第２ＡＢＳアプリ３２が実行され、第２ＣＰＵ５２では第２ＯＳ４２上で第１ＡＢＳアプリ３１が実行される。
【００９５】
第１ＣＰＵ５１では、第１ＡＢＳアプリ３１による制御演算値ａを出力するとともに（Ｓ１１０）、第２ＡＢＳアプリ３２による制御演算値ｂを出力する（Ｓ１１１）。そして、第１ＣＰＵ５１では、制御演算値ａ，ｂを第２ＣＰＵ５２に送信する（Ｓ１１２）。また、第１ＣＰＵ５１では、第２ＣＰＵ５２からの制御演算値ｃを受信する（Ｓ１１３）。
【００９６】
第２ＣＰＵ５２では、第１ＡＢＳアプリ３１による制御演算値ｃを出力する（Ｓ１３０）。そして、第２ＣＰＵ５２では、制御演算値ｃを第１ＣＰＵ５１に送信する（Ｓ１３１）。また、第２ＣＰＵ５２では、第１ＣＰＵ５１からの制御演算値ａ，ｂを受信する（Ｓ１３２）。
【００９７】
第１ＣＰＵ５１では、制御演算値ａ，ｂ，ｃを比較する（Ｓ１１４）。そして、第１ＣＰＵ５１では、ａ＝ｂ＝ｃの場合にはＳｔａｔｕｓ１に０を代入し、ａ＝ｃ≠ｂの場合にはＳｔａｔｕｓ１に１を代入し、ａ≠ｂ＝ｃの場合にはＳｔａｔｕｓ１に２を代入し、ａ＝ｂ≠ｃの場合にはＳｔａｔｕｓ１に３を代入し、これら以外のパターンの場合にはＳｔａｔｕｓ１に４を代入する（Ｓ１１５）。そして、第１ＣＰＵ５１では、Ｓｔａｔｕｓ１を第２ＣＰＵ５２に送信する（Ｓ１１６）。また、第１ＣＰＵ５１では、第２ＣＰＵ５２からのＳｔａｔｕｓ２を受信する（Ｓ１１７）。
【００９８】
第２ＣＰＵ５２では、制御演算値ａ，ｂ，ｃを比較する（Ｓ１３３）。そして、第２ＣＰＵ５２では、ａ＝ｂ＝ｃの場合にはＳｔａｔｕｓ２に０を代入し、ａ＝ｃ≠ｂの場合にはＳｔａｔｕｓ２に１を代入し、ａ≠ｂ＝ｃの場合にはＳｔａｔｕｓ２に２を代入し、ａ＝ｂ≠ｃの場合にはＳｔａｔｕｓ２に３を代入し、これら以外のパターンの場合にはＳｔａｔｕｓ２に４を代入する（Ｓ１３４）。そして、第２ＣＰＵ５２では、Ｓｔａｔｕｓ２を第１ＣＰＵ５１に送信する（Ｓ１３５）。また、第２ＣＰＵ５２では、第１ＣＰＵ５１からのＳｔａｔｕｓ１を受信する（Ｓ１３６）。
【００９９】
第１ＣＰＵ５１では、Ｓｔａｔｕｓ１とＳｔａｔｕｓ２が同じか否かを判定する（Ｓ１１８）。Ｓｔａｔｕｓ１とＳｔａｔｕｓ２が同じと判定した場合、第１ＣＰＵ５１では、Ｓｔａｔｕｓ１を判別する（Ｓ１１９）。Ｓｔａｔｕｓ１が０の場合、第１ＣＰＵ５１では、制御演算値ａ（ｂ）を用いて通常のＡＢＳ制御を行う（Ｓ１２０）。Ｓｔａｔｕｓ１が１の場合、第１ＣＰＵ５１では、ＡＢＳリレーをＯＦＦするとともにＡＢＳアプリ３１，３２を終了し、ＡＢＳ制御を停止する（Ｓ１２１）。Ｓｔａｔｕｓ１が２の場合、第１ＣＰＵ５１では、何も行わない（Ｓ１２２）。Ｓｔａｔｕｓ１が３あるいは４の場合又はＳ１１８の判定でＳｔａｔｕｓ１とＳｔａｔｕｓ２が異なると判定した場合、第１ＣＰＵ５１では、システムをシャットダウンするかあるいは電源をＯＦＦし、システムを停止する（Ｓ１２３）。
【０１００】
第２ＣＰＵ５２では、Ｓｔａｔｕｓ２とＳｔａｔｕｓ１が同じか否かを判定する（Ｓ１３７）。Ｓｔａｔｕｓ２とＳｔａｔｕｓ１が同じと判定した場合、第２ＣＰＵ５２では、Ｓｔａｔｕｓ２を判別する（Ｓ１３８）。Ｓｔａｔｕｓ２が０の場合、第２ＣＰＵ５２では、第１ＣＰＵ５１側で通常のＡＢＳ制御を行っているので、何も行わない（Ｓ１３９）。Ｓｔａｔｕｓ２が１の場合、第２ＣＰＵ５２では、ＡＢＳリレーをＯＦＦするとともにＡＢＳアプリ３１を終了し、ＡＢＳ制御を停止する（Ｓ１４０）。Ｓｔａｔｕｓ２が２の場合、第２ＣＰＵ５２では、制御演算値ｃを用いてＡＢＳ制御を続行する（Ｓ１４１）。Ｓｔａｔｕｓ２が３あるいは４の場合又はＳ１３７の判定でＳｔａｔｕｓ２とＳｔａｔｕｓ１が異なると判定した場合、第２ＣＰＵ５２では、システムをシャットダウンするかあるいは電源をＯＦＦし、システムを停止する（Ｓ１４２）。
【０１０１】
このＥＣＵ３によれば、第１ＯＳ４１に異なるコンパイラ２１，２２でそれぞれ変換された第１ＡＢＳアプリ３１と第２ＡＢＳアプリ３２をそれぞれ配置するとともに第２ＯＳ４２にコンパイラ２１で変換された第１ＡＢＳアプリ３１を配置し、３通りの組み合わせでの３つの制御演算値ａ，ｂ，ｃを比較することにより、ＯＳ４１，４２のバグかあるいはコンパイラ２１，２２のバグかを判別することができる。これによって、コンパイラ２１，２２にバグが有る場合にはコンパイラ異常時のファイルセーフ処理を実施し、ＯＳ４１，４２にバグが有る場合にはＯＳ異常時のファイルセーフ処理を実施できる。特に、ＯＳ４１，４２にバグが有る場合にどちらのＯＳにバグが有るかを判別できるときには、正常のＯＳでＡＢＳ制御を継続することができる。
【０１０２】
以上、本発明に係る実施の形態について説明したが、本発明は上記実施の形態に限定されることなく様々な形態で実施される。
【０１０３】
例えば、本実施の形態では車両に搭載されるシステムに適用したが、複数の動作環境と、複数のコンパイラによって変換された複数のアプリケーションとを有する情報処理装置であれば他の装置にも適用可能である。また、各種制御などを行うことなく、コンパイラ及び動作環境のバグ検出だけを行う装置にも適用可能である。
【０１０４】
また、本実施の形態では２個のＣＰＵ、２個のＯＳ、２個のコンパイラ（ひいては、２個のコンパイラによってそれぞれ生成される２個のマシン語プログラム）を有するシステムに適用したが、３個以上のＣＰＵ、３個以上のＯＳ、３個以上のコンパイラを有するシステムにも適用可能である。また、演算装置としては、ＣＰＵの代わりに、ＣＰＵコアなどでもよい。
【０１０５】
また、本実施の形態では１つのＥＣＵでＡＢＳシステム又はＡＢＳシステムとＡＣＣシステムの制御を行う構成としたが、１つのＥＣＵで３つ以上のシステムの制御を行う場合にも適用可能である。
【０１０６】
また、本実施の形態ではコンパイラ及びＯＳのバグ検出を常時行う構成としたが、１回又は数回だけ行うようにしてもよい。また、本実施の形態では車両に搭載されるＥＣＵでコンパイラ及びＯＳのバグ検出を行う構成としたが、開発時に同様の処理によってコンパイラ及びＯＳのバグ検出を予め行い、コンパイラ又はコンパイラのバグが検出された場合にはそのコンパイラ又はＯＳを交換やバグ取りを予めするようにしてもよい。
【０１０７】
また、本実施の形態では同一のアプリケーションのソースコードが異なるコンパイラによってそれぞれ変換されたアプリケーション（マシン語プログラム）に適用したが、コンパイラによって作られないアプリケーションにも適用可能である。
【符号の説明】
【０１０８】
１，２，３…ＥＣＵ、１０，１０Ａ…ＡＢＳアプリ、１０Ｂ…ＡＣＣアプリ、２１…第１コンパイラ、２２…第２コンパイラ、３１，３１Ａ…第１ＡＢＳアプリ、３２，３２Ａ…第２ＡＢＳアプリ、３１Ｂ…第１ＡＣＣアプリ、３２Ｂ…第２ＡＣＣアプリ、４１…第１ＯＳ、４２…第２ＯＳ、５１…第１ＣＰＵ、５２…第２ＣＰＵ、６１，６２，６３…比較部、７１，７２，７３…出力処理部
【図１】
2010282551.tif 000003
【図２】
2010282551.tif 000004
【図３】
2010282551.tif 000005
【図４】
2010282551.tif 000006
【図５】
2010282551.tif 000007
【図６】
2010282551.tif 000008
【図７】
2010282551.tif 000009
【図８】
2010282551.tif 000010
【図９】
2010282551.tif 000011
【図１０】
2010282551.tif 000012
【図１１】
2010282551.tif 000013
【図１２】
2010282551.tif 000014
【図１３】
2010282551.tif 000015
【図１４】
2010282551.tif 000016
【図１５】
2010282551.tif 000017
【図１６】
2010282551.tif 000018
【図１７】
2010282551.tif 000019