(57)【要約】【課題】スタックポインタに記憶された参照アドレスの異常を判定可能な電子制御装置を提供する。【解決手段】ＣＰＵ、ＲＯＭ、および、ＲＡＭを有する電子制御装置であって、ＣＰＵには、演算処理の実行途中の演算データを記憶する演算レジスタとスタック領域の参照アドレスが記憶されたスタックポインタが含まれ、ＲＡＭには、サブ関数コール若しくは割り込み関数の発生時において、演算データを一時的に退避させるスタック領域と参照アドレスを一時的に記憶する複数のバックアップ領域が含まれている。ＣＰＵはスタックポインタに記憶された参照アドレス、および、複数のバックアップ領域それぞれに記憶された参照アドレスそれぞれを比較することで、スタックポインタに記憶された参照アドレスの異常判定を行う。【選択図】図８
2017123119.tif 000002
【特許請求の範囲】
【請求項１】
演算処理を実行するＣＰＵ（１０）と、
前記演算処理を実行するための実行プログラムの記憶されたＲＯＭ（２０）と、
前記演算処理にて算出された算出データを記憶するＲＡＭ（３０）と、を有する電子制御装置であって、
前記ＣＰＵには、前記演算処理の実行途中の演算データを記憶する演算レジスタ（１１，１２）が含まれ、
前記ＲＡＭには、サブ関数コール若しくは割り込み関数の発生時において、前記演算データを一時的に退避させるスタック領域（３４）が含まれ、
前記ＣＰＵには前記演算レジスタの他に、前記スタック領域の参照アドレスを記憶するスタックポインタ（１３）が含まれ、
前記ＲＡＭには前記スタック領域の他に、前記参照アドレスを一時的に記憶する複数のバックアップ領域（３５，３６）が含まれており、
前記ＣＰＵは前記スタックポインタに記憶された前記参照アドレス、および、複数の前記バックアップ領域それぞれに記憶された前記参照アドレスそれぞれを比較することで、前記スタックポインタに記憶された前記参照アドレスの異常判定を行う電子制御装置。
【請求項２】
前記ＣＰＵは、前記参照アドレスの異常判定において、前記スタックポインタと複数の前記バックアップ領域それぞれに記憶された少なくとも３つの前記参照アドレスのうちの一部が一致し、且つ、前記スタックポインタに記憶された前記参照アドレスが一致と判定した前記参照アドレスと異なる場合、前記スタックポインタに記憶された前記参照アドレスを一致と判定した前記参照アドレスによって補正する請求項１に記載の電子制御装置。
【請求項３】
第１所定回数を２以上の自然数とすると、
前記ＣＰＵは、前記スタックポインタに記憶された前記参照アドレスが前記参照アドレスの異常判定において一致と判定した前記参照アドレスと異なることが前記第１所定回数だけ連続して起こった場合、前記スタックポインタが異常であると判定する請求項２に記載の電子制御装置。
【請求項４】
複数の前記バックアップ領域それぞれには、前記参照アドレスだけではなく、前記演算データも記憶されており、
前記ＣＰＵは、前記スタック領域に記憶された前記演算データと、複数の前記バックアップ領域それぞれに記憶された前記演算データそれぞれを比較することで、前記スタック領域に記憶された前記演算データの異常判定を行う請求項２または請求項３に記載の電子制御装置。
【請求項５】
前記ＣＰＵは、前記演算データの異常判定において、前記スタック領域と複数の前記バックアップ領域それぞれに記憶された少なくとも３つの対応する前記演算データのうちの一部が一致し、且つ、前記スタック領域に記憶された前記演算データが一致と判定した前記演算データと異なる場合、前記スタック領域に記憶された前記演算データを一致と判定した前記演算データによって補正する請求項４に記載の電子制御装置。
【請求項６】
第２所定回数を２以上の自然数とすると、
前記ＣＰＵは、前記スタック領域に記憶された前記演算データが前記演算データの異常判定において一致と判定した前記演算データと異なることが前記第２所定回数だけ連続して起こった場合、前記スタック領域が異常であると判定する請求項４または請求項５に記載の電子制御装置。
【請求項７】
前記バックアップ領域は前記演算データが後入れ先出しで記憶される構成となっており、
前記バックアップ領域には、前記演算データが記憶された後に前記参照アドレスが記憶され、前記演算データと前記参照アドレスとを区別するための識別子も記憶される請求項４〜請求項６のいずれか１項に記載の電子制御装置。
【請求項８】
前記ＣＰＵは、演算処理状況および前記演算データの重要度の少なくとも一方に応じて、前記スタックポインタに記憶された前記参照アドレスの異常判定、および、前記スタック領域に記憶された前記演算データの異常判定の実施を決定する請求項４〜７いずれか１項に記載の電子制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＣＰＵ、ＲＯＭ、および、ＲＡＭを有する電子制御装置に関するものである。
【背景技術】
【０００２】
特許文献１に示されるように、ＣＰＵ等を備える制御部が知られている。ＣＰＵは、処理部、スタックポインタ、および、スタック領域を備える。スタック領域は、処理部がプログラムを実行する際などに利用する記憶領域である。スタックポインタは、スタック領域のアクセスするアドレスを指定するポインタである。スタックポインタの指定するアドレス値（以下、参照アドレスと示す）は、スタック領域のアドレスの下限値と上限値との間の値をとる。
【０００３】
処理部は、参照アドレスがスタック領域のアドレスの上限値と下限値との間の範囲にあるか否かを判定する。参照アドレスが上限値と下限値との間の範囲以外を指定している場合、処理部はスタックポインタ又はスタック領域に何らかの異常が発生していると判定する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００７−７９８３９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上記したように特許文献１に示される処理部は、参照アドレスがスタック領域のアドレスの上限値と下限値との間の範囲にあるか否かを判定することで、スタックポインタ又はスタック領域に何らかの異常が発生しているか否かを判定する。しかしながら、ノイズなどのために参照アドレスがスタック領域のアドレスの上限値と下限値との間の範囲において変化することも起こり得る。このような場合、参照アドレスが変化しているために処理部がスタック領域のアクセルするアドレスが変化し、それによって処理部の動作が異常となる虞がある。上記したように特許文献１に示される処理部は、参照アドレスがスタック領域のアドレスの上限値と下限値との間の範囲にあるか否かを判定する。そのため特許文献１の処理部では上記した参照アドレスの異常を判定することが適わなかった。
【０００６】
そこで本発明は上記問題点に鑑み、スタックポインタに記憶された参照アドレスの異常を判定可能な電子制御装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記した目的を達成するための開示された発明の１つは、演算処理を実行するＣＰＵ（１０）と、
演算処理を実行するための実行プログラムの記憶されたＲＯＭ（２０）と、
演算処理にて算出された算出データを記憶するＲＡＭ（３０）と、を有する電子制御装置であって、
ＣＰＵには、演算処理の実行途中の演算データを記憶する演算レジスタ（１１，１２）が含まれ、
ＲＡＭには、サブ関数コール若しくは割り込み関数の発生時において、演算データを一時的に退避させるスタック領域（３４）が含まれ、
ＣＰＵには演算レジスタの他に、スタック領域の参照アドレスを記憶するスタックポインタ（１３）が含まれ、
ＲＡＭにはスタック領域の他に、参照アドレスを一時的に記憶する複数のバックアップ領域（３５，３６）が含まれており、
ＣＰＵはスタックポインタに記憶された参照アドレス、および、複数のバックアップ領域それぞれに記憶された参照アドレスそれぞれを比較することで、スタックポインタに記憶された参照アドレスの異常判定を行う。
【０００８】
これによればスタックポインタ（１３）に記憶された参照アドレスにノイズなどによって異常が生じた場合においても、その異常を判定することができる。
【０００９】
なお、特許請求の範囲に記載の請求項、および、課題を解決するための手段それぞれに記載の要素に括弧付きで符号をつけている。この括弧付きの符号は実施形態に記載の各構成要素との対応関係を簡易的に示すためのものであり、実施形態に記載の要素そのものを必ずしも示しているわけではない。括弧付きの符号の記載は、いたずらに特許請求の範囲を狭めるものではない。
【図面の簡単な説明】
【００１０】
【図１】電子制御装置の概略構成を示すブロック図である。
【図２】ＲＡＭの記憶領域を説明するための模式図である。
【図３】スタック領域に記憶される関数Ａの演算データを示す模式図である。
【図４】第１スタックバックアップ領域に記憶される関数Ａの演算データと参照アドレス、および、識別子を示す模式図である。
【図５】関数Ａの実行中において関数Ｂの割り込みがあった際のＣＰＵの処理動作を説明するためのタイミングチャートである。
【図６】異常カウンタ、正常カウンタ、および、異常フラグの挙動を説明するためのタイミングチャートである。
【図７】サブ関数コール若しくは割り込み関数の発生時のＣＰＵの処理動作を説明するためのフローチャートである。
【図８】ＣＰＵのデータ診断を詳説するためのフローチャートである。
【図９】スタック領域に記憶される演算データの一般的な状態を示す模式図である。
【図１０】第１スタックバックアップ領域に記憶される演算データと参照アドレス、および、識別子の一般的な状態を示す模式図である。
【図１１】関数Ａの実行中において関数Ｂと関数Ｃの割り込みがあった際のＣＰＵの処理動作を説明するためのタイミングチャートである。
【発明を実施するための形態】
【００１１】
以下、本発明に係る電子制御装置を自動車のエンジンＥＣＵに適用した場合の実施形態を図に基づいて説明する。
（第１実施形態）
図１〜図８に基づいて本実施形態に係る電子制御装置を説明する。なお図５に示すＣＰＵ１０の各処理の実行時間は、実際に要する処理の実行時間を反映していない。例えば図５ではデータの退避とバックアップを最も長く表示しているが、実際にはこの処理に要する実行時間は関数Ｂの実行時間よりも短い。
【００１２】
電子制御装置１００はエンジン自動車やハイブリッド自動車に搭載されるエンジンＥＣＵである。図１に示すように電子制御装置１００は、バス配線３００を介して自動車に搭載された他の電子制御装置（外部電子制御装置２００）と通信可能となっている。この外部電子制御装置２００は、例えばバッテリＥＣＵやトランスミッションＥＣＵである。また電子制御装置１００は自動車に搭載された燃圧センサや回転角センサなどの各種センサと電気的に接続されている。電子制御装置１００は外部電子制御装置２００との通信、および、燃圧センサや回転角センサなどから入力されるセンサ信号に基づいて、エンジンの燃料噴射量や燃料噴射タイミング、そしてプラグの点火タイミングなどを決定する。また電子制御装置１００は所定周期で自己診断を行なったりもする。
【００１３】
図１に示すように電子制御装置１００はマイクロコンピュータの構成要素としてＣＰＵ１０、ＲＯＭ２０、ＲＡＭ３０、および、Ｉ／Ｏポート４０を有する。ＣＰＵ１０はＩ／Ｏポート４０を介してバス配線３００と電気的に接続されている。またＣＰＵ１０はＲＯＭ２０およびＲＡＭ３０それぞれと電気的に接続されている。ＲＯＭ２０には演算処理を実行するための実行プログラムが記憶されている。ＲＡＭ３０には演算処理にて算出された算出データが記憶される。
【００１４】
ＣＰＵ１０には複数のレジスタが含まれている。これら複数のレジスタの代表として、図１にデータレジスタ１１、プログラムカウンタ１２、および、スタックポインタ１３を示す。データレジスタ１１はＣＰＵ１０の演算処理の実行途中のデータ（以下、途中データと示す）を記憶する。プログラムカウンタ１２は途中データの実行を開始するアドレス（以下、開始アドレスと示す）を記憶する。スタックポインタ１３は後述のＲＡＭ３０のスタック領域３４で最後に参照した位置のアドレス（以下、参照アドレスと示す）を記憶する。途中データと開始アドレスが演算データに相当する。またデータレジスタ１１とプログラムカウンタ１２が演算レジスタに相当する。以下においては途中データと開始アドレスをまとめて演算データと表す。
【００１５】
図２に示すようにＲＡＭ３０は、データ領域３１，３２、バックアップ領域３３、スタック領域３４、および、スタックバックアップ領域３５，３６を有する。図２に示すようにデータ領域３１，３２とスタックバックアップ領域３５，３６とが交互に並び、これらがスタック領域３４を介してバックアップ領域３３と並んでいる。データ領域３１，３２は算出データを記憶する。バックアップ領域３３はイニシャル処理においてもクリアされない学習データを記憶している。スタック領域３４は後述するようにサブ関数コールや割り込み関数の発生時に演算データを一時的に記憶する。スタックバックアップ領域３５，３６はサブ関数コールや割り込み関数の発生時に演算データと参照アドレスを一時的に記憶する。スタックバックアップ領域３５，３６が複数のバックアップ領域に相当する。
【００１６】
図３に示すようにスタック領域３４は後入れ先出し（Ｌａｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）の記憶領域である。ＣＰＵ１０はスタック領域３４に先ず演算データのうちの開始アドレスを記憶する。その後にＣＰＵ１０は途中データ１〜ｎをスタック領域３４に順次記憶する。これは演算データをスタック領域３４に一時的に退避させる際の記憶順番である。これとは逆にスタック領域３４から演算データを復帰させる場合、ＣＰＵ１０は途中データｎ〜１を順次読み出し、最後に開始アドレスを読み出す。なお図３ではスタック領域３４の未使用領域にハッチングを付与している。
【００１７】
図４に示すように第１スタックバックアップ領域３５は、スタック領域３４と同様にして後入れ先出しの記憶領域である。ＣＰＵ１０は第１スタックバックアップ領域３５に先ず演算データのうちの開始アドレスを記憶する。その後にＣＰＵ１０は途中データ１〜ｎを第１スタックバックアップ領域３５に順次記憶する。そしてＣＰＵ１０は最後に参照アドレスを第１スタックバックアップ領域３５に記憶する。これは演算データと参照アドレスを第１スタックバックアップ領域３５に一時的に退避させる際の記憶順番である。これとは逆に第１スタックバックアップ領域３５から演算データと参照アドレスを復帰させる場合、ＣＰＵ１０は先ず参照アドレスを読み出す。その後にＣＰＵ１０は第１スタックバックアップ領域３５から途中データｎ〜１を順次読み出し、最後に開始アドレスを読み出す。これらデータの退避と復帰に関しては第２スタックバックアップ領域３６においても同様である。
【００１８】
図４に示すように第１スタックバックアップ領域３５には、演算データと参照アドレスとを識別するための識別子も記憶される。演算データにはＤａｔａの識別子が付与される。参照アドレスにはＰｏｉｎｔｅｒの識別子が付与される。なお図４では第１スタックバックアップ領域３５の未使用領域にハッチングを付与している。この未使用領域の識別子にはＤｕｍｍｙが付与される。これら識別子の付与は第２スタックバックアップ領域３６においても同様である。
【００１９】
次に図５に基づいてＣＰＵ１０の演算処理動作を概説する。図５の始まりにおいてＣＰＵ１０は関数Ａの演算処理を実行している。この際にＣＰＵ１０は演算データをデータレジスタ１１とプログラムカウンタ１２に記憶する。またＣＰＵ１０は算出データをＲＡＭ３０のデータ領域３１，３２に記憶する。関数Ａの演算処理は、例えばエンジン制御にかかわるものである。
【００２０】
時間ｔ１に至ると関数Ｂの割り込みが発生する。関数Ｂの演算処理は、例えば所定周期で実施される自己診断などである。この場合にＣＰＵ１０はデータレジスタ１１とプログラムカウンタ１２に記憶された演算データを一時的にスタック領域３４に退避させる。この際にスタックポインタ１３のスタック領域３４を指すアドレスが順次変動する。そしてスタックポインタ１３の指すアドレスは、図３で言えば、最終的にデータｎの記憶されたアドレスを指す。このアドレスが参照アドレスとしてスタックポインタ１３に記憶される。ＣＰＵ１０はこの参照アドレスと演算データを一時的にスタックバックアップ領域３５，３６にバックアップする。
【００２１】
なおＣＰＵ１０が関数Ａの演算処理を実行している際にサブ関数をコールする場合がある。この場合においてもＣＰＵ１０は演算データを一時的にスタック領域３４に退避させる。この際に参照アドレスがスタックポインタ１３に記憶される。ＣＰＵ１０は参照アドレスと演算データを一時的にスタックバックアップ領域３５，３６にバックアップする。以下においては煩雑となることを避けるため、サブ関数コールと割り込み関数の発生のうち、割り込み関数の発生のみを記載する。
【００２２】
時間ｔ２に至って演算データと参照アドレスの退避とバックアップが終了するとＣＰＵ１０は関数Ｂの演算処理を実行し始める。
【００２３】
そして時間ｔ３に至って関数Ｂの演算処理が終了するとＣＰＵ１０はスタックポインタ１３に記憶された参照アドレスとバックアップ領域３５，３６に記憶された参照アドレスそれぞれとを比較する。これら３つの参照アドレスの全てが一致する場合、ＣＰＵ１０は参照アドレスと演算データは正常であると判定する。ＣＰＵ１０は正常カウンタを保有している。この場合にＣＰＵ１０は正常カウンタを１だけインクリメントする。またＣＰＵ１０は異常カウンタを保有している。ＣＰＵ１０は正常カウンタが所定値αに達するとこの異常カウンタを１だけディクリメントする。そしてＣＰＵ１０は正常カウンタをクリアする。本実施形態では上記の所定値αとして３を採用している。ただし所定値αの値としては３に限定されず、２以上の数であればよい。例えば所定値αとして４を採用することもできる。
【００２４】
これとは異なり３つの参照アドレスのうちの一部（２つ）が一致する場合、ＣＰＵ１０は参照アドレス若しくは演算データに異常が生じていると判定する。ＣＰＵ１０は異常カウンタを１だけインクリメントする。またＣＰＵ１０は正常カウンタをクリアする。そしてＣＰＵ１０は３つの参照アドレスのうち、一致する２つの参照アドレスにスタックポインタ１３に記憶された参照アドレスが含まれているか否かを判定する。一致する２つの参照アドレスにスタックポインタ１３に記憶された参照アドレスが含まれていない場合、ＣＰＵ１０は一致する参照アドレスでスタックポインタ１３の参照アドレスを補正する。すなわちＣＰＵ１０はスタックバックアップ領域３５，３６の参照アドレスでスタックポインタ１３の参照アドレスを補正する。
【００２５】
またスタックポインタ１３の参照アドレスを補正する場合、ＣＰＵ１０はスタック領域３４の演算データの補正も行う。スタック領域３４とスタックバックアップ領域３５，３６には同一種類の３つの演算データが記憶されている。それは図３および図４で言えば、例えば開始アドレスやデータｎである。ＣＰＵ１０はこれら同一種類の３つの演算データを比較する。ＣＰＵ１０は同一種類の３つの演算データのうち、一致する２つの演算データにスタック領域３４に記憶された演算データが含まれているか否かを判定する。一致する２つの演算データにスタック領域３４に記憶された演算データが含まれていない場合、ＣＰＵ１０は一致する演算データでスタック領域３４の演算データを補正する。すなわちＣＰＵ１０はスタックバックアップ領域３５，３６の演算データでスタック領域３４の演算データを補正する。
【００２６】
後で説明するようにこのような異常が連続して所定回数βだけ起こるとＣＰＵ１０はスタックポインタ１３若しくはスタック領域３４に異常が生じていると判定する。そしてＣＰＵ１０は保有している異常フラグをオンにする。またＣＰＵ１０はＭＩＬランプなどの警告を示す自動車に搭載のインジケータを点灯する。本実施形態では上記の所定回数βとして３を採用している。ただし所定回数βの値としては３に限定されず、２以上の数であればよい。例えば所定回数βとして５を採用することもできる。所定回数βは第１所定回数に相当する。
【００２７】
なおスタックポインタ１３とスタック領域３４それぞれの異常を独立して判定するためにＣＰＵ１０は、スタックポインタ１３に対応する所定回数β１とスタック領域３４に対応する所定回数β２を保有していてもよい。これら２つの所定回数β１，β２の値は互いに異なる。
【００２８】
３つの参照アドレスの全てが不一致の場合、ＣＰＵ１０は関数Ａへの復帰が適わないと判定する。また上記したようにスタック領域３４の演算データを補正するべく、同一種類の３つの演算データを比較した結果、３つの演算データの全てが一致しない場合においても、ＣＰＵ１０は関数Ａへの復帰が適わないと判定する。そこでＣＰＵ１０は電子制御装置１００のマイクロコンピュータ（マイコン）をリセット処理する。
【００２９】
時間ｔ４に至り、データ診断の結果、スタックポインタ１３の参照アドレスが正常の場合、若しくは、参照アドレスと演算データを補正することができた場合、ＣＰＵ１０は関数Ａを復帰させる。
【００３０】
そして時間ｔ５に至り関数Ａの復帰が終了するとＣＰＵ１０は関数Ａの演算処理を再開する。
【００３１】
次に、図６に基づいて上記した正常カウンタ、異常カウンタ、および、異常フラグを説明する。図６は上記のデータ診断を行った結果、正常カウンタ、異常カウンタ、および、異常フラグがどのように挙動するのかを例示している。
【００３２】
なお図６においてはカウンタや異常フラグの説明を簡明とするため、データ診断の結果は、３つの参照アドレスが全て一致する場合、および、３つの参照アドレスのうちの２つが一致する場合のみを示している。また以下においてはデータ診断の結果の表記を簡明とするため、３つの参照アドレスが全て一致する場合を正常、３つの参照アドレスのうちの２つが一致する場合を異常と示す。３つの参照アドレスの全てが不一致の場合、ＣＰＵ１０は異常カウンタ、正常カウンタ、および、異常フラグをクリアする。
【００３３】
図６の始まりにおいてＣＰＵ１０は演算処理を実行しており、割り込み関数の発生は起きていない。しかしながら時間ｔ１に至ると割り込み関数が発生する。この際にＣＰＵ１０はデータの退避とバックアップを実行する。そしてＣＰＵ１０は割り込み関数の演算処理を実行した後に退避したデータの診断を行う。この際のデータ診断の結果が異常となると、図６に示すようにＣＰＵ１０は異常カウンタを１だけインクリメントする。
【００３４】
その後時間ｔ２に至って再度割り込みが発生するとＣＰＵ１０はデータ診断する。そのデータ診断の結果が正常となると、図６に示すようにＣＰＵ１０は正常カウンタを１だけインクリメントする。その後に再度データ診断を繰り返した結果、時間ｔ３に至って正常判定が連続して所定値α（３）に達するとＣＰＵ１０は異常カウンタを１だけディクリメントし、そのカウント値を０にする。またＣＰＵ１０は正常カウンタを０にクリアする。
【００３５】
時間ｔ４に至って再度割り込みが発生し、データ診断を繰り返した結果、正常判定が連続するとやがて正常カウンタのカウント値は上限値４に達する。この後にデータ診断の結果が正常となっても正常カウンタのカウント値は上限値４に固定される。なおもちろんではあるが正常カウンタの上限値は４でなくともよい。上限値は所定値α以上の自然数であればよい。
【００３６】
時間ｔ５に至って再度割り込みが発生し、データ診断の結果が異常の場合、ＣＰＵ１０は異常カウンタを１だけインクリメントする。またＣＰＵ１０は正常カウンタを０にクリアする。その後に再度データ診断を繰り返した結果、時間ｔ６に至って異常判定が連続して所定回数β（３）に達するとＣＰＵ１０は異常フラグをオフからオンにする。そしてＣＰＵ１０はインジケータを点灯する。
【００３７】
また時間ｔ７に至って再度割り込みが発生し、データ診断を行った結果、異常判定となると異常カウンタのカウント値が上限値４に達する。この後にデータ診断の結果が異常となっても異常カウンタのカウント値は上限値４に固定される。なおもちろんではあるが異常カウンタの上限値は４でなくともよい。上限値は所定回数β以上の自然数であればよい。
【００３８】
その後時間ｔ８に至って割り込みが発生したためにデータ診断をした結果が正常になると、ＣＰＵ１０は正常カウンタを１だけインクリメントする。その後に再度データ診断を繰り返した結果正常判定が連続し、時間ｔ９に至って正常カウンタが３に達すると、ＣＰＵ１０は異常カウンタを１だけディクリメントし、そのカウント値を３にする。またＣＰＵ１０は正常カウンタを０にクリアする。
【００３９】
以下同様にして、再度データ診断を繰り返した結果正常判定が連続し、時間ｔ１０に至って正常カウンタが３に達すると、ＣＰＵ１０は異常カウンタを１だけディクリメントし、そのカウント値を２にする。またＣＰＵ１０は正常カウンタを０にクリアする。
【００４０】
時間ｔ１１に至って正常カウンタが３に達すると、ＣＰＵ１０は異常カウンタを１だけディクリメントし、そのカウント値を１にする。またＣＰＵ１０は正常カウンタを０にクリアする。
【００４１】
時間ｔ１２に至って正常カウンタが３に達すると、ＣＰＵ１０は異常カウンタを１だけディクリメントし、そのカウント値を０にする。またＣＰＵ１０は正常カウンタを０にクリアする。そしてＣＰＵ１０は異常フラグをオンからオフにし、インジケータを消灯する。
【００４２】
次に図７に基づいて、ＣＰＵ１０がサブ関数コール若しくは割り込み発生時に行う処理を説明する。以下においてはＣＰＵ１０が関数Ａの演算処理を実行している際に関数Ｂの割り込みが発生した場合のＣＰＵ１０の処理動作を説明する。
【００４３】
先ずステップＳ１０においてＣＰＵ１０は関数Ａの演算データをスタック領域３４に退避させる。この際にスタックポインタ１３に参照アドレスが記憶される。その後にＣＰＵ１０はステップＳ２０へと進む。
【００４４】
ステップＳ２０へ進むとＣＰＵ１０は演算データと参照アドレスをスタックバックアップ領域３５，３６にバックアップする。その後にＣＰＵ１０はステップＳ３０へと進む。
【００４５】
ステップＳ３０へ進むとＣＰＵ１０は関数Ｂの演算処理を実行する。その後にＣＰＵ１０はステップＳ４０へと進む。
【００４６】
ステップＳ４０へ進むとＣＰＵ１０は関数Ｂの演算処理が終了したか否かを判定する。関数Ｂの演算処理が終了した場合にＣＰＵ１０はステップＳ５０へと進む。これとは異なり関数Ｂの演算処理が終了していない場合にＣＰＵ１０は再度ステップＳ４０へと戻る。このようにＣＰＵ１０は関数Ｂの演算処理が終了するまでステップＳ４０を繰り返す。
【００４７】
なお関数Ｂの演算処理を実行している最中に他の例えば関数Ｃなどの割り込みが発生する場合がある。この場合にＣＰＵ１０はステップＳ１０〜Ｓ３０を実行して関数Ｂの演算データと参照アドレスの退避とバックアップを実行する。そしてＣＰＵ１０は関数Ｃの演算処理を実行する。
【００４８】
ステップＳ５０へ進むとＣＰＵ１０はデータ診断を実施する。そのデータ診断の結果、関数Ａのデータ復帰が可能か否かをＣＰＵ１０は判断する。関数Ａのデータ復帰が可能の場合にＣＰＵ１０はステップＳ６０へと進む。これとは異なり関数Ａのデータ復帰が不可能の場合にＣＰＵ１０は関数Ａの演算処理を終了する。詳しく言えば、後で図８に基づいて説明するようにＣＰＵ１０は電子制御装置１００のマイコンをリセット処理する。
【００４９】
ステップＳ６０へ進むとＣＰＵ１０はスタック領域３４に退避している演算データをスタックポインタ１３に記憶している参照アドレスに基づいて復帰させる。その後にＣＰＵ１０はステップＳ７０へと進む。
【００５０】
ステップＳ７０へ進むとＣＰＵ１０は関数Ａの演算処理を再び実行し始める。そしてＣＰＵ１０はサブ関数コール若しくは割り込み発生時の処理を終了する。
【００５１】
次に図８に基づいて図７に示すステップＳ５０のデータ診断を詳説する。
【００５２】
先ずステップＳ１１０においてＣＰＵ１０は退避データと複数のバックアップデータそれぞれを比較する。すなわちＣＰＵ１０はスタックポインタ１３に退避された参照アドレスとスタックバックアップ領域３５，３６にバックアップした参照アドレスとを比較する。この後にＣＰＵ１０はステップＳ１２０へと進む。
【００５３】
ステップＳ１２０へ進むとＣＰＵ１０は退避データと複数のバックアップデータが全て一致するか否かを判定する。すなわちＣＰＵ１０は３つの参照アドレスが全て一致するか否かを判定する。３つの参照アドレスが全て一致する場合、ＣＰＵ１０は参照アドレスと演算データは正常であると判定して、ステップＳ１３０へと進む。これとは異なり３つの参照アドレスの全てが一致しない場合、ＣＰＵ１０は参照アドレスと演算データは異常であると判定して、ステップＳ１４０へと進む。
【００５４】
ステップＳ１３０へ進むとＣＰＵ１０は正常カウンタを１だけインクリメントする。この後にＣＰＵ１０はステップＳ１５０へと進む。なお正常カウンタが上限値に達している場合、正常カウンタのカウント値は上限値に保たれる。
【００５５】
ステップＳ１５０へ進むとＣＰＵ１０は正常カウンタのカウント値が所定値αであるか否かを判定する。正常カウンタのカウント値が所定値αである場合、ＣＰＵ１０はステップＳ１６０へと進む。これとは異なり正常カウンタのカウント値が所定値αでない場合、ＣＰＵ１０はステップＳ６０へと進む。
【００５６】
ステップＳ１６０へ進むとＣＰＵ１０は異常カウンタのカウント値は０であるか否かを判定する。異常カウンタのカウント値が０である場合、ＣＰＵ１０はステップＳ６０へと進む。これとは異なり異常カウンタのカウント値が０でない場合、ＣＰＵ１０はステップＳ１７０へと進む。
【００５７】
ステップＳ６０へ進むとＣＰＵ１０は、上記したように関数Ａを復帰する。そしてＣＰＵ１０はステップＳ７０へ進んで関数Ａの演算処理を再び実行する。
【００５８】
ステップＳ１７０へ進むとＣＰＵ１０は異常カウンタを１だけディクリメントする。この後にＣＰＵ１０はステップＳ１８０へと進む。
【００５９】
ステップＳ１８０へ進むとＣＰＵ１０は正常カウンタをαから０にクリアする。この後にＣＰＵ１０はステップＳ１９０へと進む。
【００６０】
ステップＳ１９０へ進むとＣＰＵ１０は異常カウンタのカウント値は０であるか否かを判定する。異常カウンタのカウント値が０である場合、ＣＰＵ１０はステップＳ２００へと進む。これとは異なり異常カウンタのカウント値が０でない場合、ＣＰＵ１０はステップＳ６０へと進む。
【００６１】
ステップＳ２００へ進むとＣＰＵ１０は異常フラグがオンであるか否かを判定する。異常フラグがオンである場合、ＣＰＵ１０はステップＳ２１０へと進む。これとは異なり異常フラグがオフである場合、ＣＰＵ１０はステップＳ６０へと進む。
【００６２】
ステップＳ２１０へ進むとＣＰＵ１０は異常フラグをオンからオフにする。そしてＣＰＵ１０はインジケータを消灯する。この後にＣＰＵ１０はステップＳ６０へと進む。
【００６３】
フローを遡りステップＳ１２０において３つの参照アドレスが全て一致しないと判定してステップＳ１４０へ進むとＣＰＵ１０は、３つの参照アドレスのうちの一部（２つ）が一致するか否かを判定する。３つの参照アドレスのうちの一部が一致する場合、ＣＰＵ１０はステップＳ２２０へと進む。これとは異なり３つの参照アドレスの全てが不一致の場合、ＣＰＵ１０はステップＳ２３０へと進む。
【００６４】
ステップＳ２２０へ進むとＣＰＵ１０は異常カウンタを１だけインクリメントする。この後にＣＰＵ１０はステップＳ２４０へと進む。なお異常カウンタが上限値に達している場合、異常カウンタのカウント値は上限値に保たれる。
【００６５】
ステップＳ２４０へ進むとＣＰＵ１０は正常カウンタを０にクリアする。この後にＣＰＵ１０はステップＳ２５０へと進む。
【００６６】
ステップＳ２５０へ進むとＣＰＵ１０は異常カウンタのカウント値が所定回数β以上であるか否かを判定する。異常カウンタのカウント値が所定回数β以上である場合、ＣＰＵ１０はステップＳ２６０へと進む。これとは異なり異常カウンタのカウント値が所定回数β未満の場合、ＣＰＵ１０はステップＳ２７０へと進む。
【００６７】
ステップＳ２６０へ進むとＣＰＵ１０は異常フラグをオンにする。そしてＣＰＵ１０はインジケータを点灯する。この後にＣＰＵ１０はステップＳ２８０へと進む。
【００６８】
ステップＳ２７０へ進むとＣＰＵ１０は異常フラグをオフにする。そしてＣＰＵ１０はインジケータを消灯する。この後にＣＰＵ１０はステップＳ２８０へと進む。
【００６９】
ステップＳ２８０へ進むとＣＰＵ１０はステップＳ１４０において一致すると判定した参照アドレスにスタックポインタ１３に記憶された参照アドレスが含まれているか否かを判定する。一致すると判定した参照アドレスにスタックポインタ１３の参照アドレスが含まれている場合、ＣＰＵ１０はデータの補正を実行せずにステップＳ６０へと進む。これとは異なり一致すると判定した参照アドレスにスタックポインタ１３の参照アドレスが含まれていない場合、ＣＰＵ１０は一致する参照アドレスでスタックポインタ１３の参照アドレスを補正する。すなわちＣＰＵ１０はスタックバックアップ領域３５，３６の参照アドレスでスタックポインタ１３の参照アドレスを補正する。またＣＰＵ１０は、スタック領域３４の演算データをスタックバックアップ領域３５，３６の演算データに基づいて補正する。ただし３つの演算データの全てが不一致のためにデータの補正が適わない場合、図８に示すフローチャートでは明示していないが、ＣＰＵ１０は電子制御装置１００のマイコンをリセット処理する。
【００７０】
フローを遡りステップＳ１４０において３つの参照アドレスの全てが不一致と判定してステップＳ２３０へ進むとＣＰＵ１０は、電子制御装置１００のマイコンをリセット処理する。
【００７１】
次に、本実施形態に係る電子制御装置１００の作用効果を説明する。上記したようにＣＰＵ１０はスタックポインタ１３に記憶された参照アドレス、および、スタックバックアップ領域３５，３６それぞれに記憶された参照アドレスそれぞれを比較することで、スタックポインタ１３に記憶された参照アドレスの異常判定を行う。これによればスタックポインタ１３に記憶された参照アドレスにノイズなどによって異常が生じた場合においても、その異常を判定することができる。
【００７２】
ＣＰＵ１０はスタックバックアップ領域３５，３６の参照アドレスが一致するが、スタックポインタ１３の参照アドレスがそれとは異なると判定すると、スタックポインタ１３の参照アドレスをスタックバックアップ領域３５，３６の参照アドレスで補正する。これによればスタックポインタ１３に記憶された参照アドレスに異常が生じたとしても、その異常を補正することができる。
【００７３】
参照アドレスの異常判定が連続して所定回数βだけ起こるとＣＰＵ１０はスタックポインタ１３若しくはスタック領域３４に異常が生じていると判定する。これによればスタックポインタに記憶された参照アドレスが１度だけ異常と判定されると即座にスタックポインタ若しくはスタック領域が異常であると判定する構成と比べて、スタックポインタ１３とスタック領域３４の異常判定のロバスト性が向上される。
【００７４】
スタックポインタ１３の参照アドレスを補正する場合、ＣＰＵ１０はスタック領域３４の演算データの補正をスタックバックアップ領域３５，３６の演算データに基づいて行う。
【００７５】
これによればスタック領域３４に記憶された演算データに異常が生じたとしても、その異常を補正することができる。
【００７６】
スタックバックアップ領域３５，３６はスタック領域３４と同様にして後入れ先出しで記憶される構成となっている。そしてスタックバックアップ領域３５，３６には、演算データと参照アドレスとを区別するための識別子も記憶される。
【００７７】
これによれば識別子がスタックバックアップ領域に記憶されない構成とは異なり、識別子を参照することで、参照アドレスや演算データをスタックバックアップ領域３５，３６から容易に読み出すことができる。また種類の異なる関数の演算データがスタックバックアップ領域３５，３６に記憶されたとしても、スタックバックアップ領域３５，３６における各演算データの記憶領域が参照アドレスによって区画される。
【００７８】
以上、本発明の好ましい実施形態について説明したが、本発明は上記した実施形態になんら制限されることなく、本発明の主旨を逸脱しない範囲において、種々変形して実施することが可能である。
【００７９】
（第１の変形例）
本実施形態ではＣＰＵ１０は図８に示すステップＳ１１０においてスタックポインタ１３の参照アドレスとスタックバックアップ領域３５，３６の参照アドレスとを比較する例を示した。しかしながらＣＰＵ１０はステップＳ１１０においてスタック領域３４の演算データとスタックバックアップ領域３５，３６の演算データも比較してもよい。
【００８０】
なおこの変形例の場合、ＣＰＵ１０は異常カウンタとして、参照アドレスに対応する第１カウンタと演算データに対応する第２カウンタとを有してもよい。第１カウンタのカウント値はスタックポインタ１３の参照アドレスに異常が生じていると判定した場合にインクリメントされる。第２カウンタのカウント値はスタック領域３４の演算データに異常が生じていると判定した場合にインクリメントされる。そしてＣＰＵ１０は第１カウンタのカウント値が所定回数βに達するとスタックポインタ１３に異常が生じていると判定する。またＣＰＵ１０は第２カウンタのカウント値が所定回数γに達するとスタック領域３４に異常が生じていると判定する。これによればスタックポインタ１３に異常が生じているのか、それともスタック領域３４に異常が生じているのかを独立して判定することができる。すなわちＣＰＵ１０のレジスタに異常が生じているのか、それともＲＡＭ３０に異常が生じているのかを独立して判定することができる。所定回数γは２以上の自然数であり、第２所定回数に相当する。
【００８１】
（第２の変形例）
第１の変形例では図８に示すステップＳ１１０において参照アドレスと演算データそれぞれの比較判定を行う例を示した。この際、参照アドレスだけの比較を行うのか、それとも参照アドレスだけではなく演算データの比較も行うのかは、自動車の運転状況とＣＰＵ１０の処理負荷によって定まる演算処理状況、および、退避した関数Ａの重要度の少なくとも一方によって決定してもよい。具体的に言えば、例えば自動車が高速走行しているために演算処理状況が厳しい場合、退避した関数Ａの重要度によらずに、ＣＰＵ１０は参照アドレスだけの比較を行ってもよい。また自動車が低速走行しているために演算処理状況が優しい場合、退避した関数Ａの重要度によって、ＣＰＵ１０は参照アドレスだけの比較を行うのか、それとも参照アドレスと演算データそれぞれの比較を行うのかを決定してもよい。さらに例示すれば、ＣＰＵ１０は演算処理状況に応じずに関数Ａの重要度のみによって参照アドレスだけの比較を行うのか、それとも参照アドレスと演算データそれぞれの比較を行うのかを決定してもよい。このような比較判定の対象の選択をＣＰＵ１０は図８に示すステップＳ１１０の前に実施する。
【００８２】
これによればＣＰＵが演算処理状況および演算データの重要度にかかわらずに参照アドレスと演算データの異常判定それぞれを実施する構成と比べて、ＣＰＵ１０の演算データの実行処理が遅れることが抑制される。またＣＰＵ１０の処理負荷の増大が抑制される。
【００８３】
（第３の変形例）
本実施形態ではスタックバックアップ領域３５，３６に演算データと参照アドレスが記憶された例を示した。しかしながらスタックバックアップ領域３５，３６に参照アドレスだけが記憶された構成を採用することもできる。この変形例の場合、ＣＰＵ１０はスタックポインタ１３の参照アドレスがスタックバックアップ領域３５，３６の参照アドレスと異なるとマイコンをリセット処理する。
【００８４】
（その他の変形例）
本実施形態では電子制御装置１００がエンジンＥＣＵである例を示した。しかしながら電子制御装置１００としては上記例に限定されず、例えばバッテリＥＣＵやトランスミッションＥＣＵを採用することもできる。
【００８５】
本実施形態では図２に示すようにＲＡＭ３０がデータ領域３１，３２、バックアップ領域３３、スタック領域３４、および、スタックバックアップ領域３５，３６を有する例を示した。しかしながらこれらデータ領域、バックアップ領域、スタック領域、および、スタックバックアップ領域それぞれの数は上記例に限定されない。スタックバックアップ領域の数が複数であればよい。
【００８６】
本実施形態では図３に示すようにスタック領域３４に関数Ａの演算データのみが記憶された例を示した。しかしながら、当然ではあるがスタック領域３４は複数の演算データを記憶することができる。例えば関数Ｐと関数Ｑとが連続して割り込み、その前にスタック領域３４にデータが記憶されているとすると、スタック領域３４の記憶状況は図９に示すようになる。すなわち関数Ｐの演算データがスタック領域３４に記憶された後、関数Ｑの演算データがスタック領域３４に記憶される。
【００８７】
また本実施形態では図４に示すように第１スタックバックアップ領域３５に関数Ａの演算データと参照アドレスのみが記憶された例を示した。しかしながら、当然ではあるが第１スタックバックアップ領域３５は複数の演算データと参照アドレスを記憶することができる。例えば関数Ｐと関数Ｑとが連続して割り込み、その前に第１スタックバックアップ領域３５にデータが記憶されているとすると、第１スタックバックアップ領域３５の記憶状況は図１０に示すようになる。すなわち関数Ｐの演算データと参照アドレスが第１スタックバックアップ領域３５に記憶された後、関数Ｑの演算データと参照アドレスが第１スタックバックアップ領域３５に記憶される。第２スタックバックアップ領域３６においても第１スタックバックアップ領域３５と同様にして複数の関数の演算データと参照アドレスとを記憶することができる。
【００８８】
本実施形態では主としてＣＰＵ１０が関数Ａの演算処理を実行している際に関数Ｂの割り込みが入った例を示した。しかしながら関数Ｂの演算処理を実行している際に、さらに関数Ｃの割り込みが発生することも起こり得る。その場合、ＣＰＵ１０は例えば図１１に示す処理を実施する。すなわちＣＰＵ１０は関数Ａの演算処理を実行している際に時間ｔ１において関数Ｂの割り込みが発生すると、関数Ａの退避とバックアップを実行する。その後の時間ｔ２においてＣＰＵ１０は関数Ｂの演算処理を実行し始める。しかしながらこの関数Ｂの演算処理を実行している際に時間ｔ３において関数Ｃの割り込みが発生すると、ＣＰＵ１０は関数Ｂの退避とバックアップを実行する。その後の時間ｔ４〜ｔ５にかけてＣＰＵ１０は関数Ｃの演算処理を実行して終了すると、関数Ｂのデータ診断を行う。そして時間ｔ６に至るとＣＰＵ１０は関数Ｂのデータの復帰を実施し、時間ｔ７において関数Ｂの演算処理を再度実行する。時間ｔ８において関数Ｂの演算処理が終了すると、ＣＰＵ１０は関数Ａのデータ診断を行う。そして時間ｔ９に至るとＣＰＵ１０は関数Ａのデータの復帰を実施し、時間ｔ１０において関数Ａの演算処理を再度実行する。
【符号の説明】
【００８９】
１０…ＣＰＵ
１１…データレジスタ
１２…プログラムカウンタ
１３…スタックポインタ
２０…ＲＯＭ
３０…ＲＡＭ
３４…スタック領域
３５…第１スタックバックアップ領域
３６…第２スタックバックアップ領域
１００…電子制御装置
【図１】
2017123119.tif 000003
【図２】
2017123119.tif 000004
【図３】
2017123119.tif 000005
【図４】
2017123119.tif 000006
【図５】
2017123119.tif 000007
【図６】
2017123119.tif 000008
【図７】
2017123119.tif 000009
【図８】
2017123119.tif 000010
【図９】
2017123119.tif 000011
【図１０】
2017123119.tif 000012
【図１１】
2017123119.tif 000013