(57)【要約】    【課題】  複数のプロセッサコアを含んで構成されるマルチコア型演算処理ユニットを用いて内燃機関の作動を制御する制御装置において、各プロセッサコアにおける演算処理の割当を適切に行い、割込処理周期の短縮やプロセッサコアの異常に適切に対応する。    【解決手段】  複数のプロセッサコアＣ１〜Ｃ４のうちのアクティブコアＣ１，Ｃ３が機関制御に必要な演算処理を実行する。機関回転数が高くなって割込処理周期が短縮し、アクティブコアＣ１，Ｃ３の演算負荷率が判定閾値ＲＬＴＨを超えたときは、実行すべき演算処理の一部をバックアップコアＣ２，Ｃ４に実行させることにより、実行すべき演算処理の遅れや抜けを防止する。アクティブコアＣ１，Ｃ３に異常が発生した場合においては、実行すべき演算処理の全部をバックアップコアＣ２，Ｃ４が実行し、プロセッサコアの異常に対するロバスト性を高める。【選択図】  図４
2016023603.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサコアを含んで構成されるマルチコア型演算処理ユニットを用いて内燃機関の作動を制御する内燃機関の制御装置であって、
前記複数のプロセッサコアは、前記機関の制御に必要な所定演算処理を実行するために設けられたアクティブコアと、前記所定演算処理の一部または全部を前記アクティブコアに代わって実行するために設けられたバックアップコアとによって構成され、
前記アクティブコアは、実行すべき演算処理の負荷が所定閾値を超えたときは、前記所定演算処理の一部を前記バックアップコアに実行させることを特徴とする内燃機関の制御装置。
【請求項２】
前記アクティブコア及びバックアップコアは、前記マルチコア型演算処理ユニットの起動時にそれぞれ自己の異常判定処理を実行し、前記アクティブコアに異常があると判定したときは前記アクティブコアは作動を休止し、前記バックアップコアは、前記アクティブコアが作動を休止したときは、前記アクティブコアに代わって前記所定演算処理を実行することを特徴とする請求項１に記載の内燃機関の制御装置。
【請求項３】
前記複数のプロセッサコアは、前記機関のクランク軸の第１所定回転角度毎に第１割込処理を実行するとともに所定時間毎に第１定期処理を実行する第１アクティブコア、及び該第１アクティブコアに対応する第１バックアップコアからなる第１コア対と、前記第１所定回転角度より大きい第２所定回転角度毎に第２割込処理を実行するとともに前記所定時間毎に第２定期処理を実行する第２アクティブコア、及び該第２アクティブコアに対応する第２バックアップコアからなる第２コア対とで構成されることを特徴とする請求項１または２に記載の内燃機関の制御装置。
【請求項４】
前記第１及び第２コア対の一方のコア対を構成する２つのプロセッサコアの両方に異常があるときは、他方のコア対が前記一方のコア対が実行すべき演算処理を実行することを特徴とする請求項３に記載の内燃機関の制御装置。
【請求項５】
前記第１及び第２アクティブコアはそれぞれ前記所定時間の２倍の周期でトリガ信号を生成して相互に供給するトリガ信号生成処理を実行し、前記マルチコア型演算処理ユニットの起動時において、前記第２アクティブコアにおける最初の第２定期処理の開始時期を、前記第１アクティブコアにおける最初の第１定期処理の開始時期より前記所定時間だけ遅らせ、
前記第１及び第２アクティブコアは、前記トリガ信号に同期してそれぞれ前記第１及び第２定期処理を実行し、前記第１アクティブコアに異常があるときは、前記第１バックアップコアが前記トリガ信号生成処理を実行し、前記第２アクティブコアに異常があるときは、前記第２バックアップコアが前記トリガ信号生成処理を実行することを特徴とする請求項３または４に記載の内燃機関の制御装置。
【請求項６】
複数のプロセッサコアを含んで構成されるマルチコア型演算処理ユニットを用いて内燃機関の作動を制御する内燃機関の制御装置であって、
前記複数のプロセッサコアは、前記機関の制御に必要な第１所定演算処理を所定時間毎に実行する第１コアと、前記機関の制御に必要な第２所定演算処理を前記所定時間毎に実行する第２コアとを含み、
前記第１及び第２所定演算処理は、前記所定時間の２倍の周期でトリガ信号を生成して相互に供給するトリガ信号生成処理を含み、前記マルチコア型演算処理ユニットの起動時において、前記第２コアにおける最初の第２所定演算処理の開始時期を、前記第１コアにおける最初の第１所定演算処理の開始時期より前記所定時間だけ遅らせ、
前記第１及び第２コアは、前記トリガ信号に同期してそれぞれ前記第１及び第２所定演算処理を実行し、
前記第１及び第２コアの一方に異常が発生し、該一方のコアが前記トリガ信号の生成を停止したときに他方のコアが、前記一方のコアが実行すべき所定演算処理を実行することを特徴とする内燃機関の制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、内燃機関の制御装置に関し、特に複数のプロセッサコアを含んで構成されるマルチコア型演算処理ユニットを用いて内燃機関の作動を制御する制御装置に関する。
【背景技術】
【０００２】
特許文献１にはマルチプロセッサを搭載した、内燃機関の制御装置が示されており、この制御装置では、複数のプロセッサによってクランク角に同期した割込処理が順番に処理され、複数のプロセッサの演算負荷が均等となるように演算処理の割当が行われる。
【０００３】
特許文献２は、特許文献１に示された制御装置を改良した制御装置を開示する。この装置によれば、複数のプロセッサによってクランク角に同期した割込処理が順番に処理されるとともに、今回の割込処理タイミングの１つ前の割込処理タイミングにおいて、各種センサからの入力データの取り込みが行われ、今回の割込処理タイミングにおける演算処理において、前回取り込んだ入力データ及び今回取り込んだ入力データをともに使用するように制御される。これによって、複数のプロセッサ間での情報共有処理を低減し、処理速度を高めることができる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１０−１９６６１９号公報
【特許文献２】特開２０１３−１４７９９８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上記特許文献１，２に示された装置では、内燃機関の制御に必要な演算処理を複数のプロセッサに均等に割り当てる制御が行われるが、複数のプロセッサのうちの一部に異常が発生する場合が考慮されていない。そのため、例えば１つのプロセッサに異常が発生した場合には、そのプロセッサが実行すべき割込処理が実行されず、機関の動作に不具合が発生するおそれがある。すなわち、上記従来の装置では、複数のプロセッサの演算負荷を均等にすることはできるが、制御装置の信頼性の点で改善の余地があった。
【０００６】
本発明はこの点に着目してなされたものであり、複数のプロセッサコアを含んで構成されるマルチコア型演算処理ユニットを用いて内燃機関の作動を制御する制御装置であって、各プロセッサコアにおける演算処理の割当を適切に行い、割込処理周期の短縮やプロセッサコアの故障に適切に対応することできる制御装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記目的を達成するため請求項１に記載の発明は、複数のプロセッサコア（Ｃ１〜Ｃ４）を含んで構成されるマルチコア型演算処理ユニット（２２）を用いて内燃機関の作動を制御する内燃機関の制御装置であって、前記複数のプロセッサコアは、前記機関の制御に必要な所定演算処理を実行するために設けられたアクティブコア（Ｃ１，Ｃ３）と、前記所定演算処理の一部または全部を前記アクティブコアに代わって実行するために設けられたバックアップコア（Ｃ２，Ｃ４）とによって構成され、前記アクティブコア（Ｃ１，Ｃ３）は、実行すべき演算処理の負荷（ＲＬＣ１，ＲＬＣ３）が所定閾値（ＲＬＴＨ）を超えたときは、前記所定演算処理の一部を前記バックアップコア（Ｃ２，Ｃ４）に実行させることを特徴とする。
【０００８】
この構成によれば、複数のプロセッサコアのうちのアクティブコアが所定演算処理を実行するが、例えば機関回転数が高くなって割込処理周期が短縮すると、アクティブコアの演算負荷（最大処理能力に対する要求演算量の割合）が増加し、実行すべき演算処理の遅れや抜けが発生する。したがって、演算負荷が所定閾値を超えたときは、所定演算処理の一部をバックアップコアに実行させることにより、実行すべき演算処理の遅れや抜けを防止すること可能となる。また、アクティブコアに異常が発生した場合においては、所定演算処理の全部をバックアップコアが実行することもできるので、演算負荷の変動やプロセッサコアの異常に対するロバスト性を高めることができる。また、アクティブコアの演算負荷が所定閾値以下であるときは、バックアップコアを休止させることができるので、消費電力を低減できる。
【０００９】
請求項２に記載の発明は、請求項１に記載の内燃機関の制御装置において、前記アクティブコア（Ｃ１，Ｃ３）及びバックアップコア（Ｃ２，Ｃ４）は、前記マルチコア型演算処理ユニット（２２）の起動時にそれぞれ自己の異常判定処理を実行し、前記アクティブコア（Ｃ１，Ｃ３）に異常があると判定したときは前記アクティブコアは作動を休止し、前記バックアップコア（Ｃ２，Ｃ４）は、前記アクティブコアが作動を休止したときは、前記アクティブコアに代わって前記所定演算処理を実行することを特徴とする。
【００１０】
この構成によれば、アクティブコア及びバックアップコアのそれぞれにおいて、マルチコア型演算処理ユニットの起動時に自己の異常判定処理が実行され、アクティブコアに異常があると判定したときはアクティブコアは作動を休止し、所定演算処理はバックアップコアによって実行される。したがって、所定演算処理を実行すべきアクティブコアに異常が発生した場合でも、機関の作動制御を継続することができる。また、異常判定処理をマルチコア型演算処理ユニットの起動時に実行するようにしたので、通常制御の演算に影響を与えることなく、異常判定を行うことができる。
なお、本明細書では、「プロセッサコアで異常が発生する」ことを「プロセッサコアが故障する」ともいう。
【００１１】
請求項３に記載の発明は、請求項１または２に記載の内燃機関の制御装置において、前記複数のプロセッサコアは、前記機関のクランク軸の第１所定回転角度（ＣＡＣＲＫ）毎に第１割込処理（ＣＲＫ割込処理）を実行するとともに所定時間（ＴＣＡＬ）毎に第１定期処理を実行する第１アクティブコア（Ｃ１）、及び該第１アクティブコアに対応する第１バックアップコア（Ｃ２）からなる第１コア対と、前記第１所定回転角度（ＣＡＣＲＫ）より大きい第２所定回転角度（ＣＡＴＤＣ）毎に第２割込処理（ＴＤＣ割込処理）を実行するとともに前記所定時間（ＴＣＡＬ）毎に第２定期処理を実行する第２アクティブコア（Ｃ３）、及び該第２アクティブコアに対応する第２バックアップコア（Ｃ４）からなる第２コア対とで構成されることを特徴とする。
【００１２】
この構成によれば、アクティブコア及びバックアップコアからなる２つのコア対のそれぞれによって、機関制御に必須のクランク角度同期処理と、所定時間毎の定期処理とが実行されるため、一方のコア対が他方のコア対をバックアップすることが可能となり、より信頼性を高めることができる。また例えば同一の処理（例えば機関の出力トルクを算出する処理）を異なるタイミングでかつ、異なる検出パラメータを用いて実行することが可能となるので、２つの演算結果を比較することで、例えば出力トルク算出に適用するパラメータを検出するセンサの異常を判定するといった処理を付加的に行うことができる。
【００１３】
請求項４に記載の発明は、請求項３に記載の内燃機関の制御装置において、前記第１及び第２コア対の一方のコア対を構成する２つのプロセッサコアの両方に異常があるときは、他方のコア対が前記一方のコア対が実行すべき演算処理を実行することを特徴とする。
【００１４】
この構成によれば、コア対を構成する２つのプロセッサコアがともに故障するというような事態が発生しても、故障していないコア対によって機関の作動制御を継続することが可能となる。
【００１５】
請求項５に記載の発明は、請求項３または４に記載の内燃機関の制御装置において、前記第１及び第２アクティブコア（Ｃ１，Ｃ３）はそれぞれ前記所定時間（ＴＣＡＬ）の２倍の周期（ＴＣＡＬ２）でトリガ信号（ＳＴＲＧ１，ＳＴＲＧ２）を生成して相互に供給するトリガ信号生成処理を実行し、前記マルチコア型演算処理ユニット（２２）の起動時において、前記第２アクティブコア（Ｃ３）における最初の第２定期処理の開始時期を、前記第１アクティブコア（Ｃ１）における最初の第１定期処理の開始時期より前記所定時間（ＴＣＡＬ）だけ遅らせ、前記第１及び第２アクティブコア（Ｃ１，Ｃ３）は、前記トリガ信号（ＳＴＲＧ１，ＳＴＲＧ２）に同期してそれぞれ前記第１及び第２定期処理を実行し、前記第１アクティブコア（Ｃ１）に異常があるときは、前記第１バックアップコア（Ｃ２）が前記トリガ信号生成処理を実行し、前記第２アクティブコア（Ｃ３）に異常があるときは、前記第２バックアップコア（Ｃ４）が前記トリガ信号生成処理を実行することを特徴とする。
【００１６】
この構成によれば、第１定期処理が所定時間毎に第１アクティブコアによって実行され、第２定期処理が所定時間毎に第２アクティブコアによって実行される。所定時間の２倍の周期でトリガ信号を生成して相互に供給するトリガ信号生成処理が第１アクティブコア及び第２アクティブコアの双方で実行され、マルチコア型演算処理ユニットの起動時において、第２アクティブコアにおける最初の第２定期処理の開始時期が第１アクティブコアにおける最初の第１定期処理の開始時期より所定時間だけ遅れるため、最初に第１アクティブコアでトリガ信号が生成され、その生成時期から所定時間後に第２アクティブコアでトリガ信号が生成され、以後は所定時間毎に第１アクティブコアまたは第２アクティブコアでトリガ信号が生成され、そのトリガ信号に同期してそれぞれ第１及び第２定期処理が実行される。また第１アクティブコアに異常があるときは、第１バックアップコアによってトリガ信号生成処理が実行され、第２アクティブコアに異常があるときは、第２バックアップコアによってトリガ信号生成処理が実行される。
【００１７】
したがって、例えば第１コア対を構成する２つのコアの両方で異常が発生したときは、第１コア対によるトリガ信号の生成が行われなくなるため、トリガ信号の周期が２倍となる。演算周期が２倍となるため、第２コア対は、第１コア対及び第２コア対が実行すべき演算処理のほぼ全部（第１割込処理の一部を除く）を実行可能となり、制御速度が遅くなるものの機関が作動不能となる事態を回避することができる。
【００１８】
請求項６に記載の発明は、複数のプロセッサコア（Ｃ１，Ｃ３）を含んで構成されるマルチコア型演算処理ユニットを用いて内燃機関の作動を制御する内燃機関の制御装置であって、前記複数のプロセッサコアは、前記機関の制御に必要な第１所定演算処理を所定時間（ＴＣＡＬ）毎に実行する第１コア（Ｃ１）と、前記機関の制御に必要な第２所定演算処理を前記所定時間（ＴＣＡＬ）毎に実行する第２コア（Ｃ３）とを含み、前記第１及び第２所定演算処理は、前記所定時間の２倍の周期（ＴＣＡＬ２）でトリガ信号を生成して相互に供給するトリガ信号生成処理を含み、前記マルチコア型演算処理ユニット（２２）の起動時において、前記第２コア（Ｃ３）における最初の第２所定演算処理の開始時期を、前記第１コア（Ｃ１）における最初の第１所定演算処理の開始時期より前記所定時間（ＴＣＡＬ）だけ遅らせ、前記第１及び第２コアは、前記トリガ信号に同期してそれぞれ前記第１及び第２所定演算処理を実行し、前記第１及び第２コアの一方に異常が発生し、該一方のコアが前記トリガ信号の生成を停止したときに他方のコアが、前記一方のコアが実行すべき所定演算処理を実行することを特徴とする。
【００１９】
この構成によれば、第１所定演算処理が所定時間毎に第１コアによって実行され、第２所定演算処理が所定時間毎に第２コアによって実行される。所定時間の２倍の周期でトリガ信号を生成して相互に供給するトリガ信号生成処理が第１コア及び第２コアの双方で実行され、マルチコア型演算処理ユニットの起動時において、第２コアにおける最初の第２所定演算処理の開始時期が第１コアにおける最初の第１所定演算処理の開始時期より所定時間だけ遅れるため、最初に第１コアでトリガ信号が生成され、その生成時期から所定時間後に第２コアでトリガ信号が生成され、以後は所定時間毎に第１コアまたは第２コアでトリガ信号が生成され、そのトリガ信号に同期してそれぞれ第１及び第２所定演算処理が実行される。第１及び第２コアの一方、例えば第１コアに異常が発生したときは、第２コアによって第１及び第２所定演算処理がともに実行される。このとき、第１コアによるトリガ信号の生成は行われないため、第１及び第２所定演算処理が、所定時間の２倍の周期で第２コアによって実行されるようになる。演算周期が２倍となるため、第２コアで２つの演算処理をともに実行可能となり、制御速度が遅くなるものの機関が作動不能となる事態を回避することができる。
【図面の簡単な説明】
【００２０】
【図１】本発明の一実施形態にかかる内燃機関及びその制御装置の構成を示す図である。
【図２】図１に示す電子制御ユニットの構成を示すブロック図である。
【図３】割込処理を起動するパルス信号を示す図である。
【図４】図２に示すプロセッサコア（Ｃ１〜Ｃ４）による典型的な演算処理動作例を説明するためのタイムチャートである。
【図５】図２に示すプロセッサコア（Ｃ１〜Ｃ４）で実行すべき演算処理を分類して示す図である。
【図６】図５に示す定期処理の起動トリガ信号（ＳＴＲＧ）の生成方法を説明するためのタイムチャートである。
【図７】内燃機関の運転状態と、プロセッサコアの演算負荷率（ＲＬ）との関係を説明するための図である。
【図８】特定のプロセッサコア（Ｃ１，Ｃ２）がともに故障した場合における、内燃機関の運転状態と、プロセッサコアの演算負荷率（ＲＬ）との関係を説明するための図である。
【図９】プロセッサコア（Ｃ１）の起動時に実行される初期化処理のフローチャートである。
【図１０】プロセッサコア（Ｃ２）の起動時に実行される初期化処理のフローチャートである。
【図１１】プロセッサコア（Ｃ３）の起動時に実行される初期化処理のフローチャートである。
【図１２】プロセッサコア（Ｃ４）の起動時に実行される初期化処理のフローチャートである。
【図１３】プロセッサコア（Ｃ１）の演算負荷監視処理のフローチャートである。
【図１４】プロセッサコア（Ｃ３）の演算負荷監視処理のフローチャートである。
【発明を実施するための形態】
【００２１】
以下本発明の実施の形態を図面を参照して説明する。
図１は、本発明の一実施形態にかかる内燃機関（以下「エンジン」という）及びその制御装置の構成を示す図であり、例えば４気筒のエンジン１の吸気通路２の途中にはスロットル弁３が配置されている。スロットル弁３はアクチュエータ１９によって駆動可能に構成されており、アクチュエータ１９は電子制御ユニット（以下「ＥＣＵ」という）５に接続されている。スロットル弁３の開度は、アクチュエータ１９を介してＥＣＵ５によって制御される。吸気通路２のスロットル弁３の下流側には、燃料噴射弁６が各気筒に対応して設けられており、その作動はＥＣＵ５により制御される。エンジン１の各気筒には点火プラグ７が装着されており、点火プラグ７はＥＣＵ５に接続されている。
【００２２】
ＥＣＵ５には、エンジン１の吸入空気流量ＧＡＩＲを検出する吸入空気流量センサ１１、吸気温ＴＡを検出する吸気温センサ１２、スロットル弁開度ＴＨを検出するスロットル弁開度センサ１３、吸気圧ＰＢＡを検出する吸気圧センサ１４、エンジン冷却水温ＴＷを検出する冷却水温センサ１５、及び図示しない他のセンサ（例えばエンジン１により駆動される車両のアクセルペダル操作量ＡＰを検出するアクセルセンサ、車速センサなど）が接続されており、これらのセンサの検出信号がＥＣＵ５に供給される。本実施形態では、冷却水温センサ１５は検出データの信頼性確保のために２つ設けられており、２つの冷却水温センサによる検出値を区別する必要があるときは、それぞれ「ＴＷ１」「ＴＷ２」と記載する。
【００２３】
ＥＣＵ５には、エンジン１のクランク軸（図示せず）の回転角度を検出するクランク角度センサ１６と、エンジン１の吸気弁及び排気弁を駆動するカムが固定されるカム軸（図示せず）の回転角度を検出するカム角度センサ１７とが接続されており、クランク軸及びカム軸の回転角度に応じたパルス信号がＥＣＵ５に供給される。クランク角度センサ１６は、クランク角度位置を示すパルス信号を出力するものであり、このパルス信号は、燃料噴射時期、点火時期等の各種タイミング制御、及びエンジン回転数ＮＥの検出に使用される。クランク角度センサ１６は、より具体的には所定クランク角度（例えば３６度）毎に発生するＣＲＫパルスを出力し、カム角度センサ１７はクランク角度１８０度毎に発生するＴＤＣパルスを出力する。ＥＣＵ５は、ＣＲＫパルスの発生時期にＣＲＫ割込処理を実行し、ＴＤＣパルスの発生時期にＴＤＣ割込処理を実行する。
【００２４】
ＥＣＵ５は、バス１００を介して他の制御（例えばエンジン１により駆動される車両に搭載される変速機の制御）を行うＥＣＵ３０、及び図示しない他のＥＣＵと接続されており、相互に必要な情報の伝達がバス１００を介して行われる。
【００２５】
ＥＣＵ５は、図２に示すように、上述したセンサから検出信号が入力されるとともに、燃料噴射弁（ＦＩＶ）６、点火プラグ（ＩＧＰ）７、スロットルアクチュエータ（ＴＨＡ）１９などへ駆動信号を出力する入出力部２１と、制御のための演算処理を実行するマルチコア型演算処理ユニット（以下「ＭＣＵ」という）２２とを備えている。
【００２６】
ＭＣＵ２２は、４つのプロセッサコア（以下単に「コア」という）Ｃ１〜Ｃ４と、コアＣ１〜Ｃ４に対応して設けられた１次キャッシュメモリＣＡ１〜ＣＡ４及び２次キャッシュメモリＣＢ１〜ＣＢ４と、コアＣ１〜Ｃ４に対応して設けられた共有メモリＭ１〜Ｍ４とを備えている。
【００２７】
入出力部２１を介して入力されるデータは、先ず共有メモリＭ１〜Ｍ４のいずれかに格納される。コアＣ１〜Ｃ４は、実行すべき演算処理に必要なデータを共有メモリＭ１〜Ｍ４から読み出して、１次キャッシュメモリＣＡ１〜ＣＡ４または２次キャッシュメモリＣＢ１〜ＣＢ４に一時的に格納して演算処理に適用する。演算処理によって得られる出力データは、１次キャッシュメモリＣＡ１〜ＣＡ４または２次キャッシュメモリＣＢ１〜ＣＢ４を介して共有メモリＭ１〜Ｍ４に格納され、入出力部２１において駆動信号に変換されて出力される。
【００２８】
本実施形態では、コアＣ１がＣＲＫパルスの発生に同期してＣＲＫ割込処理を実行するとともに所定時間ＴＣＡＬ（例えば１０ｍｓｅｃ）毎に第１定期処理を実行するアクティブコアとして作動し、コアＣ３がＴＤＣパルスの発生に同期してＴＤＣ割込処理を実行するとともに所定時間ＴＣＡＬ毎に第２定期処理を実行するアクティブコアとして作動し、コアＣ２がコアＣ１に対応するバックアップコアとして作動し、コアＣ４がコアＣ３に対応するバックアップコアとして作動する。
【００２９】
ＭＰＵ２２は、各種センサによる検出信号に基づいて、燃料噴射弁６による燃料噴射時間ＴＯＵＴ（燃料噴射量）の制御、点火プラグ７による点火時期ＩＧの制御、アクチュエータ１９によるスロットル弁開度ＴＨの制御などを行う。
【００３０】
基本的には、アクセルペダル操作量ＡＰなどに応じてエンジン１の目標出力トルクＴＲＱＴが算出され、目標出力トルクＴＲＱＴに応じてスロットル弁３の目標開度ＴＨＣＭＤが算出され、検出されるスロットル弁開度ＴＨが目標開度ＴＨＣＭＤと一致するようにアクチュエータ１９の駆動制御が行われる。燃料噴射時間ＴＯＵＴはスロットル弁開度ＴＨに応じて変化する吸入空気流量ＧＡＩＲに応じて設定され、点火時期ＩＧは吸気圧ＰＢＡ及びエンジン回転数ＮＥに応じて設定される。
【００３１】
図３は、本実施形態におけるＣＲＫパルスとＴＤＣパルスとの関係を示すタイムチャートであり、横軸はクランク角度ＣＡである。ＣＲＫパルスは第１所定クランク角度ＣＡＣＲＫ（例えば３０ｄｅｇ）毎に発生し、ＴＤＣパルスは第２所定クランク角度ＣＡＴＤＣ（例えば１８０ｄｅｇ）毎に発生する。
【００３２】
図４は、コアＣ１〜Ｃ４による典型的な演算動作例を説明するためのタイムチャートであり、図の垂直方向が時間軸となるように示されている。時刻ｔ１〜ｔ７は、図３のクランク角度ＣＡ１〜ＣＡ７に相当する。
【００３３】
この動作例では、最初はアクティブコアであるコアＣ１及びＣ３のみが作動し、コアＣ１の演算負荷率ＲＬＣ１が大きくなるとコアＣ２が起動される。
【００３４】
図４に示される各種処理は、図５に示すように、実行すべきコアが予め決められているコア指定処理と、実行すべきコアが予め決められていない非コア指定処理と、ＣＲＫパルスまたはＴＤＣパルスの発生に同期して実行される割込処理と、所定時間ＴＣＡＬ毎に実行される定期処理とに分類される。なお、図４及び５は、実行される演算処理の全てを示しているわけではなく、説明のために代表的な処理のみを示している。また、定期処理に該当する処理は、全ての処理が所定時間ＴＣＡＬ毎に常時実行されるとは限らず、例えばＴＲＱＡ算出処理は、他の処理（例えばＣＲＫ同期処理）によって起動されたときに、所定時間ＴＣＡＬ毎に実行される。
【００３５】
ＣＲＫ同期処理は、本実施形態ではコアＣ１が実行すべき処理として決められており、ＣＲＫパルスの発生間隔からエンジン回転数ＮＥを算出する処理、各種センサ出力の読み込み処理などを含む。ＴＤＣ同期処理は、本実施形態ではコアＣ３が実行すべき処理として決められており、ＴＤＣパルスの発生時期に基づく気筒判別処理、ＴＤＣパルスの発生間隔からエンジン回転数ＮＥを算出する処理、各種センサ出力の読み込み処理などを含む。
【００３６】
燃料噴射処理は、燃料噴射弁６を駆動して燃料噴射を実行する処理であり、点火処理は点火時期ＩＧを算出し、点火プラグ７による点火を実行する処理である。ＧＡＣＹＬ算出処理は、エンジン１の気筒吸入空気量ＧＡＣＹＬを算出する処理であり、ＴＷ算出処理はエンジン冷却水温ＴＷを算出する処理、すなわちセンサから入力される信号のデジタル変換値を摂氏温度を示す値に変換する処理であり、ＡＰ算出処理はアクセルペダル操作量ＡＰを算出する処理、すなわちセンサから入力される信号のデジタル変換値をアクセルペダル操作量（最大操作量に対する比率）を示す値に変換する処理である。
【００３７】
ＴＲＱＡ算出処理は、エンジン１の出力トルクＴＲＱＡを気筒吸入空気量ＧＡＣＹＬ及び検出冷却水温ＴＷ１を用いて算出する処理であり、コアＣ１が実行すべき処理として決められている。ＴＲＱＢ算出処理は、エンジン１の出力トルクＴＲＱＢを吸気圧ＰＢＡ及び検出冷却水温ＴＷ２を用いて算出する処理であり、コアＣ３が実行すべき処理として決められている。このように、異なるセンサ出力に基づいてエンジン１の出力トルクを算出し、算出結果を比較することによって、センサの異常を判定することができる。
【００３８】
ＴＲＱＴ算出処理は、上述したエンジン１の目標出力トルクＴＲＱＴを算出する処理であり、協調制御処理は、他のＥＣＵ、例えばＥＣＵ３０との間で協調制御を行う処理であり、ＴＨ制御処理は、スロットル弁開度ＴＨが目標開度ＴＨＣＭＤと一致するようにアクチュエータ１９を駆動する制御を行う処理であり、演算負荷監視処理は、コア１及びコア３の演算負荷率ＲＬＣ１，ＲＬＣ３を監視する処理であり、詳細は後述する。
【００３９】
演算負荷率ＲＬは、所定時間ＴＣＡＬ内に実行可能な最大演算量ＰＣＭＡＸ１に対する、所定時間ＴＣＡＬ内に実行すべき要求演算量ＰＣＲＱの比率（ＰＣＲＱ／ＰＣＭＡＸ１）として定義される。すなわち、要求演算量ＰＣＲＱが最大演算量ＰＣＭＡＸ１と等しいときに演算負荷率ＲＬは最大負荷率ＲＬＭＡＸ（＝１００％）となる。要求演算量ＰＣＲＱが最大演算量ＰＣＭＡＸ１を超える、すなわち演算負荷率ＲＬが１００％を超えると、要求された演算を所定時間ＴＣＡＬ内に完了することできなくなり、制御の遅れあるいは制御パラメータ出力の抜けが発生する。
【００４０】
図４に示すようにコアＣ１は、ＣＲＫパルスが発生する時刻ｔ１〜ｔ７の直後において、ＣＲＫ同期処理及びＴＲＱＡ算出処理（以下この２つの処理を「Ｃ１優先処理」という）を実行し、Ｃ１優先処理を実行していない空き時間に、非コア指定処理である燃料噴射処理、ＧＡＣＹＬ算出処理、及び演算負荷監視処理を実行する。すなわち、時刻ｔ２及びｔ５の直前に燃料噴射処理を実行し、時刻ｔ３の直前にＧＡＣＹＬ算出処理を実行し、時刻ｔ４の直前には演算負荷監視処理を実行する。演算負荷監視処理において、コアＣ１の演算負荷率ＲＬＣ１が判定閾値ＲＬＴＨ（例えば８０％）を超えたと判定され、コアＣ１のバックアップコアであるコアＣ２の起動処理がコアＣ２で実行される。その後、コアＣ２は時刻ｔ６の直後において点火処理及び燃料噴射処理を実行する。
【００４１】
コアＣ３は、ＴＤＣパルスが発生する時刻ｔ１及びｔ７の直後において、ＴＤＣ同期処理及びＴＲＱＢ算出処理（以下この２つの処理を「Ｃ３優先処理」という）を実行し、Ｃ３優先処理を実行していない空き時間において、非コア指定処理である点火処理、ＴＷ算出処理、ＡＰ算出処理、演算負荷監視処理を実行する。すなわち、時刻ｔ２の直前には点火処理を実行し、時刻ｔ２〜ｔ３の間には、ＴＷ算出処理、及びＡＰ算出処理を実行し、時刻ｔ３〜ｔ４の間には協調制御処理、ＴＨ制御処理、及びＴＲＱＴ算出処理を実行し、時刻ｔ４の直後には演算負荷監視処理を実行する。図４に示す動作例では、コアＣ４は起動されず、休止状態を継続する。
【００４２】
図６は、コアＣ１及びコアＣ３における定期処理を起動するトリガ信号ＳＴＲＧの生成方法を説明するためのタイムチャートである。この図では、時刻ｔ１０がＭＰＵ２２が起動され、コアＣ１における定期処理の最初の開始時期に相当する。
【００４３】
図６（ａ）及び（ｂ）に示すように時刻ｔ１０において、コアＣ１における最初の定期処理が起動され、最初の第１トリガ信号ＳＴＲＧ１が生成されるとともに、タイマＴＭ１のカウントアップが開始される。タイマＴＭ１は、そのカウント値が所定時間ＴＣＡＬの２倍の時間ＴＣＡＬ２（＝２×ＴＣＡＬ）に達する時刻ｔ１２，ｔ１４，…においてリセットされる動作を繰り返し、時刻ｔ１２，ｔ１４，…において第１トリガ信号ＳＴＲＧ１が生成される。生成された第１トリガ信号ＳＴＲＧ１は、コアＣ１自身のトリガ信号として使用されるとともに、コアＣ３に供給される。
【００４４】
また図６（ｃ）及び（ｄ）に示すようにコアＣ１における最初の定期処理の開始時刻ｔ１０から所定時間ＴＣＡＬが経過した時刻ｔ１１において、コアＣ３における最初の定期処理が開始され、最初の第２トリガ信号ＳＴＲＧ２が生成されるとともに、タイマＴＭ２のカウントアップが開始される。タイマＴＭ２は、そのカウント値が時間ＴＣＡＬ２に達する時刻ｔ１３，ｔ１５，…においてリセットされる動作を繰り返し、時刻ｔ１３，ｔ１５，…において第２トリガ信号ＳＴＲＧ２が生成される。生成された第２トリガ信号ＳＴＲＧ２は、コアＣ３自身のトリガ信号として使用されるとともに、コアＣ１に供給される。
【００４５】
したがって、コアＣ１及びＣ３においては、図６（ｅ）に示すトリガ信号ＳＴＲＧに同期して定期処理が実行される。またコアＣ１の起動時における異常判定処理で異常があると判定されたときは、上記第１トリガ信号ＳＴＲＧ１の生成及びタイマＴＭ１のカウントアップは、コアＣ２が行い、コアＣ３の起動時における異常判定処理で異常があると判定されたときは、上記第２トリガ信号ＳＴＲＧ２の生成及びタイマＴＭ２のカウントアップは、コアＣ４が行う。コアＣ２及びＣ４における定期処理もトリガ信号ＳＴＲＧに同期して実行される。
【００４６】
このように２つのコア対が所定時間ＴＣＡＬの２倍の周期（ＴＣＡＬ２）でトリガ信号ＳＴＲＧ１，ＳＴＲＧ２を交互に生成してトリガ信号ＳＴＲＧを生成することにより、一方のコア対（例えばコアＣ１及びＣ２）が故障して動作しなくなると、コアＣ３における定期処理は、第２トリガ信号ＳＴＲＧ２に同期して実行されるフェールセーフモードへ自動的に移行する。これにより、本来コアＣ１及び／またはＣ２が実行すべき演算処理をコアＣ３及びＣ４が実行することが可能となる。
【００４７】
図７は、エンジン１の運転状態と演算負荷率ＲＬとの関係を説明するための図である。図７において実線の枠で囲んだブロックがコア指定処理を示し、破線の枠で囲んだブロックが非コア指定処理を示す。また、図７（ａ）及び（ｄ）は、エンジン１のアイドル運転状態に対応し、図７（ｂ）及び（ｅ）は、エンジン１の中速回転状態（エンジン回転数ＮＥが例えば２５００ｒｐｍ程度である状態）に対応し、図７（ｃ）及び（f)がエンジン１の高速回転状態（エンジン回転数ＮＥが例えば４０００ｒｐｍ程度である状態）に対応する。また図７（ａ）〜（ｃ）はコアＣ１〜Ｃ４が全て正常である場合に対応し、図７（ｄ）〜（ｆ）はコアＣ１で異常が発生し、コアＣ２〜Ｃ４が正常である場合に対応する。演算負荷率ＲＬが最大負荷率ＲＬＭＡＸ（＝１００％）に到達すると、演算処理結果の出力が遅れる、あるいは演算処理結果の出力頻度が低下する状態となる。
【００４８】
エンジン回転数ＮＥが高くなるほど、割込処理の実行頻度が高くなるため、所定時間ＴＣＡＬ内に実行すべき演算量が増加し、演算負荷率ＲＬは高くなる。エンジン１のアイドル運転状態（図７（ａ））では、コアＣ１及びＣ３で全ての演算処理が実行され、判定閾値ＲＬＴＨに対して余裕がある状態である。中速回転状態（図７（ｂ））では、コアＣ１の演算負荷率ＲＬＣ１が判定閾値ＲＬＴＨに達する。高速回転状態（図７（ｃ））では、コアＣ１の演算負荷率ＲＬＣ１が判定閾値ＲＬＴＨを超え、コアＣ３の演算負荷率ＲＬＣ３が判定閾値ＲＬＴＨに達しており、さらにバックアップコアであるコアＣ２及びＣ４が起動されている。コアＣ２及びＣ４は、非コア指定割込処理及び非コア指定定期処理を実行する。
【００４９】
コアＣ１が故障している場合には、エンジン１のアイドル運転状態（図７（ｄ））においては、コアＣ２が本来コアＣ１が実行すべき処理を全て実行する。中速回転状態（図７（ｅ））では、コアＣ３の演算負荷率ＲＬＣ３が判定閾値ＲＬＴＨに達し、コアＣ４が起動されている。高速回転状態（図７（ｆ））では、コアＣ２の演算負荷率ＲＬＣ２が判定閾値ＲＬＴＨを超え、コアＣ３の演算負荷率ＲＬＣ３が判定閾値ＲＬＴＨに達し、コアＣ４が起動され、コアＣ４の演算負荷率ＲＬＣ４も判定閾値ＲＬＴＨに達している。
【００５０】
図７（ｃ）に示す状態では、コアＣ１の演算負荷率ＲＬＣ１が判定閾値ＲＬＴＨを超え、図７（ｆ）に示す状態では、コアＣ２の演算負荷率ＲＬＣ２が判定閾値ＲＬＴＨを超えているが、最大負荷率ＲＬＭＡＸに対しては余裕があるため、エンジン１の制御は正常に継続される。
【００５１】
図８は、コアＣ１及びＣ２がともに故障した場合に対応し、図８（ａ）（ｂ）及び（ｃ）は、それぞれエンジン１のアイドル運転状態、中速回転状態、及び高速回転状態に対応する。
【００５２】
本実施形態では、アクティブコアと対応するバックアップコアと（一方のコア対）がともに故障した場合には、他方のコア対が、一方のコア対が実行するはずであった非コア指定割込処理及び非コア指定定期処理を実行する。その場合、実行周期が同一であると、他方のコア対の演算負荷率ＲＬが１００％を超えてしまうので、定期処理の演算周期を上記所定時間ＴＣＡＬの２倍とする。図８の縦軸は、最大負荷率ＲＬＭＡＸが１００％に相当し、判定閾値ＲＬＴＨが８０％に相当するが、定期処理の実行周期が２倍に延長されているため、図７の縦軸を２倍に延ばして示している。すなわち、演算周期がＴＣＡＬ２（＝２×ＴＣＡＬ）である場合には、演算負荷率ＲＬの算出に適用される最大演算量ＰＣＭＡＸ２は、演算周期が所定時間ＴＣＡＬで場合の最大演算量ＰＣＭＡＸ１の２倍となり、要求演算量ＰＣＲＱが同一であれば、演算負荷率ＲＬは１／２となる。
【００５３】
アイドル運転状態から中速回転状態までは（図８（ａ）（ｂ））、コアＣ３で全ての処理が実行され、高速回転状態（図８（ｃ）））ではコアＣ４が一部の演算処理を実行する。このようにコアＣ１及びＣ２がともに故障した場合でも、演算周期を２倍に延長することによって、エンジン１の制御を継続することが可能となる。
ただし、ＣＲＫ同期処理は実行されないため、例えばエンジン回転数ＮＥが急激に変化したような場合における制御の追従性は低下する。
【００５４】
図９は、ＭＣＵ２２の起動時に実行されるコアＣ１の初期化処理のフローチャートである。ステップＳ１１では、コアＣ１の１次キャッシュメモリＣＡ１及び２次キャッシュメモリＣＢ１を使用して、所定異常判定演算を行うことにより、コアＣ１、キャッシュメモリＣＡ１、またはＣＢ１に異常が有るか否かを判定する。正常であると判定されたときは、Ｃ１正常フラグＦＣ１ＯＫを「１」に設定し、異常があると判定されたときは、Ｃ１正常フラグＦＣ１ＯＫを「０」に設定する。ステップＳ１２では、その異常判定の結果を共有メモリＭ１に記憶する。
【００５５】
ステップＳ１３では、Ｃ１正常フラグＦＣ１ＯＫが「１」であるか否かを判別し、その答が否定（ＮＯ）であるときは、コアＣ１は作動を休止する（ステップＳ１４）。ステップＳ１３の答が肯定（ＹＥＳ）であるときは、他のコアＣ２〜Ｃ４において並行して実行される異常判定処理が全て終了するまで待機する（ステップＳ１５）。
【００５６】
ステップＳ１５の答が肯定（ＹＥＳ）となると、ＣＲＫ同期処理を実行するコアをＣ１に設定するとともに、ＴＲＱＡ算出処理を実行するコアをＣ１に設定する（ステップＳ１６，Ｓ１７）。ステップＳ１８では、コアＣ１が使用する共有メモリＭ１のチェックを行う。ステップＳ１９では、他のコアＣ２〜Ｃ４において並行して実行される初期化処理が全て終了するまで待機する。ステップＳ１９の答が肯定（ＹＥＳ）となると、タスク起動処理を実行する（ステップＳ２０）。すなわち、第１トリガ信号ＳＴＲＧ１を生成するとともに、上述したタイマＴＭ１のカウントアップを開始し、コアＣ１が実行すべき定期処理を開始する。
【００５７】
図１０は、ＭＣＵ２２の起動時に実行されるコアＣ２の初期化処理のフローチャートである。ステップＳ２１では、コアＣ２の１次キャッシュメモリＣＡ２及び２次キャッシュメモリＣＢ２使用して、所定異常判定演算を行うことにより、コアＣ２、キャッシュメモリＣＡ２、またはＣＢ２に異常が有るか否かを判定する。正常であると判定されたときは、Ｃ２正常フラグＦＣ２ＯＫを「１」に設定し、異常があると判定されたときは、Ｃ２正常フラグＦＣ２ＯＫを「０」に設定する。ステップＳ２２では、その異常判定の結果を共有メモリＭ２に記憶する。
【００５８】
ステップＳ２３では、Ｃ２正常フラグＦＣ２ＯＫが「１」であるか否かを判別し、その答が否定（ＮＯ）であるときは、コアＣ２は作動を休止し、Ｃ２作動フラグＦＣ２ＯＰを「０」に設定する（ステップＳ２４）。ステップＳ２３の答が肯定（ＹＥＳ）であるときは、他のコアＣ１，Ｃ３，Ｃ４において並行して実行される異常判定処理が全て終了するまで待機する（ステップＳ２５）。
【００５９】
ステップＳ２５の答が肯定（ＹＥＳ）となると、Ｃ１正常フラグＦＣ１ＯＫが「１」であるか否かを判別する（ステップＳ２６）。その答が肯定（ＹＥＳ）であるときは、コアＣ２は作動を休止し、Ｃ２作動フラグＦＣ２ＯＰを「０」に設定する（ステップＳ２７）。
【００６０】
ステップＳ２６の答が否定（ＮＯ）であって、コアＣ１（またはキャッシュメモリＣＡ１，ＣＢ１）に異常があるときは、ＣＲＫ同期処理を実行するコアをＣ２に設定するとともに、ＴＲＱＡ算出処理を実行するコアをＣ２に設定する（ステップＳ２８，Ｓ２９）。ステップＳ３０では、コアＣ２が使用する共有メモリＭ２のチェックを行う。ステップＳ３１では、他のコアＣ１，Ｃ３，Ｃ４において並行して実行される初期化処理が全て終了するまで待機する。ステップＳ３１の答が肯定（ＹＥＳ）となると、タスク起動処理を実行し、Ｃ２作動フラグＦＣ２ＯＰを「１」に設定する（ステップＳ３２）。タスク起動処理では、第１トリガ信号ＳＴＲＧ１を生成するとともに、上述したタイマＴＭ１のカウントアップを開始し、コアＣ１が実行すべき定期処理を開始する。
【００６１】
図１１は、ＭＣＵ２２の起動時に実行されるコアＣ３の初期化処理のフローチャートである。ステップＳ４１では、コアＣ３の１次キャッシュメモリＣＡ３及び２次キャッシュメモリＣＢ３を使用して、所定異常判定演算を行うことにより、コアＣ３、はキャッシュメモリＣＡ３、またはＣＢ３に異常が有るか否かを判定する。正常であると判定されたときは、Ｃ３正常フラグＦＣ３ＯＫを「１」に設定し、異常があると判定されたときは、Ｃ３正常フラグＦＣ３ＯＫを「０」に設定する。ステップＳ４２では、その異常判定の結果を共有メモリＭ３に記憶する。
【００６２】
ステップＳ４３では、Ｃ３正常フラグＦＣ３ＯＫが「１」であるか否かを判別し、その答が否定（ＮＯ）であるときは、コアＣ３は作動を休止する（ステップＳ４４）。ステップＳ４３の答が肯定（ＹＥＳ）であるときは、他のコアＣ１，Ｃ２，Ｃ４において並行して実行される異常判定処理が全て終了するまで待機する（ステップＳ４５）。
【００６３】
ステップＳ４５の答が肯定（ＹＥＳ）となると、ＴＤＣ同期処理を実行するコアをＣ３に設定するとともに、ＴＲＱＢ算出処理を実行するコアをＣ３に設定する（ステップＳ４６，Ｓ４７）。ステップＳ４８では、コアＣ３が使用する共有メモリＭ３のチェックを行う。ステップＳ４９では、他のコアＣ１，２，Ｃ４において並行して実行される初期化処理が全て終了するまで待機する。ステップＳ４９の答が肯定（ＹＥＳ）となると、第１トリガ信号ＳＴＲＧ１の生成時点から所定時間ＴＣＡＬ経過後にタスク起動処理を実行する（ステップＳ５０）。すなわち、第２トリガ信号ＳＴＲＧ２を生成するとともに、上述したタイマＴＭ２のカウントアップを開始し、コアＣ３が実行すべき定期処理を開始する。
【００６４】
図１２は、ＭＣＵ２２の起動時に実行されるコアＣ４の初期化処理のフローチャートである。ステップＳ５１では、コアＣ４の１次キャッシュメモリＣＡ４及び２次キャッシュメモリＣＢ４使用して、所定異常判定演算を行うことにより、コアＣ４、キャッシュメモリＣＡ４、またはＣＢ４に異常が有るか否かを判定する。正常であると判定されたときは、Ｃ４正常フラグＦＣ４ＯＫを「１」に設定し、異常があると判定されたときは、Ｃ４正常フラグＦＣ４ＯＫを「０」に設定する。ステップＳ５２では、その異常判定の結果を共有メモリＭ４に記憶する。
【００６５】
ステップＳ５３では、Ｃ４正常フラグＦＣ４ＯＫが「１」であるか否かを判別し、その答が否定（ＮＯ）であるときは、コアＣ４は作動を休止し、Ｃ４作動フラグＦＣ４ＯＰを「０」に設定する（ステップＳ５４）。ステップＳ５３の答が肯定（ＹＥＳ）であるときは、他のコアＣ１，Ｃ２，Ｃ３において並行して実行される異常判定処理が全て終了するまで待機する（ステップＳ５５）。
【００６６】
ステップＳ５５の答が肯定（ＹＥＳ）となると、Ｃ３正常フラグＦＣ３ＯＫが「１」であるか否かを判別する（ステップＳ５６）。その答が肯定（ＹＥＳ）であるときは、コアＣ４は作動を休止し、Ｃ４作動フラグＦＣ４ＯＰを「０」に設定する（ステップＳ５７）。
【００６７】
ステップＳ５６の答が否定（ＮＯ）であって、コアＣ３（またはキャッシュメモリＣＡ３，ＣＢ３）に異常があるときは、ＴＤＣ同期処理を実行するコアをＣ４に設定するとともに、ＴＲＱＢ算出処理を実行するコアをＣ４に設定する（ステップＳ５８，Ｓ５９）。ステップＳ６０では、コアＣ４が使用する共有メモリＭ４のチェックを行う。ステップＳ６１では、他のコアＣ１，Ｃ２，Ｃ３において並行して実行される初期化処理が全て終了するまで待機する。ステップＳ６１の答が肯定（ＹＥＳ）となると、第１トリガ信号ＳＴＲＧ１の生成時点から所定時間ＴＣＡＬ経過後にタスク起動処理を実行し、Ｃ４作動フラグＦＣ４ＯＰを「１」に設定する（ステップＳ６２）。タスク起動処理では、第２トリガ信号ＳＴＲＧ２を生成するとともに、上述したタイマＴＭ２のカウントアップを開始し、コアＣ３が実行すべき定期処理を開始する。
【００６８】
図１３は、コアＣ１の演算負荷を監視する演算負荷監視処理のフローチャートである。ステップＳ７１では、Ｃ３正常フラグＦＣ３ＯＫが「１」であるか否かを判別し、その答が否定（ＮＯ）であるときはＣ４正常フラグＦＣ４ＯＫが「１」であるか否かを判別する（ステップＳ７２）。ステップＳ７１またはＳ７２の答が肯定（ＹＥＳ）であるとき、すなわちコアＣ３及び／またはＣ４が正常であるときは、出力トルクモニタ処理を実行する（ステップＳ７３）。この処理では、ＴＲＱＡ算出処理で算出される出力トルクＴＲＱＡと、ＴＲＱＢ算出処理で算出される出力トルクＴＲＱＢとを比較し、両者の差分ＤＴＲＱが所定閾値ＤＴＲＱＴＨを超えていなければ、それぞれの出力トルク算出に適用した検出データ（検出センサ）が正常であると判定し、差分ＤＴＲＱが所定閾値ＤＴＲＱＴＨを超えているときは、検出センサの何れかに異常があると判定する。
【００６９】
ステップＳ７４では、最大演算量ＰＣＭＡＸを所定時間ＴＣＡＬに対応する第１の値ＰＣＭＡＸ１に設定する。一方、ステップＳ７２の答が否定（ＮＯ）であって、コアＣ３及びＣ４がともに作動を休止しているときは、最大演算量ＰＣＭＡＸを所定時間ＴＣＡＬの２倍の時間ＴＣＡＬ２に対応する第２の値ＰＣＭＡＸ２（＝ＰＣＭＡＸ１×２）に設定する（ステップＳ７５）。
【００７０】
ステップＳ７６では、Ｃ２正常フラグＦＣ２ＯＫが「１」であるか否かを判別し、その答が否定（ＮＯ）であるときは処理を終了する。ステップＳ７６の答が肯定（ＹＥＳ）であるときは、コアＣ１の演算負荷率ＲＬＣ１が判定閾値ＲＬＴＨより大きいか否かを判別する（ステップＳ７７）。演算負荷率ＲＬＣ１は、コアＣ１の要求演算量ＰＣＲＱＣ１を最大演算量ＰＣＭＡＸで除算することにより算出される。
【００７１】
ステップＳ７７の答が肯定（ＹＥＳ）であるときは、Ｃ２作動フラグＦＣ２ＯＰが「０」であるか否かを判別する（ステップＳ７８）。その答が肯定（ＹＥＳ）であってコアＣ２が休止中であるときは、コアＣ２を起動する（ステップＳ７９）。ステップＳ７８の答が否定（ＮＯ）であってコアＣ２が既に作動中であるときは処理を終了する。
【００７２】
ステップＳ７７の答が否定（ＮＯ）であって、コアＣ１の演算負荷率ＲＬＣ１が判定閾値ＲＬＴＨ以下であるときは、Ｃ２作動フラグＦＣ２ＯＰが「１」であるか否かを判別する（ステップＳ８０）。その答が肯定（ＹＥＳ）であってコアＣ２が作動中であるときは、コアＣ２を休止させる（ステップＳ８１）。ステップＳ８０の答が否定（ＮＯ）であってコアＣ２が既に休止中であるときは処理を終了する。
【００７３】
図１４は、コアＣ３の演算負荷を監視する演算負荷監視処理のフローチャートである。ステップＳ９１では、Ｃ１正常フラグＦＣ１ＯＫが「１」であるか否かを判別し、その答が否定（ＮＯ）であるときはＣ２正常フラグＦＣ２ＯＫが「１」であるか否かを判別する（ステップＳ９２）。ステップＳ９１またはＳ９２の答が肯定（ＹＥＳ）であるとき、すなわちコアＣ１及び／またはＣ２が正常であるときは、出力トルクモニタ処理を実行する（ステップＳ９３）。この処理では、ＴＲＱＡ算出処理で算出される出力トルクＴＲＱＡと、ＴＲＱＢ算出処理で算出される出力トルクＴＲＱＢとを比較し、両者の差分ＤＴＲＱが所定閾値ＤＴＲＱＴＨを超えていなければ、それぞれの出力トルク算出に適用した検出データ（検出センサ）が正常であると判定し、差分ＤＴＲＱが所定閾値ＤＴＲＱＴＨを超えているときは、検出センサの何れかに異常があると判定する。
【００７４】
ステップＳ９４では、最大演算量ＰＣＭＡＸを第１の値ＰＣＭＡＸ１に設定する。一方、ステップＳ９２の答が否定（ＮＯ）であって、コアＣ１及びＣ２がともに作動を休止しているときは、最大演算量ＰＣＭＡＸを第２の値ＰＣＭＡＸ２に設定する（ステップＳ９５）。
【００７５】
ステップＳ９６では、Ｃ４正常フラグＦＣ４ＯＫが「１」であるか否かを判別し、その答が否定（ＮＯ）であるときは処理を終了する。ステップＳ９６の答が肯定（ＹＥＳ）であるときは、コアＣ３の演算負荷率ＲＬＣ３が判定閾値ＲＬＴＨより大きいか否かを判別する（ステップＳ９７）。演算負荷率ＲＬＣ３は、コアＣ３の要求演算量ＰＣＲＱＣ３を最大演算量ＰＣＭＡＸで除算することにより算出される。
【００７６】
ステップＳ９７の答が肯定（ＹＥＳ）であるときは、Ｃ４作動フラグＦＣ４ＯＰが「０」であるか否かを判別する（ステップＳ９８）。その答が肯定（ＹＥＳ）であってコアＣ４が休止中であるときは、コアＣ４を起動する（ステップＳ９９）。ステップＳ９８の答が否定（ＮＯ）であってコアＣ４が既に作動中であるときは処理を終了する。
【００７７】
ステップＳ９７の答が否定（ＮＯ）であって、コアＣ３の演算負荷率ＲＬＣ３が判定閾値ＲＬＴＨ以下であるときは、Ｃ４作動フラグＦＣ４ＯＰが「１」であるか否かを判別する（ステップＳ１００）。その答が肯定（ＹＥＳ）であってコアＣ４が作動中であるときは、コアＣ４を休止させる（ステップＳ１０１）。ステップＳ１００の答が否定（ＮＯ）であってコアＣ４が既に休止中であるときは処理を終了する。
【００７８】
以上のように本実施形態では、４つのプロセッサコアＣ１〜Ｃ４のうちのアクティブコアとして機能するコアＣ１及びＣ３がそれぞれエンジン１の制御に必要な演算処理を実行するが、例えばエンジン回転数ＮＥが高くなってＣＲＫパルス及びＴＤＣパルスの発生周期が短縮すると、コアＣ１及びＣ３の演算負荷率ＲＬＣ１，ＲＬＣ３が増加し、実行すべき演算処理の遅れや抜けが発生するので、演算負荷率ＲＬＣ１，ＲＬＣ３が判定閾値ＲＬＴＨを超えたときは、実行すべき演算処理の一部をバックアップコアとして機能するコアＣ２，Ｃ４に実行させることにより、実行すべき演算処理をすべて実行することが可能となる。例えば、コアＣ１に異常が発生した場合においては、実行すべき演算処理の全部をバックアップコアとしてのコアＣ２が実行することもできるので、演算負荷の変動やプロセッサコアの故障（異常）に対するロバスト性を高めることができる。また、コアＣ１，Ｃ３の演算負荷率ＲＬＣ１，ＲＬＣ３が判定閾値ＲＬＴＨ以下であるときは、バックアップコアであるコアＣ２，Ｃ４を休止させることができるので、消費電力を低減できる。
【００７９】
またコアＣ１〜Ｃ４のそれぞれにおいて、ＭＣＵ２２の起動時に自己の異常を判定する処理が実行され、アクティブコアとしてのコアＣ１，Ｃ３に異常があると判定したときはそれらのコアＣ１，Ｃ３は作動を休止し、実行すべき演算処理はバックアップコアとしてのコアＣ２，Ｃ４によって実行される。したがって、予め割り当てられた演算処理を実行すべきアクティブコアに異常が発生した場合でも、エンジン１の作動制御を継続することができる。また、異常判定処理をＭＣＵ２２の起動時に実行するようにしたので、通常制御の演算に影響を与えることなく、異常判定を行うことができる。
【００８０】
またコアＣ１，Ｃ２からなる第１コア対と、コアＣ３，Ｃ４からなる第２コア対のそれぞれによって、エンジン制御に必須のクランク角度に同期した処理と、所定時間ＴＣＡＬ毎の定期処理とが実行されるため、一方のコア対が他方のコア対をバックアップすることが可能となり、より信頼性を高めることができる。また、例えばエンジン１の出力トルクＴＲＱＡ，ＴＲＱＢを算出する処理を異なるタイミングでかつ、異なる検出パラメータを用いて実行することが可能となる。その結果、２つの演算結果を比較することで、例えば出力トルク算出に適用するパラメータを検出するセンサの異常を判定するといった処理を付加的に行うことが可能となる。
【００８１】
また第１及び第２コア対の一方のコア対を構成する２つのコアの両方（例えばＣ１，Ｃ２）に異常があるときは、一方のコア対が実行すべき演算処理が他方のコア対（例えばＣ３，Ｃ４）によって実行されるので、コア対を構成する２つのコア（Ｃ１，Ｃ２またはＣ３，Ｃ４）がともに故障するというような事態が発生しても、故障していないコア対によってエンジン１の作動制御を継続することが可能となる。
【００８２】
また所定時間ＴＣＡＬの２倍の周期ＴＣＡＬ２で第１及び第２トリガ信号ＳＴＲＧ１，ＳＴＲＧ２を生成して相互に供給するトリガ信号生成処理が、コアＣ１及びコアＣ３の双方で実行され、ＭＰＵ２２の起動時において、コアＣ３における最初の定期処理の開始時期がコアＣ１における最初の定期処理の開始時期より所定時間ＴＣＡＬだけ遅れるように制御されるため、最初にコアＣ１によって第１トリガ信号ＳＴＲＧ１が生成され、その生成時期から所定時間ＴＣＡＬ後にコアＣ３によって第２トリガ信号ＳＴＲＧ２が生成され、以後は所定時間ＴＣＡＬ毎にコアＣ１またはコアＣ３によってトリガ信号ＳＴＲＧ１，ＳＴＲＧ２が生成され、そのトリガ信号に同期してそれぞれコアＣ１における定期処理及びコアＣ３における定期処理が実行される。またコアＣ１に異常があるときは、コアＣ２によってトリガ信号生成処理が実行され、コアＣ３に異常があるときは、コアＣ４によってトリガ信号生成処理が実行される。
【００８３】
したがって、例えばコア対を構成するＣ１，Ｃ２の両方で異常が発生したときは、コア対Ｃ１，Ｃ２による第１トリガ信号ＳＴＲＧ１の生成が行われなくなるため、トリガ信号ＳＴＲＧの周期が２倍となる。演算周期が２倍となるため、コア対Ｃ３，Ｃ４は、もともとコア対Ｃ３，Ｃ４が実行すべき演算処理に加えてコア対Ｃ１，Ｃ２が実行するはずであった処理のほぼ全部（コア指定処理であるＣＲＫ同期処理及びＴＲＱＡ算出処理を除く）を実行可能となり、制御速度が遅くなるもののエンジン１が作動不能となる事態を回避することができる。
【００８４】
本実施形態では、コアＣ１及びＣ３がそれぞれ第１及び第２アクティブコアに相当し、コアＣ２，Ｃ４がそれぞれ第１及び第２バックアップコアに相当する。
【００８５】
［変形例１］
なお本発明は上述した実施形態に限るものではなく、種々の変形が可能である。例えば、上述した実施形態では、バックアップコアとして作動するコアＣ２，Ｃ４を含むＭＣＵ２２を用いた制御装置を示したが、アクティブコアＣ１，Ｃ３のみで構成されたＭＣＵ２２ａを用いてエンジン１の制御を行うようにしてもよい。その場合には、コアＣ１，Ｃ３の演算処理能力を上述した実施形態に比べて大きなものとし（処理能力の高いコアを使用し）、エンジン回転数ＮＥが高くなったときにバックアップコアＣ２，Ｃ４が実行していた演算処理を、それぞれコアＣ１及びＣ３において実行できるようにする。この変形例では、コアＣ１及びＣ３の何れか一方に異常が発生したときには、トリガ信号ＳＴＲＧ１またはＳＴＲＧ２が生成されなくなるため、定期処理の演算周期が所定時間ＴＣＡＬの２倍となり、正常なコアによって、異常が発生したコアが実行すべき演算処理を実行することが可能となる。
【００８６】
［変形例２］
また上記変形例１における２つのアクティブコア（Ｃ１，Ｃ３）からなるコア対を複数備えるＭＣＵ２２ｂを用いてエンジン１の制御を行うようにしてもよい。
【００８７】
［変形例３］
上述した実施形態では、２つのアクティブコア（Ｃ１，Ｃ３）と、対応する２つのバックアップコアＣ２，Ｃ４でＭＰＵ２２を構成したが、アクティブコア及び対応するバックアップコアをそれぞれ３つ以上としてもよい。
【００８８】
［変形例４］
またアクティブコアＣ１とバックアップコアＣ２とからなるコア対のみを備えるＭＣＵ２２ｃを用いてエンジン１の制御を行うようにしてもよい。その場合には、コアＣ１，Ｃ２の演算処理能力を上述した実施形態に比べて大きなものとし（演算処理能力の高いコアを使用し）、コアＣ３，Ｃ４が実行していた演算処理を、それぞれコアＣ１，Ｃ２において実行できるようにする。
【００８９】
［変形例５］
また上述した実施形態では、ＭＣＵ２２で実行すべき演算処理を、コア指定処理と、非コア指定処理とで構成するようにしたが、実行すべき全ての演算処理を非コア指定処理としてもよい。それによって、２つのコア対の一方（例えばＣ１及びＣ２）が故障したときに、他方のコア対で全ての演算処理を実行可能となる。
また本発明は、クランク軸を鉛直方向とした船外機などのような船舶推進機用エンジンなどの制御にも適用が可能である。
【符号の説明】
【００９０】
１  内燃機関
５  電子制御ユニット
２２  マルチプロセッサコアユニット
Ｃ１，Ｃ２，Ｃ３，Ｃ４  プロセッサコア
ＴＣＡＬ  所定時間
ＣＡＣＲＫ  第１所定クランク角度（第１所定回転角度）
ＣＡＴＤＣ  第２所定クランク角度（第２所定回転角度）
【図１】
2016023603.tif 000003
【図２】
2016023603.tif 000004
【図３】
2016023603.tif 000005
【図４】
2016023603.tif 000006
【図５】
2016023603.tif 000007
【図６】
2016023603.tif 000008
【図７】
2016023603.tif 000009
【図８】
2016023603.tif 000010
【図９】
2016023603.tif 000011
【図１０】
2016023603.tif 000012
【図１１】
2016023603.tif 000013
【図１２】
2016023603.tif 000014
【図１３】
2016023603.tif 000015
【図１４】
2016023603.tif 000016