(57)【要約】【課題】システムリセット時の初期化処理において異常が発生しても、システムが起動しなくなることを回避する。【解決手段】同じ機能を実現する複数の機能実現手段を有する制御装置であって、前記機能実現手段を切替により選択する切替手段を有し、起動時および異常発生後の再起動時に、前記切替手段は、複数の前記機能実現手段の中から使用対象となるべき機能実現手段を切替動作によって選択し、機能実現手段に異常があった場合、次回の起動時には異なる機能実現手段を選択することを特徴とする。上記の機能実現手段とは、制御装置が備えるマイクロコントローラが実行するプログラム、またはこのマイクロコントローラが備えるＣＰＵのコアである。【選択図】図４
2010061419.tif 000002
【特許請求の範囲】
【請求項１】
同じ機能を実現する複数の機能実現手段を有する制御装置であって、
前記機能実現手段を切替により選択する切替手段を有し、
起動時および異常発生後の再起動時に、前記切替手段は、複数の前記機能実現手段の中から使用対象となるべき機能実現手段を切替動作によって選択し、機能実現手段に異常があった場合、次回の起動時には異なる機能実現手段を選択することを特徴とする制御装置。
【請求項２】
同じ機能を実現する複数の機能実現手段を有する制御装置において、
前記制御装置の起動時および再起動時に所定の割当て手順に従って、使用対象となる機能実現手段を複数の前記機能実現手段の中から切替により選択する切替手段を有し、
この切替手段は、選択された機能実現手段に異常が生じた場合には、異常が生じた機能実現手段を前記割当て手順から除外して割当て手順を再編し、以後の再起動時の機能実現手段を切替により選択することを特徴とする制御装置。
【請求項３】
請求項２記載の制御装置において、
前記制御装置は、前記機能実現手段をロックする機能を有し、前記切替手段は、ロックされていない機能実現手段に切り替える制御装置。
【請求項４】
請求項２記載の制御装置において、
前記制御装置は、実行中に例外が発生した前記機能実現手段を識別できる情報を記憶する例外発生記憶部を備える制御装置。
【請求項５】
請求項２記載の制御装置において、
前記切替手段は、選択された前記機能実現手段の実行中に例外が発生したとき、この機能実現手段に対し、例外発生回数があらかじめ定めた回数以上の場合は、前記割当て手順から除外する制御装置。
【請求項６】
請求項２記載の制御装置において、
前記制御装置は、前記切替手段とメモリとＣＰＵとを備えるマイクロコントローラを備え、
前記マイクロコントローラは、前記メモリに同じプログラムを複数格納し、前記ＣＰＵのコアを１つまたは複数備え、
さらに、この１つまたは複数のＣＰＵコアと複数の前記プログラムを格納したメモリの番地とを対応させ、前記マイクロコントローラの起動時および再起動時にはこの対応関係を切り替える切替手段を備える制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アクチュエータを制御するシステムの制御装置に係わり、特に、マイクロコントローラを内蔵する制御装置に関する。
【背景技術】
【０００２】
自動車のエンジン制御装置においては、クランク角センサ信号などの入力を基に、燃料の量や噴射タイミングを制御する。エンジン制御には、高機能化にともない、多くの情報を基にした高度な制御が要求される。近年、エンジン制御装置は、マイクロコントローラ（以下、「マイコン」と称する）が内蔵され、あらかじめ処理の手順が記されたプログラムがＲＯＭ（読み出し専用メモリ）に記憶されている。さらに、マイコンが複数個搭載されたり、マイコンに内蔵されるＣＰＵ（中央処理装置）コアが複数になったりすると、処理を並列に実行できるようになり、性能向上や冗長性を活かした高信頼機能が実現できるようになる。
【０００３】
システムの高信頼性機能を実現する技術として、特許文献１には、メモリを二重化する技術が記載されている。この技術は、エラー検出回路を備えるシステムにおいて、メモリとシステムバスを二重化し、メモリから読み出したデータにエラーがないことをエラー検出回路でチェックするものである。
【０００４】
【特許文献１】特開平８−１６４８４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
マイコンを搭載した制御装置は、ＲＯＭに記憶したプログラムに従って処理を実現する。システム起動時には、制御装置は、あらかじめ決められたプログラム番地から処理を開始する。このシステム起動時に実行するプログラムが格納されているＲＯＭ内の領域に異常が発生した場合は、システムが動作しなくなり、システムダウンとなる。また、ＣＰＵコアを複数搭載したマイコンにおいても、１つのＣＰＵコアが故障した場合、それがシステム起動時に使用されるものであれば、この場合もシステムが動作しなくなり、システムダウンとなる。
【０００６】
特許文献１に記載の技術は、ＣＰＵコアの故障時については言及がなく、また、エラー検出回路を備え、メモリだけでなくシステムバスやシステムバス制御装置も二重化するので、システムの規模が大きくなり、コストの上昇や運用・管理の煩雑さが予想される。
【０００７】
本発明は、ＲＯＭなどのメモリやＣＰＵコアをはじめとするハードウェアに異常が発生した場合でも、異常を回避しシステムダウンを防止することのできる制御装置を、簡易な構成で提供することを目的としている。
【課題を解決するための手段】
【０００８】
本発明の制御装置は、上記課題を解決するために、次のような特徴を有する。
【０００９】
同じ機能を実現する複数の機能実現手段を有する制御装置であって、前記機能実現手段を切替により選択する切替手段を有し、起動時および異常発生後の再起動時に、前記切替手段は、複数の前記機能実現手段の中から使用対象となるべき機能実現手段を切替動作によって選択し、機能実現手段に異常があった場合、次回の起動時には異なる機能実現手段を選択することを特徴とする。
【００１０】
また、同じ機能を実現する複数の機能実現手段を有する制御装置において、前記制御装置の起動時および再起動時に所定の割当て手順に従って、使用対象となる機能実現手段を複数の前記機能実現手段の中から切替により選択する切替手段を有し、この切替手段は、選択された機能実現手段に異常が生じた場合には、異常が生じた機能実現手段を前記割当て手順から除外して割当て手順を再編し、以後の再起動時の機能実現手段を切替により選択することを特徴とする。
【００１１】
上記の機能実現手段とは、制御装置が備えるマイクロコントローラが実行するプログラム、またはこのマイクロコントローラが備えるＣＰＵのコアである。
【発明の効果】
【００１２】
本発明によれば、マイコンを搭載した制御装置において、同じ機能を実現するハードウェアを複数備え、マイコンの起動時やリセット（再起動）時毎にこれらのハードウェアを切り替えて動作させることで、システムダウンを回避することができる。
【発明を実施するための最良の形態】
【００１３】
本発明は、マイコンの起動時やリセット（再起動）時毎にハードウェアを所定の割当て手順、例えばローテーションに従って切り替えることを特徴とするものであり、以下の実施例では、切り替えるハードウェアの例として、メモリの番地、ＣＰＵコア、およびメモリの番地とＣＰＵコアの両者の場合について説明する。マイコンは、システムの稼動時にリセットされるものとする。なお、本実施例では、電源投入後のマイコンの起動もリセットと称し、ＣＰＵコアのことを単に「ＣＰＵ」と称する。
【実施例１】
【００１４】
実施例１は、同じ初期化処理プログラムをメモリ内に２つ持つことにより、初期化処理プログラムを格納したメモリ領域に異常が発生した場合でもシステムダウンを回避できることを示す例である。本実施例では、マイコンのリセット毎にプログラムの開始番地を切り替えることにより、メモリ内の初期化処理プログラムを切り替える。
【００１５】
図１は、本発明の一実施形態を示す制御装置の構成図である。制御装置１は、１つまたは複数のセンサ３および１つまたは複数のアクチュエータ２に接続され、また、ネットワーク４を介して他の制御装置５と通信し、システムを制御する。さらに、制御装置１は、マイコンＡ１１、マイコンＢ１２、および１つまたは複数の周辺ＩＣ（集積回路）１３を搭載する。
【００１６】
マイコンＡ１１は、マイコンＢ１２、および周辺ＩＣ１３と接続されている。また、マイコンＡ１１は、制御装置１が制御を実行するのに必要なプログラムやデータが格納されたＦｌａｓｈＲＯＭ（フラッシュメモリ）１１２、ＲＡＭ（ランダムアクセスメモリ）１１３、プログラム起動制御部１１１、ＤＭＡ（ダイレクトメモリアクセス）コントローラ１１５、例外発生識別子格納部１１７、ＣＰＵ（中央処理装置）１１４、および周辺モジュール１１６から構成される。ＣＰＵ１１４は、起動時にプログラム起動制御部１１１に格納された起動識別子に従い、ＦｌａｓｈＲＯＭ１１２に格納されたプログラムの処理を指定番地から開始し、制御装置１の制御を実施する。
【００１７】
マイコンＢ１２は、マイコンＡ１１と同様の構成でもよいし、他の任意の構成でもよい。以下では、マイコンＡ１１に着目し、マイコンＡ１１での処理について説明する。
【００１８】
図２は、プログラム起動制御部１１１の構成図である。プログラム起動制御部１１１は、起動識別子格納部１１１１と起動テーブル１１１２とから構成される。
【００１９】
起動識別子格納部１１１１は、プログラム起動を行う起動識別子が格納されている。電源投入時は、起動識別子は不定値となる。
【００２０】
起動テーブル１１１２は、起動識別子、開始番地、および開始許可が記録されているテーブルであり、先に述べた所定のローテーション（割当て手順）が記録されている。プログラムは、起動識別子に従い、指定されている開始番地から実行を開始する。開始番地とは、プログラムを開始するメモリの番地であり、開始許可に従い、該当する開始番地からプログラムが開始される。
【００２１】
開始許可は、該当する開始番地からプログラムを開始することの許可／禁止を設定するためのものであり、プログラムは、「許可」に設定された開始番地から開始されるが、「禁止」に設定された開始番地からは開始されない。すなわち、「禁止」に設定された開始番地は、ローテーションから除外される。ローテーションは、このような開始許可の許可／禁止の設定により再編される。なお、開始許可が「許可」に設定されている起動識別子が１つだけの場合も、ローテーションに含める。
【００２２】
図２の起動テーブル１１１２の例では、起動識別子が起動＿０の場合は、開始番地が０ｘ００００で開始許可が「許可」であるので、プログラムは０ｘ００００番地から開始する。起動識別子が起動＿１の場合は、開始番地が０ｘ２０００で開始許可が「許可」であるので、プログラムは０ｘ２０００番地から開始する。
【００２３】
開始許可が「禁止」、すなわち開始が禁止されている場合には、該当する起動識別子は選択されず、起動識別子格納部１１１１に格納されない。例えば、起動＿１の開始許可が「禁止」に設定された場合、０ｘ２０００番地からプログラムがスタートするケースはない。プログラムは、開始許可が「許可」と設定されている開始番地だけから開始する。図２の例で起動＿１の開始許可が「禁止」に設定された場合は、常に起動＿０の０ｘ００００番地からプログラムがスタートすることになる。開始許可が「許可」と設定されている開始番地が複数ある場合は、プログラムの開始番地は、起動テーブル１１１２に記録されている順に切り替わる。
【００２４】
図３は、マイコンＡ１１のリセット時からプログラム開始までの処理フローを示した図である。図２のプログラム起動制御部１１１の構成図を用いて、本処理フローを説明する。なお、電源投入後の起動時の処理は、起動識別子の値が不定であること以外は、リセット時の処理と同様である。以下では、電源投入後の起動時の処理も、リセット時の処理に含めて説明する。
【００２５】
まず処理１９１で、マイコンＡ１１がリセット（電源投入時は起動）される。
【００２６】
処理１９２では、起動識別子格納部１１１１に格納してある起動識別子が有効な値であるか、すなわち不定値でないかを判別する。これは、電源投入時には、起動識別子が不定値になっているためである。なお、起動識別子格納部１１１１は、システム電源が保持されている場合は、リセットが発生しても初期化されないため、前回のリセット時にセットされた値が保持されている。
【００２７】
処理１９２で判定がＹＥＳ、すなわち起動識別子が有効な値である場合、処理１９３を実施する。処理１９３は、起動テーブル１１１２に記録されている起動識別子のうち、開始許可が「許可」と設定されている起動識別子であって、現在、起動識別子格納部１１１１に保存してある起動識別子の次に記録されているものを起動識別子格納部１１１１に格納する。例えば図２の例では、現在の起動識別子が起動＿０であれば、起動＿１を格納する。このとき、現在の起動識別子は上書きされ、新たに格納された起動識別子である起動＿１だけが起動識別子格納部１１１１に保存される。もし、現在の起動識別子が起動テーブル１１１２の最後に記録されている起動識別子であれば、最上位に記録されている起動識別子に戻って、開始許可が「許可」と設定されている起動識別子を格納する。
【００２８】
処理１９２で判定がＮＯ、すなわち起動識別子が不定値である場合は、処理１９４を実施する。処理１９４では、起動テーブル１１１２の最上位に記録されている起動識別子である起動＿０を、デフォルトの起動識別子として保存する。もし、最上位に記録されている起動識別子の開始許可が「禁止」である場合は、その起動識別子を飛ばし、開始許可が「許可」である次の起動識別子を保存する。
【００２９】
以上のように、本処理フローでは、開始許可が「禁止」であるものを除いて、起動識別子を起動識別子格納部１１１１に順に保存する。
【００３０】
処理１９３または処理１９４が終了したら、処理１９５に進む。処理１９５では、起動識別子格納部１１１１に格納してある起動識別子に対応する開始番地にジャンプして、プログラムの処理を開始する。例えば、起動＿１が起動識別子格納部１１１１に保存されている場合、起動テーブル１１１２に従い０ｘ２０００番地から処理を開始する。
【００３１】
このようにして、マイコンＡ１１は、リセット毎にプログラムの開始番地を切り替えることができる。
【００３２】
図４は、マイコンのリセット毎に起動識別子が切り替わる様子を示したチャート図である。図２と図３を用いて、本チャート図を説明する。
【００３３】
図４の上図は、通常ケースであり、システムが正常に稼動している場合の例である。
【００３４】
時刻ｔ１８０１で電源が投入（パワーＯＮ）されシステムが稼動（システムＯＮ）されると、マイコンＡ１１のリセットが発生し、図３の処理フローに従ってプログラム開始処理が実施される。このとき、起動識別子格納部１１１１には、不定値が入っているため、起動＿０が格納され、プログラムは、起動＿０に対応する開始番地０ｘ００００から開始される。
【００３５】
時刻ｔ１８０２でシステムが停止（システムＯＦＦ）した後、時刻ｔ１８０３でシステムがＯＮになると、マイコンＡ１１のリセットが発生し、図３の処理フローに従ってプログラム開始処理が実施される。このときは、起動識別子格納部１１１１に起動＿０が既に格納されているので、次の起動識別子である起動＿１が格納され、プログラムは、起動＿１に対応する開始番地０ｘ２０００から開始される。
【００３６】
以後、システムがＯＦＦした後、システムがＯＮになりマイコンＡ１１のリセットが発生する度に、起動テーブル１１１２に記録されている順に従って、起動識別子が起動識別子格納部１１１１に格納される。プログラムの開始番地も、起動テーブル１１１２に記録されている順に従って切り替わる。図２の例では、起動＿０と起動＿１が順に切り替わって起動識別子格納部１１１１に格納される。従って、プログラムは、開始番地０ｘ００００と０ｘ２０００が交互に切り替わって開始される。
【００３７】
図４の下図は、異常ケースの例であり、ＦｌａｓｈＲＯＭ１１２の０ｘ００００番地またはその付近の番地に異常が発生したため、起動＿０による動作が異常となるケースである。
【００３８】
時刻ｔ１８１１にパワーＯＮとシステムＯＮになると、通常ケースと同様に、マイコンＡ１１のリセットが発生し、起動＿０が選択される。プログラムは、起動＿０に対応する開始番地０ｘ００００から開始される。
【００３９】
このとき、０ｘ００００番地またはその付近のメモリが異常なため、時刻ｔ１８１２でプログラムが誤動作する。マイコンＡ１１は、この誤動作による例外を処理するとリセットが発生する。このリセットにより、次に起動＿１が割り当てられる。
【００４０】
時刻ｔ１８１３でシステムがＯＦＦとなった後、時刻ｔ１８１４でシステムがＯＮになると、マイコンＡ１１のリセットが発生する。このリセットでは、再度、起動＿０が割り当てられるが、時刻ｔ１８１１のシステムＯＮ時と同様にプログラムの誤動作が起こり、例外処理により時刻ｔ１８１５でリセットが発生する。
【００４１】
このときのリセットで、起動＿０でプログラム開始時の誤動作によるリセットが２回連続で発生したため、例外処理により、起動＿０での起動は異常が発生するとマイコンＡ１１が判断し、起動テーブル１１１２の起動＿０の開始を「禁止」と設定する（図４下図内の起動テーブル１１１２参照）。これ以降のリセット時は、起動＿０によりプログラムが開始されることはなく、起動＿０以外の起動識別子が選択される。図４の起動テーブル１１１２の例では、起動＿１のみが繰り返し選択される（図４の時刻ｔ１８１７）。これにより、メモリ異常によるプログラムの誤動作発生を回避するとともに、システムダウンも回避することができる。例外処理の詳細については、後述する。
【００４２】
なお、上記の例では、プログラムの誤動作によるリセットが２回連続で発生したときに異常が発生したと判断したが、連続でなくても累積で２回リセットが発生したときに、異常が発生したと判断するようにしてもよい。また、異常が発生したと判断するリセットの回数は、２回に限るものではなく、例えば３回以上でもよい。この回数は、あらかじめ規定しておくことができる。
【００４３】
図５は、ＦｌａｓｈＲＯＭ１１２に格納されているプログラムのメモリ上の配置図である。ＦｌａｓｈＲＯＭ１１２内の０ｘ００００番地と０ｘ２０００番地には、それぞれ初期化処理（＃０）１１２１と初期化処理（＃１）１１２２とが配置されている。初期化処理１１２１と１１２２の内容は同じである。また、０ｘ３０００番地には、メイン処理１１２３が配置されている。
【００４４】
初期化処理１１２１と１１２２は、システムを起動するとともにシステムダウンを避けるための必要最低限の処理であり、システムに応じて異なる。図２の起動テーブル１１１２に示したように、起動識別子が起動＿０の場合は０ｘ００００番地に格納されている初期化処理１１２１が、起動＿１の場合は０ｘ２０００番地に格納されている初期化処理１１２２が、それぞれ実行される。プログラムが開始され、初期化処理１１２１または初期化処理１１２２が終了すると、メイン処理１１２３に移り、システムのメイン処理が実行される。
【００４５】
なお、図４の異常ケースに示したように、起動＿０に異常が発生した場合は、時刻ｔ１８１２からｔ１８１３まで、および時刻ｔ１８１５以降は、初期化処理（＃１）１１２２が実施された後に、メイン処理１１２３が実施される。時刻ｔ１８１１と時刻ｔ１８１４のリセット時では、初期化処理（＃０）１１２１で異常が発生するため、メイン処理１１２３は実施されない。
【００４６】
このように、起動時に実施する初期化処理のプログラムを格納したメモリ領域に異常が発生しても、メモリ内に初期化処理を複数備えてそれらを切り替えて実施することで、メモリの異常を回避し、プログラムの誤動作やシステムダウンを避けることができる。
【００４７】
異常発生時の例外処理を、図６に示した異常発生時の例外処理フロー図を用いて説明する。
【００４８】
異常により例外が発生した後、処理１７１では、起動識別子格納部１１１１に格納してある起動識別子を、例外発生識別子格納部１１７（図１参照）に保存する。
【００４９】
処理１７２で、例外処理ハンドラを起動し、例外を処理してプログラムを続行する。
【００５０】
処理１７３では、例外発生識別子格納部１１７に保存された起動識別子を読み出し、過去に同じ起動識別子で例外が発生していないか、発生している場合は発生の連続回数または累積回数を調べる。例外発生の連続回数または蓄積回数が規定以上の場合は、その起動識別子を異常と判定する。図４の異常ケースの例では、起動＿０が２回連続して例外を発生しており、その時点で起動＿０を異常と判定している。
【００５１】
処理１７３で異常と判定した場合は、処理１７４に進み、起動テーブル１１１２の該当起動識別子の開始許可を「禁止」に設定する。これにより、起動＿０によるプログラム開始を回避することができる。
【００５２】
処理１７３または処理１７４が終了したら、処理１７５に進んでマイコンのリセットを発生させ、図４のチャート図に示したように処理を続行する。
【実施例２】
【００５３】
実施例１では、１つのＣＰＵを搭載し、同じ初期化処理プログラムを２つ持つことにより、初期化処理に異常が発生した場合でもシステムダウンに至らないことを示した。実施例２では、複数のＣＰＵコア（ＣＰＵ）を搭載するマイコンにおいて本発明を実施した場合を示す。本実施例は、マイコンのリセット毎にＣＰＵを切り替えるものである。
【００５４】
図７は、本実施例における制御装置の構成図である。制御装置６は、１つまたは複数のセンサ８および１つまたは複数のアクチュエータ７に接続され、また、ネットワーク９を介して他の制御装置１０と通信し、システムを制御する。さらに、制御装置６は、マイコンＡ６１、マイコンＢ６２、および１つまたは複数の周辺ＩＣ６３を搭載する。
【００５５】
マイコンＡ６１は、マイコンＢ６２、および周辺ＩＣ６３と接続されている。また、マイコンＡ６１は、制御装置６が制御を実行するのに必要なプログラムやデータが格納されたＦｌａｓｈＲＯＭ６１２、ＲＡＭ６１３、プログラム起動制御部６１１、ＤＭＡコントローラ６１５、例外発生識別子格納部６１７、および周辺モジュール６１６から構成される。さらに、マイコンＡ６１は、３つのＣＰＵ、すなわちＣＰＵ（０）６１４ａ、ＣＰＵ（１）６１４ｂ、およびＣＰＵ（２）６１４ｃを搭載する。ＣＰＵ（０）６１４ａ、ＣＰＵ（１）６１４ｂ、およびＣＰＵ（２）６１４ｃは、起動時にプログラム起動制御部６１１に従い、ＦｌａｓｈＲＯＭ６１２に格納されたプログラムの処理をそれぞれの指定番地から開始し、制御装置６の制御を実施する。なお、本実施例では３つのＣＰＵがマイコンＡ６１に搭載されているが、ＣＰＵの数はこれに限るものではなく、複数であればよい。
【００５６】
実施例１と同様に、マイコンＢ６２は、マイコンＡ６１と同様の構成でもよいし、他の任意の構成でもよい。以下では、マイコンＡ６１に着目し、マイコンＡ６１での処理について説明する。
【００５７】
図８は、プログラム起動制御部６１１の構成図である。プログラム起動制御部６１１は、ＣＰＵ割当テーブル６１１１とＣＰＵプログラム起動テーブル６１１２とから構成される。
【００５８】
ＣＰＵ割当テーブル６１１１には、物理ＣＰＵ、論理ＣＰＵ、ＬＯＣＫ、および開始許可のデータが格納されており、先に述べた所定のローテーションが記録されている。物理ＣＰＵは、ＣＰＵそのものを物理的に識別する識別子であり、マイコンＡ６１が備えるＣＰＵに対するデータである。論理ＣＰＵは、論理的にＣＰＵを識別する識別子であり、ＣＰＵプログラム起動テーブル６１１２により、プログラムを開始するメモリ上の番地（開始番地）が決まっている。電源投入時は、論理ＣＰＵは不定値となる。
【００５９】
ＬＯＣＫは、物理ＣＰＵと論理ＣＰＵとの対応（割当て）を切り替えずに、現在の設定を固定にしておくために設けられたフラグである。ＬＯＣＫの値が「ｕｎｌｏｃｋ」の場合は、マイコンＡ６１のリセット毎に論理ＣＰＵに割り当てられる物理ＣＰＵが切り替わり、「ｌｏｃｋ」の場合は、切り替わらず割当てがロックされる。
【００６０】
開始許可は、該当するＣＰＵに対してプログラムを開始することの許可／禁止を設定するためのものである。ＬＯＣＫの値が「ｕｎｌｏｃｋ」であると開始許可は「許可」であり、「ｌｏｃｋ」であると開始許可は「禁止」となる。「許可」に設定されたＣＰＵのみが処理を実行し、「禁止」に設定されたＣＰＵは実行しない。すなわち、「禁止」に設定されたＣＰＵは、ローテーションから除外される。ローテーションは、このような開始許可の許可／禁止の設定により再編される。なお、開始許可が「許可」に設定されているＣＰＵが１つだけの場合も、ローテーションに含める。
【００６１】
これらのテーブル情報により、ＣＰＵに故障が発生した場合は、そのＣＰＵの動作そのものを停止することができる。また、プログラムを格納するメモリ領域に異常が発生した場合には、そのプログラムを実行する論理ＣＰＵを開始禁止にすることで、メモリの異常領域に格納されたプログラムの実行を回避することもできる。
【００６２】
図９は、マイコンＡ６１のリセット時からプログラム開始までの処理フローを示した図である。図８のプログラム起動制御部６１１の構成図を用いて、本処理フローを説明する。なお本実施例でも、電源投入後の起動時の処理は、論理ＣＰＵの値が不定であること以外は、リセット時の処理と同様である。以下では、電源投入後の起動時の処理も、リセット時の処理に含めて説明する。
【００６３】
まず処理６９１で、マイコンＡ６１がリセット（電源投入時は起動）される。
【００６４】
処理６９２では、ＣＰＵ割当テーブル６１１１に格納してある、物理ＣＰＵ（ＣＰＵ（０））に該当する論理ＣＰＵが有効な値であるか、すなわち不定値でないかを判別する。これは、電源投入時には、論理ＣＰＵの値が不定になっているためである。なお、ＣＰＵ割当テーブル６１１１は、システム電源が保持されている場合は、リセットが発生しても初期化されないため、前回のリセット時にセットされた値が保持されている。
【００６５】
処理６９２で判定がＹＥＳ、すなわち論理ＣＰＵが有効な値である場合、処理６９３を実施する。処理６９３は、ＣＰＵ割当テーブル６１１１で最上位に記録されている物理ＣＰＵに対応させる（割り当てる）論理ＣＰＵを切り替える。例えば、現在、物理ＣＰＵであるＣＰＵ（０）に割り当てられている論理ＣＰＵがＣＰＵ＿Ａであれば、この割当てを変更し、ＣＰＵ＿Ｃを割り当てる。この割当ては、ＣＰＵプログラム起動テーブル６１１２に記録されている順（本実施例では下から上へ）に従って行うことができる。
【００６６】
この際、ＣＰＵ割当テーブル６１１１の最上位に記録されている物理ＣＰＵのＬＯＣＫの値が「ｌｏｃｋ」であれば、この物理ＣＰＵは、論理ＣＰＵの割当てが変更されない。この場合、その物理ＣＰＵを飛ばし、次のＬＯＣＫの値が「ｕｎｌｏｃｋ」である物理ＣＰＵに対し、割り当てる論理ＣＰＵを切り替える。
【００６７】
処理６９２で判定がＮＯ、すなわち論理ＣＰＵが不定値の場合は、処理６９４を実施する。処理６９４では、論理ＣＰＵが不定値であるので、あらかじめ規定したデフォルトの論理ＣＰＵを物理ＣＰＵのＣＰＵ（０）に設定する。本実施例では、デフォルトの論理ＣＰＵをＣＰＵ＿Ａとしている。
【００６８】
処理６９３または処理６９４が終了したら、処理６９５に進む。処理６９５では、ＣＰＵ（０）に対する論理ＣＰＵの割当てを基準に、ＣＰＵ（１）以降の論理ＣＰＵの割当てを実施する。上記の例では、ＣＰＵ（０）にはＣＰＵ＿Ａが割り当てられているので、ＣＰＵ（１）とＣＰＵ（２）には、それぞれＣＰＵ＿ＢとＣＰＵ＿Ｃが割り当てられる。
【００６９】
この際、ＣＰＵ割当テーブル６１１１でＬＯＣＫの値が「ｌｏｃｋ」である物理ＣＰＵに関しては、割当てが変更されない。この場合、その物理ＣＰＵを飛ばし、次のＬＯＣＫの値が「ｕｎｌｏｃｋ」である物理ＣＰＵに対し、割り当てる論理ＣＰＵを切り替える。
【００７０】
処理６９６では、各論理ＣＰＵは、ＣＰＵプログラム起動テーブル６１１２に従って開始番地にジャンプし、プログラムの処理を開始する。このとき、開始許可が「禁止」に設定されているＣＰＵは、処理を実行しない。
【００７１】
このようにして、マイコンＡ６１は、リセット毎に物理ＣＰＵと論理ＣＰＵの割当てを変更することで、物理ＣＰＵが処理するプログラムが格納されているメモリ上の番地、すなわち、物理ＣＰＵが実際に処理するプログラムの内容を切り替えることができる。また、物理ＣＰＵが処理を実行できなくすることもできる。
【００７２】
図１０は、マイコンのリセット毎に物理ＣＰＵと論理ＣＰＵの割当てが切り替わる様子を示したチャート図である。図８と図９を用いて、本チャート図を説明する。なお、図１０では簡略化のために、時刻ｔ６８０１の後はマイコンがリセットされる時刻のみを示したが、図４と同様に、システムが停止（システムＯＦＦ）した後、システムが稼動（システムＯＮ）してマイコンのリセットが発生する。
【００７３】
図１０の上図は、通常ケースであり、システムが正常に稼動している場合の例である。
【００７４】
時刻ｔ６８０１で電源が投入（パワーＯＮ）されてシステムＯＮになると、マイコンＡ６１のリセットが発生し、図９の処理フローに従ってプログラム開始処理が実施される。
【００７５】
このとき、ＣＰＵ割当テーブル６１１１の論理ＣＰＵには不定値が入っているため、デフォルトの論理ＣＰＵ（ＣＰＵ＿Ａ）が物理ＣＰＵであるＣＰＵ（０）に設定される。また、ＣＰＵ（１）とＣＰＵ（２）には、ＣＰＵ＿ＢとＣＰＵ＿Ｃがそれぞれ割り当てられる。
【００７６】
以後、時刻ｔ６８０２、ｔ６８０３、およびｔ６８０４でマイコンＡ６１のリセットが発生する度に、ＣＰＵプログラム起動テーブル６１１２に記録されている順（本実施例では下から上へ）に従って、物理ＣＰＵと論理ＣＰＵとの割当てが切り替わる。従って、各物理ＣＰＵが処理するプログラムの内容も切り替わる。
【００７７】
図１０の下図は、異常ケースの例であり、ＣＰＵ（１）が故障して動作が異常となるケースである。
【００７８】
時刻ｔ６８１１にパワーＯＮとシステムＯＮになると、通常ケースと同様に、マイコンＡ６１のリセットが発生し、ＣＰＵ（１）にはＣＰＵ＿Ｂが割り当てられる。このとき、ＣＰＵ（１）は故障しているため、マイコンＡ６１がプログラムを実行すると、ＣＰＵ＿Ｂに異常が発生する。
【００７９】
このＣＰＵ＿Ｂの異常発生により、マイコンＡ６１は例外を処理し、時刻ｔ６８１２でリセットが発生する。このリセットにより、故障しているＣＰＵ（１）にはＣＰＵ＿Ａが割り当てられる。このときは、マイコンＡ６１がプログラムを続行すると、ＣＰＵ＿Ａに異常が発生する。
【００８０】
このように、ＣＰＵ（１）が割り当てられている論理ＣＰＵの異常によるリセットが２回連続して発生したため、例外処理により、ＣＰＵ（１）は、異常と判定され、論理ＣＰＵがＣＰＵ＿Ｃに割り当てられるとともに、ＬＯＣＫの値が「ｌｏｃｋ」に、開始許可が「禁止」に設定される（図１０下図内のＣＰＵ割当テーブル６１１１参照）。これにより、異常が発生したＣＰＵ（１）では、プログラムが実行されなくなる。また、ＣＰＵ＿Ｃが実行されないため、開始番地０ｘ４０００に格納されたプログラムは開始されない。
【００８１】
時刻ｔ６８１３以降は、マイコンＡ６１のリセット毎に、ＣＰＵ（０）とＣＰＵ（２）のみに対して、ＣＰＵ＿ＡとＣＰＵ＿Ｂの割当てを切り替えることになる。従って、プログラムは、物理ＣＰＵはＣＰＵ（０）とＣＰＵ（２）だけで、論理ＣＰＵはＣＰＵ＿ＡとＣＰＵ＿Ｂだけで、実行される。これにより、ＣＰＵの異常によるプログラムの誤動作発生を回避するとともに、システムダウンも回避することができる。例外処理の詳細については、後述する。
【００８２】
なお、上記の例では、リセットが２回連続して発生したときにＣＰＵに異常が発生したと判断したが、実施例１と同様に、連続でなくても累積で２回リセットが発生したときに、異常が発生したと判断するようにしてもよい。また、この異常が発生したと判断するリセットの回数も実施例１と同様に、２回に限るものではなく、例えば３回以上でもよい。この回数は、あらかじめ規定しておくことができる。
【００８３】
図１１は、ＦｌａｓｈＲＯＭ６１２に格納されているプログラムのメモリ上の配置図である。ＦｌａｓｈＲＯＭ６１２内の０ｘ００００番地、０ｘ２０００番地、および０ｘ４０００番地には、各論理ＣＰＵ、すなわちＣＰＵ＿Ａ、ＣＰＵ＿Ｂ、ＣＰＵ＿Ｃにより開始されるプログラムが格納されている。それぞれの論理ＣＰＵが開始するプログラムの内容については、例えばメイン処理はＣＰＵ＿Ａで実行し、メイン処理に先立つ初期化処理など補助的な処理はＣＰＵ＿ＢおよびＣＰＵ＿Ｃで実行するというように決めておく。複数の論理ＣＰＵ（例えばＣＰＵ＿ＢおよびＣＰＵ＿Ｃ）で実行される補助的な処理は、同一のものにすることができる。
【００８４】
補助的な処理を実行するＣＰＵの１つが故障したとき、故障した物理ＣＰＵをＣＰＵ＿ＣまたはＣＰＵ＿Ｂに割り当てて開始禁止にする。このようにすると、補助的な処理を実行するＣＰＵが１つ故障したとしても、他のＣＰＵで初期化処理などの補助的な処理を実行でき、引き続いてメイン処理も実行できるようになるので、プログラムの誤動作やシステムダウンを避けることができる。
【００８５】
異常発生時の例外処理を、図１２に示した異常発生時の例外処理フロー図を用いて説明する。
【００８６】
異常により例外が発生した後、処理６７１では、ＣＰＵ割当テーブル６１１１に格納してある物理ＣＰＵのうち、例外を発生させた物理ＣＰＵを例外発生識別子格納部６１７に保存する。
【００８７】
処理６７２で、例外処理ハンドラを起動し、例外を処理してプログラムを続行する。
【００８８】
処理６７３では、例外発生識別子格納部６１７に保存された物理ＣＰＵを読みだし、過去に同じ物理ＣＰＵで例外が発生していないか、発生している場合は発生の連続回数または累積回数を調べる。例外発生の連続回数または蓄積回数が規定以上の場合は、その物理ＣＰＵを異常と判定する。図１０の異常ケースの例では、ＣＰＵ（１）が２回連続して例外を発生しており、その時点でＣＰＵ（１）を異常と判定している。
【００８９】
処理６７３で異常と判定した場合は、処理６７４に進む。この処理では、該当物理ＣＰＵがメイン処理を実行する論理ＣＰＵ（図１１の説明で用いた例ではＣＰＵ＿Ａ）に現在割り当てられているかどうかを判定する。この判定をここで行うのは、もし、該当物理ＣＰＵがメイン処理を担当する論理ＣＰＵに割り当てられている場合に、次の処理６７５で行う、ＣＰＵ割当テーブル６１１１のＬＯＣＫを「ｌｏｃｋ」に設定し開始許可を「禁止」に設定する処理を実施すると、この論理ＣＰＵ（ＣＰＵ＿Ａ）で行うメイン処理が実行できなくなるからである。
【００９０】
これを回避するために、この時点でのＣＰＵ割当テーブル６１１１のＬＯＣＫや開始許可の設定は避け、次回以降に該当物理ＣＰＵ（ＣＰＵ（１））がメイン処理を行わない論理ＣＰＵに割り当たったときに、ＬＯＣＫを「ｌｏｃｋ」に、開始許可を「禁止」に設定する。このようにして、メイン処理を実行する論理ＣＰＵが常時処理を実行できるようにする。
【００９１】
処理６７４で該当物理ＣＰＵがメイン処理を実行する論理ＣＰＵに割り当てられていないと判定した場合は、処理６７５に進む。この処理では、ＣＰＵ割当テーブル６１１１における該当物理ＣＰＵのＬＯＣＫを「ｌｏｃｋ」に設定し、開始許可を「禁止」に設定する。こうすることにより、該当物理ＣＰＵ（ＣＰＵ（１））によるプログラム開始を回避することができる。
【００９２】
処理６７３、処理６７４、または処理６７５が終了したら、処理６７６に進んでマイコンのリセットを発生させ、図１０のチャート図に示したように処理を続行する。
【実施例３】
【００９３】
実施例１では、プログラムの開始番地を切り替える実施例を示し、実施例２では、プログラムを実行するＣＰＵを切り替える実施例を示した。本実施例は、上記２つの実施例での処理を並行して実行し、所定のローテーションに従って、プログラムを実行するＣＰＵを切り替えるとともに、その各ＣＰＵでもプログラムの開始番地を切り替える例である。すなわち、実施例２で記載したように論理ＣＰＵを切り替えたときに、その論理ＣＰＵ毎に、実施例１で記載したように実行するプログラムの開始番地を切り替える。
【００９４】
本実施例における制御装置の構成図は、実施例２で示した図７と同様である。マイコンＡ６１は、複数のＣＰＵを搭載する。ただし、プログラム起動制御部６１１は、実施例１の図２に示した起動識別子格納部１１１１および起動テーブル１１１２、ならびに実施例２の図８に示したＣＰＵ割当テーブル６１１１およびＣＰＵプログラム起動テーブル６１１２を備える。
【００９５】
ＦｌａｓｈＲＯＭ１１２に格納されているプログラムのメモリ上の配置も、実施例１（図５）と実施例２（図１１）とを合わせたものである。すなわち、図１１のように各ＣＰＵにプログラムが割り当てられるが、その割り当てられるプログラムは、図５のように各ＣＰＵに対し複数（図５の例では２つ）である。
【００９６】
マイコンＡ６１の処理内容も、実施例１と実施例２とを合わせたものである。まず、実施例２のように所定のローテーションに従ってＣＰＵを切り替えた後、それぞれのＣＰＵに対して、実施例１のように所定のローテーションに従ってプログラムの開始番地を切り替える処理を行う。処理フローやチャートは、実施例１と実施例２とで用いたものを利用することができる。
【００９７】
本実施例により、実施例２で記載したＣＰＵ故障時のシステムダウンの回避と、実施例１で記載したプログラム故障によるシステムダウンの回避との両方を実施することができる。
【産業上の利用可能性】
【００９８】
本発明は、自動車制御をはじめとして、マイコンを内蔵した制御装置に適用可能である。
【図面の簡単な説明】
【００９９】
【図１】本発明の一実施形態（実施例１）を示す制御装置の構成図である。
【図２】実施例１におけるプログラム起動制御部の構成図である。
【図３】実施例１におけるリセット時の処理フローを示した図である。
【図４】実施例１における起動識別子が切り替わる様子を示したチャート図である。
【図５】実施例１におけるＦｌａｓｈＲＯＭ内のプログラムの配置図である。
【図６】実施例１における異常発生時の例外処理フロー図である。
【図７】本発明の別の実施形態（実施例２）を示す制御装置の構成図である。
【図８】実施例２におけるプログラム起動制御部の構成図である。
【図９】実施例２におけるリセット時の処理フローを示した図である。
【図１０】実施例２におけるＣＰＵの割当てが切り替わる様子を示したチャート図である。
【図１１】実施例２におけるＦｌａｓｈＲＯＭ内のプログラムの配置図である。
【図１２】実施例２における異常発生時の例外処理フロー図である。
【符号の説明】
【０１００】
１…制御装置、２、７…アクチュエータ、３、８…センサ、４、９…ネットワーク、５、１０…制御装置、６…制御装置、１１…マイコンＡ、１２、６２…マイコンＢ、１３、６３…周辺ＩＣ、６１…マイコンＡ、１１１…プログラム起動制御部、１１２…ＦｌａｓｈＲＯＭ、１１３、６１３…ＲＡＭ、１１４…ＣＰＵ、１１５、６１５…ＤＭＡコントローラ、１１６、６１６…周辺モジュール、１１７…例外発生識別子格納部、６１１…プログラム起動制御部、６１２…ＦｌａｓｈＲＯＭ、６１４ａ…ＣＰＵ（０）、６１４ｂ…ＣＰＵ（１）、６１４ｃ…ＣＰＵ（２）、６１７…例外発生識別子格納部、１１１１…起動識別子格納部、１１１２…起動テーブル、６１１１…ＣＰＵ割当テーブル、６１１２…ＣＰＵプログラム起動テーブル、１１２１…初期化処理（＃０）、１１２２…初期化処理（＃１）、１１２３…メイン処理。
【図１】
2010061419.tif 000003
【図２】
2010061419.tif 000004
【図３】
2010061419.tif 000005
【図４】
2010061419.tif 000006
【図５】
2010061419.tif 000007
【図６】
2010061419.tif 000008
【図７】
2010061419.tif 000009
【図８】
2010061419.tif 000010
【図９】
2010061419.tif 000011
【図１０】
2010061419.tif 000012
【図１１】
2010061419.tif 000013
【図１２】
2010061419.tif 000014