(57)【要約】【課題】マルチコアマイコンにおいて、異常の生じたコアをソフト的な負荷増大を抑制して判別可能なコア監視装置を提供すること。【解決手段】複数のコアから共通の周期で通知を受け付けるコア監視装置１７であって、  コアから通知を受け付けた際、各コアに固有のコア識別数値（例えば、カウンタ値×ＩＤ）をコア毎に生成するコア識別数値生成手段３１と、複数のコアのコア識別数値を合計した合計値を算出する合計値算出手段３２と、最後に算出された合計値を記憶する合計値記憶手段３６と、合計値算出手段が算出した合計値と、合計値記憶手段に記憶された合計値との差である第一の差を算出する第一の差算出手段３３と、第一の差を記憶する第一の差記憶手段３７と、第一の差算出手段が算出した第一の差と第一の差記憶手段に記憶された第一の差との差である第二の差を算出する第二の差算出手段３４と、を有する。【選択図】図１
2013084218.tif 000002
【特許請求の範囲】
【請求項１】
複数のコアから共通の周期で通知を受け付けるコア監視装置であって、
コアから通知を受け付けた際、各コアに固有のコア識別数値をコア毎に生成するコア識別数値生成手段と、
複数のコアの前記コア識別数値を合計した合計値を算出する合計値算出手段と、
最後に算出された合計値を記憶する合計値記憶手段と、
前記合計値算出手段が算出した合計値と、前記合計値記憶手段に記憶された合計値との差である第一の差を算出する第一の差算出手段と、
最後に算出された第一の差を記憶する第一の差記憶手段と、
前記第一の差算出手段が算出した第一の差と、前記第一の差記憶手段に記憶された第一の差との差である第二の差を算出する第二の差算出手段と、
を有するコア監視装置。
【請求項２】
前記コア識別数値生成手段は、コア識別情報と共に、コアが周期的にカウントアップしたカウンタ値を取得し、コア識別情報及びカウンタ値を用いて前記コア識別数値を生成する、ことを特徴とする請求項１記載のコア監視装置。
【請求項３】
前記コア識別数値生成手段は、各コアが周期的にカウントアップしたカウンタ値とコア識別情報を用いて生成した前記コア識別数値を取得する、ことを特徴とする請求項１記載のコア監視装置。
【請求項４】
前記コア識別数値生成手段は、コア毎に周期的に通知されるコア識別情報の通知回数をコア毎にカウントするカウント回路を有し、
カウント回路のカウンタ値とコア識別情報からコア毎の前記コア識別数値を生成する、
ことを特徴とする請求項１記載のコア監視装置。
【請求項５】
前記コア識別数値は、カウンタ値とコア識別情報を乗算することで得られた乗算値である、ことを特徴とする請求項２〜４いずれか１記載のコア監視装置。
【請求項６】
前記コア識別数値生成手段は、コア識別情報の周期的な通知回数を、コア毎に異なる増大分に変換してカウントするカウント回路であり、該カウント回路のカウンタ値を各コアの前記コア識別数値とする、ことを特徴とする請求項１記載のコア監視装置。
【請求項７】
前記第二の差がゼロか否かを判定し、ゼロでない場合に、前記第二の差を公開する第二の差公開手段を有する、ことを特徴とする請求項１〜６いずれか１項記載のコア監視装置。
【請求項８】
請求項１〜７いずれか１項記載のコア監視装置と、
複数のコアを有するプロセッサと、
コアが実行するプログラムの記憶手段と、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のコアの動作状態を監視するコア監視装置に関する。
【背景技術】
【０００２】
燃費向上や運転者の負担軽減、安全性の向上などをもたらすため、車両にはマイコンを応用した多くの電子制御装置が搭載されている。マイコンが故障するとこれらの制御が損なわれるため、マイコンの動作状態を監視してマイコンの動作を保証する対策が講じられている。このような対策としては、例えば、タスクが正常に実行されていることを定期的なタイマリセットで確認するウォッチドッグタイマが知られている。
【０００３】
ところで、マイコンに、コアが複数個含まれるマルチコア型のプロセッサが搭載されるようになってきた（以下、マルチコアマイコンという）。マルチコアマイコンにおいて各コアの動作状態を監視する手法として、各コア毎にウォッチドッグタイマを用意することが考えられる。しかし、各コア用のウォッチドッグタイマを配置するとウォッチドッグタイマの数や配線が増大しコストアップとなってしまう。
【０００４】
そこで、複数のコアを１つのウォッチドッグタイマにより監視する技術が提案されている（例えば、特許文献１参照。）。特許文献１には、各々のコアがＲＡＭ内に確保された各コア毎の更新領域を、一定周期毎に各々の更新履歴が判るように更新し、少なくとも一つのコアがＲＡＭの更新履歴を判定し、監視部への出力処理を行う電子制御装置が開示されている。この電子制御装置では、複数のコアの１つでもＲＡＭを正常に更新しないと、更新領域に基づきコアが特定されるので、１つのウォッチドッグタイマで異常のあるコアのみをリセットすることができる。
【０００５】
また、ウォッチドッグタイマ以外にも、コア同士で互いに監視する技術も提案されている（例えば、特許文献２参照。）。特許文献２には、被監視ＣＰＵに対して監視部が例題を出題し、例題に対する回答に基づいてＣＰＵの演算機能を監視する監視方法が開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１０−０３３４７５号公報
【特許文献２】特開２０１０−１２８６２７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、特許文献１に開示された電子制御装置では、ＲＡＭの更新領域の監視と異常のあるコアの特定をソフト的に行う必要があるため、ソフト的な負荷が増大するという問題がある。すなわち、従来から、ウォッチドッグタイマをリセットする処理はソフト的に行われているが、ウォッチドッグタイマを１つにするとソフト的な負荷が余分に生じてしまう。
【０００８】
また、特許文献２のように、あるコアが他のコアを監視する場合、被監視コア間ではどのコアに異常が生じたかを検知できないという問題がある。例えば、３つのコアを含むマルチコアにおいて、コア１とコア２が互いに監視し、コア１とコア３が互いに監視している場合を想定する。コア１がコア２の異常を検出した場合、コア３がコア２の異常を検知するためにはコア１がコア３にコア２の異常を通知しなければならない。このため、コア同士が異常のあるコアを検知するためにソフト的な負荷が発生してしまう。
【０００９】
本発明は上記課題に鑑み、マルチコアマイコンにおいて、異常の生じたコアをソフト的な負荷増大を抑制して判別可能なコア監視装置を提供することを目的とする。
【課題を解決するための手段】
【００１０】
本発明は、複数のコアから共通の周期で通知を受け付けるコア監視装置であって、コアから通知を受け付けた際、各コアに固有のコア識別数値をコア毎に生成するコア識別数値生成手段と、複数のコアの前記コア識別数値を合計した合計値を算出する合計値算出手段と、最後に算出された合計値を記憶する合計値記憶手段と、前記合計値算出手段が算出した合計値と、前記合計値記憶手段に記憶された合計値との差である第一の差を算出する第一の差算出手段と、最後に算出された第一の差を記憶する第一の差記憶手段と、前記第一の差算出手段が算出した第一の差と、前記第一の差記憶手段に記憶された第一の差との差である第二の差を算出する第二の差算出手段と、を有する。
【発明の効果】
【００１１】
マルチコアマイコンにおいて、異常の生じたコアをソフト的な負荷増大を抑制して判別可能なコア監視装置を提供できる。
【図面の簡単な説明】
【００１２】
【図１】マイコンの概略的な特徴を説明する図の一例である。
【図２】車両に搭載されるマイコンのハードウェア構成図の一例である。
【図３】コア１〜ｎのタスクとカウンタ履歴部の関係を模式的に説明する図の一例である。
【図４】カウンタ履歴部の構成例の一例を示す図である。
【図５】カウンタ履歴部の構成例の一例を示す図である。
【図６】カウンタ値、積算値、合計値、第１差、第２差の遷移の一例を説明する図である。
【図７】コアが４つの場合のカウンタ値、積算値、合計値、第１差、第２差の遷移の一例を説明する図である。
【図８】ＩＤが不連続の場合の、カウンタ値、積算値、合計値、第１差、第２差の遷移の一例を説明する図である。
【図９】複数のコアが同時に暴走した場合の、カウンタ値、積算値、合計値、第１差、第２差の遷移の一例を説明する図である。
【図１０】カウンタ履歴部の構成例の一例を示す図である。
【図１１】カウンタ履歴部の構成例の一例を示す図である。
【発明を実施するための形態】
【００１３】
以下、本発明を実施するための形態について図面を参照しながら説明する。
【実施例１】
【００１４】
図１は、本実施形態のマイコンの概略的な特徴を説明する図の一例である。まず、前提として、複数のコアを有するマルチコアマイコンでは、ＯＳ（Operating  System）やコア同士が他のコアを識別するために、各コアにそれぞれ一意のＩＤが割り当てられている。
(i)  ３つのコア１〜３はそれぞれソフト的に実装されているカウンタを有し、同じ周期でそれぞれが独立にカウントアップしている。カウントされた値をカウンタ値という。
(ii)  コア１〜３は「カウンタ値×ＩＤ」を計算する。ＩＤが異なるので、カウンタ値が同じでも計算結果はコア毎に異なる。
(iii)  ウォッチドッグタイマを代替する回路（後述するカウンタ履歴部）は以下の計算を行う。
・コア１〜３から通知された計算結果の合計値を算出する。
・前回と今回の合計値の差である第１差を算出する。
・前回と今回の第１差の差である第２差を算出する。
【００１５】
図１（ａ）に示すように、１つもコアが暴走していない場合、第１差には常に“６”が、第２差には常に“０”が得られる。
(iv)  例えば、コア２が暴走した場合、コア２は「カウンタ値×ＩＤ」を更新できないので、上記回路におけるコア２の計算結果は“４”のままとなる。
(v)  したがって、コア２の暴走により合計値は正常時の合計値よりも小さくなる。第１差も、コア２が「カウンタ値×ＩＤ」を更新しない分、小さくなる。ここで、第１差の減少分はコア２のＩＤに等しくなる。このため、図１（ｂ）に示すように、第２差に暴走したコアのＩＤが得られることになる。
【００１６】
このように、暴走したコアは「カウンタ値×ＩＤ」を更新しないので合計値が小さくなり、第１差の減少分である第２差に暴走したコア２のコアＩＤが現れる。この第２差を各コアが参照すれば、各コアは暴走したコアを検知することができる。
【００１７】
〔構成例〕
図２は、車両に搭載されるマイコンのハードウェア構成図の一例である。マイコン１００は、ＥＣＵ（Electronic  Control  Unit）に搭載されることが想定されているがその用途は車両に限定されない。車載されるＥＣＵには、その主要な機能により、エンジンＥＣＵ、ブレーキＥＣＵ、ボディＥＣＵ、ナビゲーションＥＣＵ（ＡＶ・情報処理ＥＣＵ）、ゲートウェイＥＣＵ等の種類がある。本実施例のマイコン１００はＥＣＵの機能の違いに影響されず搭載されることが可能である。また、複数の機能が１つに統合されたＥＣＵにマイコン１００を搭載してもよい。
【００１８】
マイコン１００は、メインバス２１に接続されたプロセッサ１１、ＲＯＭ１２、ＩＮＴＣ１３、ＲＡＭ１４、ＤＭＡＣ１５、並びに、Ｉ／Ｏブリッジ１６を有し、Ｉ／Ｏブリッジ１６には周辺バス２２を介してカウンタ履歴部１７、ＡＤＣ（Analog  to  Digital  Converter）１８及びＣＡＮコントローラ１９が接続されている。
【００１９】
プロセッサ１１は少なくとも２つ以上のコア１〜ｎを有すると共に、各コア１〜ｎは一般的な演算機能（例えば、ＡＬＵ等の演算装置、命令バッファ、命令デコーダ、レジスタセット等）を有している。
【００２０】
ＲＯＭ１２はフラッシュメモリなどの不揮発メモリであり、プロセッサ１１が実行するプログラム３０や初期値、パラメータ等を記憶している。
【００２１】
ＩＮＴＣ１３はＩＲＱやその他の割り込み端子を介して周辺機器から入力された割り込み要求を、周辺機器の優先順位に基づき調停してプロセッサ１１に通知する。これによりプロセッサ１１は、割り込みした周辺機器に応じて決まったアドレスの命令をＲＯＭ１２から読み出して処理を実行する。
【００２２】
ＲＡＭ１４は、プロセッサ１１がプログラム３０を実行するための作業領域である。プロセッサ１１はＲＯＭ１２からプログラム３０を読み込み、また、必要であればデータバスを介してＲＡＭ１４からデータを読み出しプログラム３０を実行する。ＤＭＡＣ１５は、プロセッサ１１からの指示によりＲＡＭ１４からＩ／Ｏブリッジ１６を介して周辺機器にデータを送信する。また、周辺機器から割り込みされたプロセッサ１１から指示を受けて、Ｉ／Ｏブリッジ１６を介して周辺機器からデータを受け取り、ＲＡＭ１４に書き込む。
【００２３】
Ｉ／Ｏブリッジ１６は、マルチプレクサやブリッジ回路などであり、チャネル毎に、カウンタ履歴部１７、ＡＤＣ１８、及び、ＣＡＮコントローラ１９とそれぞれ接続されており、これらの周辺機器とデータを送受信する。カウンタ履歴部１７は、コア１〜ｎの「カウンタ値×ＩＤ」（又はカウンタ値）を取得して、合計値、第１差、及び、第２差を算出する。詳しくは後述する。
【００２４】
ＡＤＣ１８は、各種のセンサが検出したアナログ信号をデジタル信号に変換する。ＡＤＣ１８は変換の終了を、ＩＮＴＣ１３を介してプロセッサ１１に通知する。ＣＡＮコントローラ１９は、車載ネットワークを介して接続された他のＥＣＵと通信するための通信装置である。ＣＡＮコントローラ１９は、プロセッサ１１から通信データの送信要求を受け付けるとフレームの各フィールドにＣＡＮ  ＩＤやデータを格納しＣＡＮバスに出力する。また、ＣＡＮコントローラ１９は、受信すべきＣＡＮ  ＩＤの通信データを検出するとそれを取り込みＩＮＴＣ１３を介してプロセッサ１１に割り込んで通知する。
【００２５】
なお、ウォッチドッグタイマとしては同じマイコン内にカウンタ履歴部１７が搭載されていればよい。しかし、他のマイコン、又は、ＣＡＮ（Controller  Area  Network）などの車載ＬＡＮを介して接続された他のＥＣＵにカウンタ履歴部１７が搭載されてもよい。この場合、複数のマイコンでカウンタ履歴部１７を共用できる。
【００２６】
〔カウンタ値のカウントアップなどの処理〕
各コア１〜ｎはそれぞれ専用の車載装置の制御のため処理を行っている。この処理又はこの処理を実行するプログラムをメインタスクと称する。そして、一般的なウォッチドッグタイマによる異常監視では、ウォッチドッグタイマがオーバーフローしないように、コア１〜ｎが定期的にウォッチドッグタイマをリセットする。このリセットはアイドルタスクと称されるタスクの中で行われることが多い。本実施形態では、コアがアイドルタスクを実行してウォッチドッグタイマをリセットする代わりに、「カウンタ値×ＩＤ」（又はカウンタ値）を通知する処理を行う。
【００２７】
図３は、コア１〜ｎのタスクとカウンタ履歴部１７の関係を模式的に説明する図の一例である。カウンタ履歴部１７は、図３にも示すように乗算器１〜ｎがある場合とない場合がある。
【００２８】
コア１〜ｎには、重複しないＩＤが付与されている。ＩＤは、マイコン１００の起動時にＯＳ又はプログラム３０が初期処理として各コア１〜ｎのコアＩＤレジスタ４０に登録する。ＩＤはコア毎に固定であるが、初期処理の度に異なっていてもよい。また、図示するように連番である必要もない。
【００２９】
タイマ４１は予め設定された時間間隔（例えば数ミリ秒）毎に周期的にプロセッサ１１に割込みする。各コア１〜ｎは割込みによりメインタスクを実行する。コア１〜ｎはメインタスクの実行を終了すると、続いてアイドルタスクを実行する。各コアが行うメインタスクは処理内容が異なっているので、同じ周期でメインタスクを実行しても実行完了タイミングは異なる可能性がある。しかし、メインタスクとアイドルタスクが実行される頻度は各コア１〜ｎに共通になる。
【００３０】
したがって、各コア１〜ｎは共通の周期でアイドルタスクを実行する。すなわち、各コア１〜ｎが実行するメインタスクが異なっていても、アイドルタスクがカウンタ値をカウントアップする頻度は共通である。
【００３１】
アイドルタスクは、ウォッチドッグタイマをリセットする処理の代わりに、カウンタ値を決まった値だけカウントアップする処理を行う。カウンタ値のカウントアップは各コアに共通なので、コアが暴走しなければカウンタ値１〜ｎはコア１〜ｎにおいて等しくなる。１回のカウントアップ量は、各コアに共通の自然数ならいくつでもよいがここでは“１”とする。したがって、カウンタ値はアイドルタスクが呼び出される毎に１つ大きくなる。
【００３２】
アイドルタスクは、自己の「カウンタ値×ＩＤ」をカウンタ履歴部１７に通知する。または、アイドルタスクは、自己のＩＤと共にカウンタ値をカウンタ履歴部１７に通知する。このように、「カウンタ値×ＩＤ」の処理は、各コア１〜ｎを識別するための処理となるが、コアとカウンタ履歴部１７のどちらが行ってもよい。詳しくは後述する。
【００３３】
アイドルタスクは、カウンタ値をコア１〜ｎのローカルＲＡＭやレジスタに記憶し、この後、他に処理がなければコア１〜ｎはアイドルタスクを終了する。次回、メインタスクが周期割込みにより起動されると、アイドルタスクは最後に記憶したカウンタ値を読み出して、カウントアップする処理を再度、行う。
【００３４】
なお、コア１〜ｎからカウンタ履歴部１７へのアクセスは、メインバス２１、Ｉ／Ｏブリッジ１６、周辺バス２２、カウンタ履歴部１７の順である。逆に、カウンタ履歴部１７がプロセッサ１１にアクセスする場合は、ＩＮＴＣ１３、プロセッサ１１の順となる。
【００３５】
また、必ずしも、アイドルタスクはメインタスクから呼び出されて実行される必要はなく、メインタスクの中でカウンタ値を積算してもよい。また、アイドルタスクが、周期的な割込みで、直接、起動されてもよい。
【００３６】
〔カウンタ履歴部の構成例１〕
図４は、カウンタ履歴部１７の構成例の一例を示す図である。図４の構成は、カウンタ履歴部１７が「カウンタ値×ＩＤ」を算出する場合の構成である。
【００３７】
カウンタ履歴部１７は、乗算器３１（区別する場合、乗算器１〜ｎという）、加算器３２、減算器３３、合計値記憶部３６、第１差記憶部３７、第２差記憶部３８、比較器３５、及び、コアＩＤ公開用レジスタ３９を有する。なお、乗算器３１、加算器３２及び減算器３３，３４は、説明の都合上、別々に図示したものであり加算・減算・乗算が可能な一体の演算器により構成してもよい。
【００３８】
乗算器１〜ｎには、コア１〜ｎから送出されたカウンタ値、及び、コア１〜ｎのＩＤ１〜ｎが供給される。乗算器１〜ｎは、コア毎にコアのカウンタ値とコアのＩＤの乗算を行い、それぞれを加算器３２に供給する。
【００３９】
加算器３２は、全ての乗算器１〜ｎの乗算結果を加算する。この加算結果が合計値である。加算器３２は、最新の合計値を減算器３３に供給する。
【００４０】
次に、減算器３３は以下の処理を行う。
・合計値記憶部３６から、前回の合計値を読み出す。
・加算器３２から取得した最新の合計値を合計値記憶部３６に記憶する。
・最新の合計値から前回の合計値を減じる。
この減算結果が第１差である。減算器３３は、最新の第１差を減算器３４に供給する。
【００４１】
次に、減算器３４は以下の処理を行う。
・第１差記憶部３７から、前回の第１差を読み出す。
・減算器３４から取得した最新の第１差を第１差記憶部３７に記憶する。
・最新の第１差から前回の第１差を減じて絶対値を求める。
この減算結果が第２差である。
【００４２】
次に、比較器３５は、第２差がゼロか否かを判定する。ゼロの場合、コア１〜ｎに暴走したコアはなく、各コア１〜ｎが正常にカウンタ値をカウントアップしていることになる。よって、カウンタ履歴部１７は、特に何もする必要はないが、図では比較用に第２差を第２差記憶部３８に記憶している。
【００４３】
第２差がゼロでない場合、コア１〜ｎに暴走したコアがあることになる。このため、比較器３５は、第２差をコアＩＤ公開用レジスタ３９に記憶する。コアＩＤ公開用レジスタ３９は、各コアが参照することが記憶手段（例えば、レジスタ）である。第２差がゼロ以外になった場合、第２差は暴走したコアのコアＩＤになるので、各コア１〜ｎは、どのコアが暴走したかを容易に判別することができる。
【００４４】
カウンタ履歴部１７は、ウォッチドッグタイマと同様に、第２差がゼロでない場合、以下のような処理を行う。
（ａ）プロセッサ１１に割込み信号を出力する。これによりプロセッサ１１の各コア１〜ｎは割込みに対応した処理として、例えば、コアＩＤ公開用レジスタ３９から第２差（コアＩＤ）を読み出し、暴走したコアを特定する。また、暴走したコアに応じたフェールセーフ処理（別のコアに処理を振り分ける、マスターを切り換える等）を行うことができる。
（ｂ）ＣＡＮコントローラ１９を介して他のＥＣＵに通知する。
（ｃ）電源を遮断する。暴走したコアをリセットする（コアのみをリセットする内部リセット）。
【００４５】
このように、アイドルタスクに、ウォッチドッグタイマのリセットの代わりにカウンタ値をカウントさせる処理を行わせるだけで、ほとんどソフト的な処理負荷を増大させることなく、各コア１〜ｎが暴走したコアを特定できる。コアの数が何個でも、１つのカウンタ履歴部１７があればよい。
【００４６】
〔カウンタ履歴部の構成例２〕
図５は、カウンタ履歴部１７の構成例の一例を示す図である。図５の構成は、各コアのアイドルタスクが「カウンタ値×ＩＤ」を算出する場合の構成である。このため、図５のカウンタ履歴部１７は、乗算器１〜ｎを有さない。それ以外の構成は図４と同様である。
【００４７】
加算器３２には、コア１〜ｎから送出された「カウンタ値×ＩＤ」の計算結果が供給される。加算器３２は、全てのコア１〜ｎの「カウンタ値×ＩＤ」の計算結果を加算する。この加算結果が合計値である。加算器３２は、最新の合計値を減算器３３に供給する。
【００４８】
以降の処理、すなわち、減算器３３、減算器３４、及び、比較器３５による処理は図４と同様なので説明を省略する。
【００４９】
図５と図４を比較すると、図５ではｎ個の乗算器１〜ｎが不要なので、カウンタ履歴部１７の回路規模を小さくできる。したがって、コア数が多く、乗算器１〜ｎを集約できないような場合は、図５の態様の方が有効である。
【００５０】
〔カウンタ値などの遷移〕
図６は、カウンタ値、積算値、合計値、第１差、第２差の遷移の一例を説明する図である。左図は正常時の遷移を、右図はコア２が暴走した際の遷移をそれぞれ示す。なお、各コア１〜ｎが「カウンタ値×ＩＤ」又は「カウンタ値」のどちらを送信するかは、カウンタ値の遷移に影響しない。
【００５１】
時刻t0〜t4毎にカウンタ値、積算値、合計値、第１差、第２差が図示されている。時刻t0〜t4はタイマ４１が各コア１〜ｎに周期的に割込みする間隔（例えば、数ミリ秒）の経過を表す。カウンタ値「１，２，３，４，５」は時刻が経過する毎に１つずつ大きくなっている。カウンタ値は１つしかないが、実際には各コア１〜ｎが周期的な割込みで同期するので、各アイドルタスクがそれぞれカウンタ値をカウントしている。
【００５２】
コア１又は乗算器１は、「ＩＤ：１×カウンタ値」を周期的に計算するので、計算結果は「１、２，３，４，５」となる。
【００５３】
コア２又は乗算器２は、「ＩＤ：２×カウンタ値」を周期的に計算するので、計算結果は「２、４，６，８，１０」となる。
【００５４】
コア３又は乗算器３は、「ＩＤ：３×カウンタ値」を周期的に計算するので、計算結果は「３、６，９，１２，１５」となる。
【００５５】
また、合計値は、時刻t0〜t4毎の積算値の合計なので、「６、１２，１８，２４，３０」のように“６”ずつ増える等差級数（初項６、公差６）となる。したがって、第1差は、公差“６”が常に現れる「６，６，６，６，６」となる。このため、第２差は常に“０”となるが、時刻t0では演算対象の第１差がないので算出しないものとする。したがって、「−，０，０，０，０」となる。
【００５６】
このように、コアが暴走しなければ、第１差が常に公差の“６”となるので、第２差は“０”となり、カウンタ履歴部１７はコアが暴走していないことを確認できる。
【００５７】
次に、コア１〜ｎのいずれかが暴走した場合について説明する。ここではコア２が時刻t2〜t3の間に暴走したものとする。コア１，３のカウンタ値等は図６の左図にて説明したとおりである。これに対し、コア２は暴走したため、アイドルタスクがカウンタ値のカウントアップをできず、コア２のカウンタ値は「１，２，３，３，３」となる（不図示）。また、コア２が暴走すると、カウンタ履歴部１７にカウンタ値（又は、ＩＤ：２×カウンタ値）を通知することもできない。したがって、コア２の暴走後は、時刻の経過に関わりなく加算器３２に“６”が供給される。
【００５８】
このため、合計値は「６、１２，１８，２２，２６」となり、時刻t3以降の公差が４となる。公差が“６”から“４”に減少するのは、コア２の「ＩＤ：２×カウンタ値」が更新されないためである。
【００５９】
時刻t3で合計値が減少したため、時刻t3、t4の第1差も小さくなり「６，６，６，４，４」となる。この結果、第２差は「−，０，０，２，０」となる。コア２が暴走した直後の時刻t3でのみ第２差に“２”が現れる。この“２”は、コア２のＩＤ（＝２）に他ならない。
【００６０】
したがって、カウンタ履歴部１７は、第２差が“０”以外となった時刻によりコアの暴走タイミングを特定でき、第２差の値により暴走したコアを特定することができる。カウンタ履歴部１７は、第２差の値をコアＩＤ公開用レジスタ３９に記憶するので、他の暴走していないコア１，３が暴走したコア２を検知することができる。
【００６１】
図７は、コア１〜ｎが４つの場合のカウンタ値、積算値、合計値、第１差、第２差の遷移の一例を説明する図である。左図は正常時の遷移を、右図はコア４が暴走した際の遷移をそれぞれ示す。
【００６２】
コア１〜ｎが暴走しない場合の遷移は図６の左図と同様なので簡単に説明する。
合計値は、「１０，２０，３０，４０，５０」のように“１０”ずつ増える等差級数（初項１０、公差１０）となる。したがって、第１差には公差“１０”が常に現れる「１０，１０，１０，１０，１０」となる。このため、第２差は「−，０，０，０，０」となる。
【００６３】
次に、コア４が時刻t1〜t2の間に暴走したものとする。コア１〜３のカウンタ値等は図７の左図にて説明したとおりである。これに対し、コア４は暴走したためアイドルタスクがカウンタ値をカウントアップできず、コア４のカウンタ値は「１，２，２，２，２」となる（不図示）。また、コア４が暴走すると、カウンタ履歴部１７にカウンタ値（又は、ＩＤ＝４×カウンタ値）を通知することもできない。したがって、加算器３２には時刻の経過に関わりなく“８”が供給される。
【００６４】
このため、合計値は「１０、２０，２６，３２，３８」となり、時刻t2以降の公差が６となる。公差が“１０”から“６”に減少するのは、コア４の積算値が更新されないためである。
【００６５】
時刻t2で合計値が減少したため、時刻t2、t3、t4の第１差も小さくなり「１０，１０，６、６，６」となる。この結果、第２差は「−，０，４，０，０」となる。コア４が暴走した直後の時刻t2でのみ第２差に“４”が現れる。この“４”はコア４のＩＤ（＝４）に他ならない。したがって、コアの数に関係なく、暴走したコア及びそのタイミングを特定できることが分かる。
【００６６】
図８は、ＩＤが不連続の場合の、カウンタ値、積算値、合計値、第１差、第２差の遷移の一例を説明する図である。左図は正常時の遷移を、右図はコア２が暴走した際の遷移をそれぞれ示す。正常時の場合の遷移については説明を省略する。
【００６７】
図ではコア１〜３のＩＤがそれぞれ６、１１，１０１となっている。コア２が時刻t2〜t3の間に暴走した場合、コア２は暴走したためカウンタ値のカウントアップができず、コア２のカウンタ値は「１１，２２，３３，３３，３３」となる。したがって、加算器３２には時刻の経過に関わりなく“３３”が供給される。
【００６８】
このため、合計値は「１１８、２３６，３５４，４６１，５６８」となり、時刻t3以降の公差が“１０７”となる。公差が“１１８”から“１０７”に減少するのは、コア２の積算値が更新されないためである。
【００６９】
時刻t3で合計値が減少したため、時刻t3、t4の第１差も小さくなり「１１８，１１８，１１８、１０７，１０７」となる。この結果、第２差は「−，０，０，１１，０」となる。コア２が暴走した直後の時刻t2でのみ第２差に“１１”が現れる。この“１１”はコア２のＩＤ＝１１に他ならない。したがって、コア１〜ｎに付与されるＩＤが一意であればそのＩＤの値に関係なく、暴走したコア及びそのタイミングを特定できることが分かる。
【００７０】
図９は、複数のコアが同時に暴走した場合の、カウンタ値、積算値、合計値、第１差、第２差の遷移の一例を説明する図である。図9では左図と右図のいずれもコア１，２が暴走した場合の遷移を示している。
【００７１】
左図ではコア１〜３のＩＤはそれぞれＩＤ＝１，２，３である。時刻t3〜t4の間に、コア１，２が共に暴走したとする。これまで説明したように、コアが暴走することで暴走したコアのＩＤが第２差に表れるが、複数のコアが同時に暴走した場合は暴走した複数のコアのＩＤの合計が第２差に表れる。このため、時刻t3の第２差は“３”となっている。
【００７２】
しかし、コア３のＩＤが“３”であるため、コア３はコア３自身が暴走したと誤検知する可能性がある。このような誤検知は、開発者等がコア１〜ｎのＩＤを調整することで回避できる。
【００７３】
図９の右図では、コア１〜３のＩＤをそれぞれＩＤ＝１，２，４とした。同様に、時刻t3〜t4の間に、コア１，２が共に暴走したとすると、時刻t3の第２差は“３”となる。ＩＤが“３”となるコアは存在しないため、コア３はＩＤの合計が“３”となる２つのコア（コア１，２）が暴走したと検知することができる。ＩＤの合計が“３”となるＩＤの組み合わせは“１”と“２”しかない。よって、コア３は、コア１，２が暴走したと検知することができる。
【００７４】
同様に、同時に暴走した複数のコアを特定することができる。
・コア１と３が暴走した場合、第２差は“５”となるが、ＩＤ＝５のコアはなく、ＩＤの合計が“５”となるＩＤの組み合わせは“１”と“４”しかない。よって、コア２は、コア１，３が暴走したと検知することができる。
・コア２と３が暴走した場合、第２差は“６”となるが、ＩＤ＝６のコアはなく、ＩＤの合計が“６”となるＩＤの組み合わせは“２”と“４”しかない。よって、コア１はコア２、３が暴走したことを検知できる。
【００７５】
このように、コア１〜ｎのＩＤを適切に設定しておくことで複数のコアの暴走にも対応することができる。具体的には、任意の２組のコアのＩＤの合計が、他のコアのＩＤと一致しないように、開発者等が各コア１〜ｎのＩＤを設定する。３つ以上のコアが同時に暴走した場合についても、任意の３組のコアのＩＤの合計が、他のコアのＩＤと一致しないように、各コアのＩＤを設定すればよい。
【００７６】
なお、カウンタ値は１つずつインクリメントされるので、第２差にＩＤが現れるが、カウンタ値は２つずつインクリメントされてもよい。この場合、第２差に暴走したコアのＩＤ×２が現れる。よって、各コア１〜ｎは第２差を“２”で除すれば、暴走したコアのＩＤが得られる。このように、インクリメント値が一定でかつ既知であれば、カウンタ値の１回のカウントアップ分は“１”でなくてもよい。
【００７７】
〔マスター／スレーブの切り換え〕
マルチコアのマイコン１００では、複数のコアのいずれか１つをマスターに、残りをスレーブに設定して、マスターがスレーブを監視するなどの構成を採ることがある。この場合、マスターが暴走すると、スレーブを監視するコアがなくなりコアの監視が行われない等の不都合が生じるおそれがある。
【００７８】
一般には、各コア１〜ｎは次のようにしてマスターのコアを決定する。例えば、各コア１〜ｎは、起動時に他のコアのＩＤを参照して（交換して）、最も小さいコアがマスターを引き受ける。したがって、コアＩＤ＝１のコア（コア１とする）があれば、ＩＤ＝１のコア１がマスターを引き受ける。コア１はマスターのコアＩＤを記憶するレジスタに自己のＩＤを記憶すると共に、他のコア２〜ｎにマスターのコア１のＩＤ（＝１）を通知する。各コア２〜ｎは、マスターであるコアのコアＩＤを記憶するレジスタにコア１のＩＤ＝１を記憶する。
【００７９】
コア１が暴走した場合、他のコア２〜ｎはコアＩＤ公開用レジスタ３９を参照して、コア１が暴走したことを検知する。暴走したコア１は、電源が遮断されるか又はリセットされる。コア１がリセットされた場合、コア１も復帰すると考えられるが、一度、暴走したコアは再度、暴走するおそれがあるため、別のコア２〜ｎがマスターを引き受けることが好ましい。
【００８０】
そこで、コア１の暴走を検知した他のコア２〜ｎは、レジスタに記憶しているマスターのコア１が暴走したので、他のコアのＩＤを参照して、次のマスターのコアを決定する。この場合、最も小さいＩＤを持つコア２がマスターを引き受ける。
【００８１】
コア２はマスターのコアＩＤを記憶するレジスタに自己のＩＤを記憶すると共に、他のコア３〜ｎにＩＤ＝２を通知する。各コ３〜ｎアは、マスターのコアのコアＩＤを記憶するレジスタにコア２のＩＤ＝２を記憶する。
【００８２】
このように、各コア１〜ｎが暴走したコアを特定できるので、暴走したコアがマスターであれば、他のコアが自律的にスレーブからマスターに切り替わることができる。
【００８３】
なお、マスターになったコア２はマスターに必要なタスクを実行する。例えば、必要に応じてマイコン自体をリセットする処理、コアを切り離したり、起動させる処理、クロック周波数を設定する処理などを行うことができる。
【００８４】
以上説明したように、本実施例のマイコン１００は、コア毎に「カウンタ値×ＩＤ」を求め合計し、２回の減算を行うだけで、暴走したコアを特定することができる。アイドルタスクはカウントアップするだけか、カウントアップ後に整数の乗算を行うだけでよいのでソフト的な負荷が増大することもほとんどない。
【実施例２】
【００８５】
実施例１では、コア１〜ｎがソフト的に少なくともカウンタ値をカウントアップしたが、本実施例ではカウンタ値のカウントアップをカウンタ履歴部１７が行うマイコン１００について説明する。
【００８６】
〔カウンタ回路１〜ｎが同じだけカウントアップするカウンタ履歴部〕
図１０は、カウンタ履歴部１７の構成例の一例を示す図である。実施例１ではアイドルタスクがカウンタ値をカウントアップしたが、本実施例ではカウンタ履歴部１７がカウントアップを行う。このため、図１０のカウンタ履歴部１７はカウンタ回路４２（以下、区別する場合、カウンタ回路１〜ｎという）を有する。
【００８７】
コア１〜ｎのアイドルタスクは、タイマによる周期的な割込みを利用して、定期的にカウンタ履歴部１７に通知する。カウンタ履歴部１７は通知元のコア１〜ｎを判別して、コア１〜ｎに対応したカウンタ回路１〜ｎにカウンタ値をカウントアップさせる。各カウンタ回路１〜ｎはそれぞれ同じだけ（例えば、１つずつ）カウンタ値をカウントアップする。コア１〜ｎのＩＤは、定期的な通知に含ませておく。したがって、アイドルタスクは、コアのＩＤの通知という簡単な処理を行うだけでよい。
【００８８】
乗算器１〜ｎには、カウンタ回路１〜ｎから送出されたカウンタ値、及び、コア１〜ｎのＩＤ１〜ｎが供給される。乗算器１〜ｎは、各コアを識別するための処理として、コア毎にカウンタ値とコアのＩＤの乗算を行い、それぞれを加算器３２に供給する。以降の処理は実施例１と同様であり、加算器３２は乗算器１〜ｎから取得した「カウンタ値×ＩＤ」の合計値を算出する。減算器３３は最も新しい合計値と前回の合計値の差である第１差を算出し、第１差記憶部３７に記憶させる。減算器３４は最も新しい第１差と前回の第１差の差である第２差を算出し、第２差記憶部３８に記憶させる。
【００８９】
コアが暴走した場合、該コアが実行するアイドルタスクはカウンタ履歴部１７にコアのＩＤを通知できないので、該コアに対応したカウンタ回路４０はカウントアップしない。すなわち、実施例１で暴走したコアがカウントアップしない場合と同様の状況が生じる。このため第２差には、コアが暴走したコアのＩＤが表れ、暴走していない他のコアはコアＩＤ公開用レジスタ３９により暴走したコアを特定することができる。
【００９０】
したがって、カウンタ履歴部１７にコア１〜ｎに対応したカウンタ回路１〜ｎを配置することで、アイドルタスクは、従来のウォッチドッグタイマのリセットと同様の簡易な処理を行うだけよくなり、ソフトウェアのコスト増を抑制できる。
【００９１】
〔カウンタ回路１〜ｎがそれぞれ異なる値をインクリメントするカウンタ履歴部〕
また、同様の構成において、乗算器３１を省略することもできる。
図１１はカウンタ履歴部１７の構成例の一例を示す図である。図１１では、各コアを識別するための処理を、カウンタ回路１〜ｎが行う。具体的には、カウンタ回路１〜ｎは、それぞれが互いに異なる値をカウントアップする。
【００９２】
コア１〜ｎのアイドルタスクは、タイマによる周期的な割込みを利用して、定期的にカウンタ履歴部１７に通知する。カウンタ履歴部１７は通知元のコアを判別して、コアに対応したカウンタ回路にカウンタ値をカウントアップさせる。
【００９３】
各カウンタ回路１〜ｎはそれぞれ、異なる値だけカウンタ値をカウントアップする。例えば、カウンタ回路１は“１”ずつカウントアップし、カウンタ回路２は“２”ずつカウントアップし、カウンタ回路ｎは“ｎ”ずつカウントアップする。このようなカウントアップにより、「カウンタ値×ＩＤ」と同様、各コアを識別するための処理を実現できる。
【００９４】
加算器３２には、カウンタ回路１〜ｎから送出されたカウンタ値が供給される。加算器３２は、カウンタ回路１〜ｎのカウンタ値を合計して、合計値を合計値記憶部３６に記憶させる。
【００９５】
以降の処理は実施例１と同様であり、減算器３３は最も新しい合計値と前回の合計値の差である第１差を算出し、第１差記憶部３７に記憶させる。減算器３４は最も新しい第１差と前回の第１差の差である第２差を算出し、第２差記憶部３８に記憶させる。
【００９６】
コアが暴走した場合、該コアに対応したカウンタ回路はカウントアップしない。このため第２差には、暴走したコアに対応するカウンタ回路４２のカウントアップ量が表れる。カウントアップ量はコア毎に固定（一意）なので、暴走していない他のコアは暴走したコアを特定することができる。
【００９７】
したがって、アイドルタスクがカウントアップしなくても、カウンタ履歴部１７がカウンタ回路４２を有することで、暴走したコアを特定することができる。
【符号の説明】
【００９８】
１１        プロセッサ
１７        カウンタ履歴部
３０        プログラム
３１        乗算器
３２        加算器
３３、３４  減算器
３５        比較器
３６        合計値記憶部
３７        第１差記憶部
３８        第２差記憶部
３９        コアＩＤ公開用レジスタ
４０        コアＩＤレジスタ
４１        タイマ
４２        カウンタ回路
１００    マイコン
【図１】
2013084218.tif 000003
【図２】
2013084218.tif 000004
【図３】
2013084218.tif 000005
【図４】
2013084218.tif 000006
【図５】
2013084218.tif 000007
【図６】
2013084218.tif 000008
【図７】
2013084218.tif 000009
【図８】
2013084218.tif 000010
【図９】
2013084218.tif 000011
【図１０】
2013084218.tif 000012
【図１１】
2013084218.tif 000013