(57)【要約】  複数のコアがそれぞれプログラムを実行するプロセッサであって、第１コアがプログラムの実行履歴記録ポイントに記述された実行履歴記録命令を実行した場合、前記第１コアの一連の命令を１つのアドレスで指示する第１のコードブロック情報を取得する第１の自コア実行ポイント取得手段と、前記第１コアが前記実行履歴記録命令を実行した場合、第２コアが実行している命令の第１の実行アドレス情報を取得する第１の他コア実行ポイント取得手段と、前記第１のコードブロック情報及び前記第１の実行アドレス情報を対応づけて共有メモリに時系列に記憶する第１の実行ポイント情報記録手段と、を有することを特徴とする。
2012070137.tif 000002
【特許請求の範囲】
【請求項１】
複数のコアがそれぞれプログラムを実行するプロセッサであって、
第１コアがプログラムの実行履歴記録ポイントに記述された実行履歴記録命令を実行した場合、前記第１コアが実行する一連の命令を１つのアドレスで指示する第１のコードブロック情報を取得する第１の自コア実行ポイント取得手段と、
前記第１コアが前記実行履歴記録命令を実行した場合、第２コアが実行している命令の第１の実行アドレス情報を取得する第１の他コア実行ポイント取得手段と、
前記第１のコードブロック情報及び前記第１の実行アドレス情報を対応づけて共有メモリに時系列に記憶する第１の実行ポイント情報記録手段と、
を有することを特徴とするプロセッサ。
【請求項２】
前記第２コアが前記実行履歴記録命令を実行した場合、前記第２コアが実行する一連の命令を１つのアドレスで指示する第２のコードブロック情報を取得する第２の自コア実行ポイント取得手段と、
前記第２コアが前記実行履歴記録命令を実行した場合、第１コアが実行している命令の第２の実行アドレス情報を取得する第２の他コア実行ポイント取得手段と、
前記第２のコードブロック情報及び前記第２の実行アドレス情報を対応づけて前記共有メモリに時系列に記憶する第２の実行ポイント情報記録手段と、
を有する請求項１記載のプロセッサ。
【請求項３】
前記共有メモリは、前記第１のコア及び前記第２のコアが、前記共有メモリのアドレス順に、前記第１のコードブロック情報と前記第１の実行アドレス情報、又は、前記第２のコードブロック情報と前記第２の実行アドレス情報を書き込むリングバッファである、
ことを特徴とする請求項１又は２記載のプロセッサ。
【請求項４】
予め定められた事象の発生を検出した場合、前記第１の実行ポイント情報記録手段又は前記第２の実行ポイント情報記録手段は、前記共有メモリに、前記第１のコードブロック情報と前記第１の実行アドレス情報、又は、前記第２のコードブロック情報と前記第２の実行アドレス情報を記録することを停止する、
ことを特徴とする請求項３記載のプロセッサ。
【請求項５】
前記第１の実行ポイント情報記録手段は、前記第１のコードブロック情報と前記第１の実行アドレス情報に加え、前記第１コアの汎用レジスタの値、フラグレジスタの値、スタックポインタの値、又は、入力インターフェースを介して取得した入力値、の１つ以上を前記共有メモリに時系列に記憶する、
ことを特徴とする請求項１項記載のプロセッサ。
【請求項６】
前記第１の実行ポイント情報記録手段は、前記第１のコードブロック情報と前記第１の実行アドレス情報に加え、前記第１コアが前記実行履歴記録命令の次の命令を実行することで移動する移動先のアドレス情報を、前記共有メモリに時系列に記憶する、ことを特徴とする請求項１記載のプロセッサ。
【請求項７】
前記実行履歴記録ポイントは、条件分岐命令又はサブルーチンコール命令の直前のステップである、ことを特徴とする請求項１記載のプロセッサ。
【請求項８】
前記実行履歴記録ポイントは、一まとまりの機能を提供する一連の命令の終わり又は始まりの命令の直前のステップである、ことを特徴とする請求項１記載のプロセッサ。
【請求項９】
前記事象はエアバッグの展開である、ことを特徴とする請求項４記載のプロセッサ。
【請求項１０】
請求項１記載のプロセッサが搭載された車両用の電子制御ユニット。
【請求項１１】
請求項１記載の前記プログラムを作成する作成プログラムであって、ＣＰＵに
前記プログラムのバイナリコードを読み出すステップと、
条件分岐命令一覧に登録された条件分岐命令のいずれかに一致する前記バイナリコードの命令のアドレスを抽出する抽出処理ステップと、
前記第１の自コア実行ポイント取得手段、前記第１の他コア実行ポイント取得手段、及び、前記第１の実行ポイント情報記録手段、に対応する命令又は呼び出す命令を、前記抽出処理ステップで抽出したアドレスの直前に記述するコード埋め込みステップと、
を実行させる作成プログラム。
【請求項１２】
第２のプロセッサと接続されたプロセッサであって、
第１のプログラムの実行履歴記録ポイントに記述された実行履歴記録命令を実行した場合、前記第１のプログラムの一連の命令を１つのアドレスで指示する第１のコードブロック情報を取得する第１の自コア実行ポイント取得手段と、
前記実行履歴記録命令を実行した場合、前記第２のプロセッサが実行している第２のプログラムの命令の第１の実行アドレス情報を取得する第１の他コア実行ポイント取得手段と、
前記第１のコードブロック情報及び前記第１の実行アドレス情報を対応づけて第１のメモリに時系列に記憶する第１の実行ポイント情報記録手段と、
を有することを特徴とするプロセッサ。
【請求項１３】
請求項１２に記載のプロセッサと接続された第２のプロセッサであって、
前記第１の他コア実行ポイント取得手段から前記第１の実行アドレス情報を要求された際、実行している前記第２のプログラムの命令の第２の実行アドレス情報を取得する第２の自コア実行ポイント取得手段と、
前記第１の他コア実行ポイント取得手段から前記第１の実行アドレス情報を要求された際、前記第１のプロセッサが実行している前記第１のプログラムの命令の第３の実行アドレス情報を取得する第２の他コア実行ポイント取得手段と、
前記第２の実行アドレス情報及び前記第３の実行アドレス情報を対応づけて第２のメモリに時系列に記憶する第２の実行ポイント情報記録手段と、
を有する第２のプロセッサ。
【請求項１４】
複数のコアがそれぞれプログラムを実行するプロセッサであって、
第１コア及び第２コアが実行する命令が、予め登録された命令と一致するか否かを判定する命令監視手段と、
第１コア又は第２コアが実行する命令が予め登録された命令と一致する場合、前記第１コアが実行する一連の命令を１つのアドレスで指示する第１のコードブロック情報又は前記第２コアが実行する一連の命令を１つのアドレスで指示する第２のコードブロック情報、及び、第２コアが実行している命令の第１の実行アドレス情報又は第１コアが実行している命令の第２の実行アドレス情報、を取得する実行ポイント取得手段と、
前記第１のコードブロック情報及び前記第１の実行アドレス情報、又は、前記第２のコードブロック情報及び前記第２の実行アドレス情報を、対応づけてメモリに時系列に記憶する実行ポイント情報記録手段と、
を有することを特徴とするプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを実行するプロセッサに関し、特に、複数のコア又はＣＰＵが実行するプログラムの実行履歴を記憶するプロセッサに関する。
【背景技術】
【０００２】
車両には数多くの電子制御装置が搭載されており、各電子制御装置が各種のプログラムを実行して様々な車載装置を制御している。車両メーカはプログラムを含む車載装置を十分に検証した後、出荷するが、出荷後の車両から得られる情報によりさらにプログラムや車載装置の完成度を向上させることを継続的に行っている。【０００３】
このため、車両になんらかのイベントが生じると、プログラムの実行履歴を記録する機能が電子制御装置に搭載されることがある。例えば、従来であればプログラムカウンタ（以下、ＰＣという）の値を時系列に記憶する技術が知られている。しかしながら、ＰＣの値をステップ毎に記憶するには多くの記憶容量が必要となり、十分な記憶容量のメモリを用意しないと、解析に必要なステップ（過去のある時刻）の実行履歴が上書きにより消去されていることが生じやすい。一方で、ＰＣの記録のため十分な記憶容量のメモリを用意すると分析の対象が増えるため、分析時にイベントの原因やどのような処理が行われたかを特定することが困難になるという不都合をもたらす。【０００４】
また、プログラムの実行時に条件分岐命令が検出されると、分岐命令のアドレスをトレースレジスタに書き込む技術も考案されている（例えば、特許文献１，２参照）。特許文献１には分岐条件が成功を示す場合に分岐条件ないしはその近傍のマイクロ命令アドレスをトレースレジスタに書き込むアドレストレース装置が開示されている。また、特許文献２には、分岐の発生時、すでに分岐アドレスが記憶されているか否かをチェックして、トレースされていない場合にだけ分岐アドレスをトレースレジスタに書き込むトレース方式が開示されている。【０００５】
ところで、近年、車載される電子制御装置の数を抑制しようとそれまでは複数の電子制御装置に分散されていた機能を１つの電子制御装置に集約する試みがある。また、電子制御装置のＣＰＵも一般のコンピュータと同様にマルチコア化が図られるようになってきている。すると、１つのＣＰＵ内の複数のコアが別々にプログラムを実行することになる。このような状況でイベントが発生すると、複数のコアのプログラムの分岐アドレスを別々に記憶するだけでは、イベントの発生に関連する不具合等の特定が困難であるという問題がある。すなわち、コアＡが実行する命令Ａ、コアＢが実行する命令Ｂの実行履歴が別々に記録されていると、命令Ａと命令Ｂの相対的な実行順序が分からないので、解析が困難になる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開昭６３−２５７０３９号公報
【特許文献２】特開昭６１−２９０５４６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本発明は、上記課題に鑑み、マルチコア又はマルチＣＰＵ型のＣＰＵが搭載されたプロセッサにおいて、イベント発生の解析に有効な実行履歴を記録できるプロセッサを提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、複数のコアがそれぞれプログラムを実行するプロセッサであって、第１コアがプログラムの実行履歴記録ポイントに記述された実行履歴記録命令を実行した場合、前記第１コアの一連の命令を１つのアドレスで指示する第１のコードブロック情報を取得する第１の自コア実行ポイント取得手段と、前記第１コアが前記実行履歴記録命令を実行した場合、第２コアが実行している命令の第１の実行アドレス情報を取得する第１の他コア実行ポイント取得手段と、前記第１のコードブロック情報及び前記第１の実行アドレス情報を対応づけて共有メモリに時系列に記憶する第１の実行ポイント情報記録手段と、を有することを特徴とする。
【発明の効果】
【０００９】
マルチコア又はマルチＣＰＵ型のＣＰＵが搭載されたプロセッサにおいて、イベント発生の解析に有効な実行履歴を記録できるプロセッサを提供することができる。
【図面の簡単な説明】
【００１０】
【図１】本実施形態のプロセッサによる実行履歴の記憶を模式的に説明する図の一例である。
【図２】プロセッサのハードウェア構成図の一例である。
【図３】プログラムへの発生要因記憶プログラムの埋め込み方法を説明する図の一例である。
【図４】プログラムバイナリコードの一部の一例を示す図である。
【図５】コードブロックアドレス一覧の一例を示す図である。
【図６】発生要因記憶プログラムが埋め込まれたプログラムバイナリコードの一例を示す図である。
【図７】シングルコアの場合のプログラムが実行履歴を記憶する手順を示すフローチャート図の一例である。
【図８】各コアの機能ブロック図の一例である。
【図９】マルチコアの場合のプログラムが実行履歴を記憶する手順を示すフローチャート図の一例である。
【図１０】２つのコアによる１つのリングバッファへのコードブロックアドレスの記憶を模式的に説明する図の一例である。
【図１１】マルチプロセッサマイコンの構成図の一例を示す。
【図１２】２つのプロセッサ１，２がそれぞれリングバッファ４０のコードブロックアドレスに記憶する手順を説明するフローチャート図の一例である
【図１３】プロセッサのハードウェア構成図の一例を示す。
【図１４】コア３が実行履歴を記録する手順を示すフローチャート図の一例である
【符号の説明】
【００１１】
１１    コア
１２    ＣＰＵ
１３    ＩＮＴ
１４    ＲＡＭ
１６    ＳＤＲＡＭ
２０    プログラム
４０    リングバッファ
１００  プロセッサ
【発明を実施するための最良の形態】
【００１２】
以下、本発明を実施するための形態を図面を参照しながら説明する。
図１は本実施形態のプロセッサ１００による実行履歴の記憶を模式的に説明する図の一例である。本実施形態のプロセッサ１００は、何らかのイベントが生じた際に、車両メーカ等が後に解析するための診断情報を記録するＥＤＲ（Ｅｖｅｎｔ  Ｄｉａｇ  Ｒｅｃｏｒｄｅｒ）という機能の一種を有する。【００１３】
コア１はプログラム１を、コア２はプログラム２をそれぞれ別々に実行している。コア１が実行しているプログラム１の命令はポインタ１により特定され、コア２が実行しているプログラム２の命令はポインタ２により特定される。【００１４】
本実施形態のプロセッサ１００は、例えば分岐命令を実行する際にポインタ１又はポインタ２が指示するコードブロックアドレス（これについては後述する）を記憶する。コードブロックはいくつかの命令のブロックであるので、プログラムカウンタの値を記憶するよりも実行履歴の記憶容量を抑制することができる。【００１５】
また、コア１が分岐命令を実行する際、コア１は自身のコードブロックアドレスだけでなくコア２の実行ポイント（ポインタ２に指示される）も共に記憶する。こうすることで、コア１が分岐命令を実行した際にコア２がどの命令を実行していたかを特定できる。コア２についても同様であり、コア２が分岐命令を実行する際、コア２は自身のコードブロックアドレスだけでなくコア１の実行ポイントも共に記憶する。【００１６】
そして、コア１とコア２は、共有のリングバッファ４０に実行履歴を時系列に記憶していき、古いものから上書きすることを繰り返す。こうすることで、コア１とコア２の命令の実行経路だけでなく、ブロック単位でコア１とコア２による相対的な命令の実行順序が明らかになり、イベント発生にコア１とコア２の命令実行がどのように作用したかの解析が容易になる。【００１７】
〔機能統合について〕
本実施形態のプロセッサ１００は電子制御装置（ＥＣＵ：electronic control unit）に搭載される。本実施形態の電子制御装置は、従来は複数の電子制御装置が別々に提供していた機能を１つで提供することが想定されている。電子制御装置の機能統合は、ＥＣＵの数が少なくなることから開発費の低減に繋がり、この結果、車両の価格競争力が向上することも期待できる。また、プロセッサ１００の設計にもよるが、開発済みのプログラムを大きく修正することなく機能統合後の電子制御装置に搭載できれば、プログラムの開発費を大きく削減することも期待できる。【００１８】
しかしながら、電子制御装置に複数の機能を統合することは、複数の機能を提供するための命令が同時並行的に実行されることを意味するので、何らかの不具合が発生した場合の原因が複雑になることも予想される。また、統合前の複数のプログラムの実行タイミングと統合後のプログラムの実行タイミングが大きく異なることは望ましくないので、統合後の電子制御装置にマルチコアやマルチＣＰＵを搭載して、マルチコアやマルチＣＰＵが別々にプログラムを実行することが実用的である。【００１９】
本実施形態のプロセッサ１００は、機能統合した電子制御装置にマルチコアやマルチＣＰＵが搭載されていても、適切に診断情報を記録することができる。【００２０】
なお、統合する機能としては、例えば電子制御装置同士の他、ＣＡＮゲートウェイとハイブリッドＥＣＵのように、制御系と情報処理系の電子制御装置同士を統合することも含まれる。しかし、本実施形態の実行履歴の記録方法は、特に、リアルタイム性の高い制御系のプログラムの解析に有効である（例えば、ハイブリッド制御、エンジン制御、ブレーキ制御、トランスミッション制御等）。【００２１】
図２は、プロセッサ１００のハードウェア構成図の一例を示す。プロセッサ１００は、マルチレイヤーバス１９を介して接続されたコア１３（区別する場合コア１、コア２という）、ＤＭＡＣ１５、ＳＤＲＡＭ１６、Ｉ／Ｏブリッジ１７及びＲＯＭ１８を有する。【００２２】
各コアはＣＰＵ１２、ＩＮＴ１５、及び、ＲＡＭ１４を有する。すなわち、コア１はＣＰＵ１、ＩＮＴ１、及び、ＲＡＭ１を有し、コア２はＣＰＵ２、ＩＮＴ２、及び、ＲＡＭ２を有する。コア１とコア２は、それぞれのコアに決まったＯＳとタスクを割り当てるＡＭＰ（Asymmetric Multi-processing）でもよく、コア１とコア２が共通のＯＳを実行してメモリ（例えば、ＳＤＲＡＭ１６）を共有するＳＭＰ（Symmetric Multi-processing）でもよい。または、ＡＭＰとＳＭＰの中間的な性質のＢＭＰ（Bound Multi-processing）でもよい。【００２３】
したがって、図１のプログラム１，２は同じプログラムの場合もあるし、互いに独立したプログラムの場合もある。独立したプログラムの場合でも、本実施形態のＥＤＲは一方の命令の実行が他方の命令の実行に影響する可能性が高い場合に有効なので、コア１１の実装がＡＭＰの場合でも、プログラム１の処理がコア２に又はプログラム２の処理がコア１に何らかの影響（互いに演算結果を利用する、プログラム1とプログラム２に実行順依存関係がある、プログラム1とプログラム２が同期を取る等）を与える関係にあることが想定される。【００２４】
ＣＰＵ１，２は、それぞれ、ＩＦＵ（Instruction  Fetch  Unit）、ＤＥＣ（DECoder）、ＲＦ（Register  Fetch）、ＲＥＧ（REGister）、ＬＳＵ（Load  Store  Unit）、ＳＨ（ＳＨｉｆｔｅｒ）、ＡＬＵ、ＭＵＬ及びＦＰＵ等の演算回路を有し、パイプライン制御により１クロックで１命令を実行することができる。【００２５】
ＲＡＭ１はコア１に専用のメモリ（一次キャッシュ）であり、ＲＡＭ２はコア２に専用のメモリ（一次キャッシュ）である。ＳＭＰの場合、キャッシュのコヒーレンシを維持するため、不図示のスヌープコントローラ（SNC）がＲＡＭ１とＲＡＭ２のデータの更新を監視して、更新データをＲＡＭ１とＲＡＭ２間で通信する。  
ＩＮＴ１とＩＮＴ２は、ＣＰＵ間割り込みを制御すると共に、コア１からコア２又はコア２からコア１に、パラメータ等の送受信を制御する。また、ＩＮＴ１，ＩＮＴ２は、ＲＡＭ１、ＲＡＭ２、又は、ＳＤＲＡＭ１６を共有の通信用メモリにしてパラメータ等を送受信することもできる。ＩＮＴ１とＩＮＴ２を使用したコア間のパラメータ通信はハードウェア的な実装であり、この他、ＯＳが提供するコア間通信のＡＰＩを利用してもコア１とコア２は通信することができる。【００２６】
ＤＭＡＣ１５は、コア１及びコア２から要求を受けてプログラム２０をＳＤＲＡＭ１６、ＲＡＭ１、ＲＡＭ２に読み込んだり、周辺機器からのメモリアクセス要求を調停すると共に、Ｉ／Ｏブリッジ１７からＳＤＲＡＭ１６へ、又は、ＳＤＲＡＭ１６からＩ／Ｏブリッジ１７へ、コア１、コア２を介することなくデータを転送する。ＳＤＲＡＭ１６は、コア１及びコア２がプログラム２０を実行している間、ＲＡＭ１又はＲＡＭ２にミスヒットするとプログラム２０又はデータを提供するためのメモリ（二次キャッシュ）である。ＳＤＲＡＭ１６の少なくとも一部はコア１とコア２により共有される。【００２７】
ＲＯＭ１８には統合後の機能を提供する特徴的なプログラム２０が記憶されているが、このプログラム２０に発生要因記憶プログラムが埋め込まれている。埋め込み方法も本実施形態の特徴の1つである。なお、ＲＯＭ１８はプロセッサ１００の外部に配置されていてもよく、容量に応じてＯＳやデバイスドライバ（プラットフォーム）も記憶されている。【００２８】
Ｉ／Ｏブリッジ１７は、マルチレイヤーバス１９とＩ／Ｏバス２１の間で相互に周波数や電圧値などを変換する。Ｉ／Ｏバス２１には種々のＩ／Ｏ２２が接続されている。Ｉ／Ｏ２２はプロセッサ１００と外部の機器を接続するインタフェースであり、例えば、ＣＡＮコントローラ、各種のアクチュエータ、センサ、スイッチ等が接続される。【００２９】
〔発生要因記憶プログラムの埋め込み〕
図３は、プログラム２０の生成方法を説明する図の一例である。概略的には、
プログラムバイナリコード３２に発生要因記憶プログラム３３を埋め込むことでプログラム２０が生成される。【００３０】
図３の処理は、不図示のコンピュータが実行するプログラム（区別するために作成プログラム３０という）が実行する。抽出処理部３５とコード埋め込み部３６は作成プログラム３０が提供する機能である。なお、作成プログラム３０を実行するコンピュータは、ＣＰＵ、ＲＡＭ，ＲＯＭ、ＨＤＤ、入出力装置等を備えた一般的なＰＣ（パーソナルコンピュータ）でよい。【００３１】
プログラムバイナリコード３２は機能統合後のプログラムであり、プロセッサ１００が提供する実行履歴を記録する機能（ＥＤＲ機能）が含まれる前のプログラムである。
図４（ａ）は、プログラムバイナリコード３２の一部の一例を示し、図４（ｂ）のフローチャート図は分岐条件とプログラムバイナリコード３２の対応を説明するための図である。例えば、Ｃ言語で記述されたソースコードをコンパイラがコンパイルすると機械語のオブジェクトコードが得られるが、図４はオブジェクトコードを可読なようにアセンブリ言語で示したものである。Ｃ言語では、一まとまりの機能を関数名と"｛コード｝"で記述しておき、その関数をmain関数から呼び出すような記述が多いが、このような記述がコンパイルされると、関数にラベルが付与される。したがって、図４のラベルから次のラベルの直前のアセンブラコードが関数に相当するかひとまとまりの機能とみなすことができる。【００３２】
また、Ｃ言語などでは制御文としてＩｆ〜Ｅｌｓｅ文、Ｓｗｉｃｈ文、Ｗｈｉｌｅ文等が用意されており、ある条件が成立した場合又は不成立の場合に関数を呼び出す記述がなされることがある。このようなソースコードの記述はアセンブラコードでは、"Ｊｍｐ  ラベル名"と記述されている。
図４（ｂ）のフローチャート図に示すように制御文で記述される分岐条件（ひし形）が成立した場合又は不成立の場合、命令がアドレス順に実行されなくなる。この処理の流れは、アセンブラコードの"Ｊｍｐ"により表される。したがって、"Ｊｍｐ"という記述の前後で処理（機能）が大きく異なるとみなすことができる。なお、以下、"Ｊｍｐ"を条件分岐命令という場合がある。【００３３】
以上のようなアセンブラコードの記述の特徴を考慮すると、ラベルからラベル、ラベルから"Ｊｍｐ"、又は、"Ｊｍｐ"〜から次の"Ｊｍｐ"までが一つのまとまりのある機能が記述されており、１つの機能として抽出することが適切であると考えられる。本実施形態では、機能的１つと見なせる一連のコードをコードブロックと称す。【００３４】
コードブロックの間は処理が分岐しないので、コードブロックを特定するアドレス（以下、コードブロックアドレスという）を１つ記録すれば、少ない情報で多くのコードを特定できることになる。上記の一まとまりの機能は、仮にラベルから始まってもその前に"Ｊｍｐ"が実行されるので、この"Ｊｍｐ"（条件分岐命令）のアドレスをコードブロックアドレスとすることができる。【００３５】
そこで、作成プログラム３０は、条件分岐命令を予め条件分岐命令一覧３１を記憶しておいたり、ＨＤＤや作成プログラム３０内に記述しておく。図４の例では"Ｊｍｐ"が条件分岐命令である。なお、さらに、ラベル名を条件分岐命令一覧３１に登録しておいてもよい。【００３６】
また、条件分岐命令ではないが、サブルーチンをコールするために命令「Call」も実行履歴が変化するという意味では同じであるので、条件分岐命令一覧３１に「Call」を登録することも有効である。【００３７】
こうすることで、十分に細かい粒度でコードブロックを条件分岐命令一覧３１に特定できたことになる。しかしながら、コードブロックの粒度を細かくすることは、次述するように埋め込むべき場所が多くなることを意味するので、プログラムのオーバーヘッドを大きくしてしまう。このため、コードブロックの粒度（条件分岐命令一覧３２に登録する分岐命令やラベル）は、プロセッサ１００の処理能力に応じて調整することが好ましい。【００３８】
なお、コードブロックアドレスは条件分岐命令のアドレスであるが、ポインタにより指示されるアドレスという意味では、実行されている命令のアドレスを意味する実行ポイントの下位概念になる。本実施形態では両者を区別するが、大きな違いはない。【００３９】
図３に戻り、抽出処理部３５はプログラムバイナリコード３２のオペコード（ニーモニック）を１つずつ読み出し、条件分岐命令一覧３１に一致する場合、コードブロックアドレス一覧３４に登録する。【００４０】
図５は、コードブロックアドレス一覧３４の一例を示す図である。コードブロックアドレス一覧３４では、アドレスとニーモニックが対応づけられているが、ニーモニックは説明のために記載したものであり実際には不要である。抽出処理部３５は、アセンブラコードをアドレスの順番に読んでいき、条件分岐命令一覧３１に一致するアドレス「0x30，0x50，0xC0，0xE0」をコードブロックアドレス一覧３４に登録する。これらの各アドレスが各コードブロックを指定するアドレスとなり、実行履歴の記録に利用されることになる。なお、このアドレスはプログラムの先頭からの相対アドレスである。【００４１】
次に、図３のコード埋め込み部３６は、プログラムバイナリコード３２に発生要因記憶プログラム３３を埋め込む。発生要因記憶プログラム３３は、実行履歴を記録する従来のプログラムであり、特にイベントをトリガーに実行履歴を記録したり記録を停止することができる。発生要因記憶プログラム３３は実行している命令のアドレスを記憶する。プロセッサ１００がこの機能を提供するため、本実施形態で埋め込まれる記述は、例えば「Call SAVE_Log」という記述であるとする。【００４２】
よって、コード埋め込み部３６は、コードブロックアドレス一覧３４に登録されたアドレスの手前に「Call SAVE_Log」を記述していく。
図６は、発生要因記憶プログラム３３が埋め込まれたプログラムバイナリコード３２の一例を示す。アドレス「0x30，0x50，0xC0，0xE0」の手前に「Call SAVE_Log」が記述されている。コア１又はコア２は「Call SAVE_Log」を実行すると、次の命令のアドレスをコードブロックアドレスとしてリングバッファ４０に記憶する。なお、「Call SAVE_Log」の実行時には次のＪｍｐ命令のアドレスがＰＣ（プログラムカウンタ）にすでに設定されているので、次の命令のアドレスは現在のＰＣの値である。作成プログラム３０がこのように作成したプログラム２０は、プロセッサ１００のＲＯＭ１８に記憶して車両と共に出荷されるか、出荷後に上書きされる。【００４３】
〔シングルコアの場合の動作手順〕
図７は、シングルコアの場合にプログラム２０が実行履歴を記憶する手順を示すフローチャート図の一例である。図７の手順は、車両のイグニッションがオン（又は、ハイブリッド車や電気自動車の場合はメインシステムがオンの間）されると、繰り返し実行される。【００４４】
プログラム２０は、車両にイベントが発生したか否かを監視している（Ｓ１０）。典型的なイベントは、エアバッグが展開したこと、閾値以上のＧが検出されたこと、運転者が緊急サポートセンタへの通話ボタンを押下したこと、等である。すなわち、車両に比較的大きな異常が生じた可能性が高い状況が検出されることがイベントである。プロセッサ１００が搭載された電子制御装置がイベントを検出した場合は、このプログラム２０がイベントを検出し、他の電子制御装置がイベントを検出した場合はＣＡＮ通信などにより、プロセッサ１００にイベントが通知される。【００４５】
イベント発生が検出されない場合（Ｓ１０のＮｏ）、プロセッサ１００はアドレスの順番にプログラム２０を実行する（Ｓ２０）。【００４６】
そして、プロセッサ１００はプログラム２０に埋め込まれた「Call SAVE_Log」を実行すると（Ｓ３０）、リングバッファ４０にコードブロックアドレスを記憶する（Ｓ４０）。プログラム２０は、積極的にコードブロックアドレスの記憶ポイントに到達したか否かを判定しているわけではないが、結果的に、コードブロックアドレスに到達した場合にだけ、コードブロックアドレスを記憶する。【００４７】
例えば、プロセッサ１００の実行ポイント（ＰＣの値）が「０ｘ４０」であるとすると、プログラム２０はリングバッファ４０の最も古いコードブロックアドレスが記憶されているアドレスに「０ｘ４０」を記憶する。コードブロックアドレスが分かれば、一まとまりの機能のコードを特定できるので、少ないリングバッファ４０の容量で効率的に実行履歴を記録できる。なお、最も古いコードブロックアドレスが記憶されているリングバッファ４０のアドレスは、ポインタにより指示されている。【００４８】
次いで、処理はステップＳ１０に戻るので、イベントが発生するまでプログラム２０はコードブロックアドレスの記憶を繰り返す。ステップＳ１０においてイベント発生が検出されると（Ｓ１０のＹｅｓ）、プログラム２０はイベント発生に対応したイベント処理部（例えば図８に示す）を呼び出し、実行ポイントをリングバッファ４０に記憶すると共に、それ以降の記憶を停止する（Ｓ５０）。こうすることで、イベント発生よりも前のプログラム２０の実行経路を保存することができる。イベント発生以後のコードブロックアドレスの記憶を停止するには、イベント処理部が例えば、リングバッファ４０に記録禁止を意味するフラグを設定したり、ポインタに記録禁止を意味する所定値（例えば、ＮＵＬＬやＦＦＦＦ）を設定しておく。プログラム２０に埋め込まれた「Call SAVE_Log」は、リングバッファ４０のフラグやポインタの値に基づきコードブロックアドレスを記録するか否かを判定することで、イベント発生以後のコードブロックアドレスの記憶を停止することができる。【００４９】
〔マルチコアの場合の動作手順〕
図８は、各コアの機能ブロック図の一例であり、図９は、マルチコアの場合のプログラム２０が実行履歴を記憶する手順を示すフローチャート図の一例であり、図１０は２つのコアによる１つのリングバッファ４０へのコードブロックアドレスの記憶を模式的に説明する図の一例である。【００５０】
図８に示すように、コア１とコア２は、「SAVE_Log」に含まれる機能として、自コア実行ポイント取得部４２、４６、他コア実行ポイント取得部４３、４７、及び、リングバッファ記録部４４，４８、を有する。また、イベント発生に対応した処理としてイベント処理部４５，４９を有する。これらの各機能はフローチャート図と共に説明する。また、リングバッファ４０は共有メモリ（ＲＡＭ１，ＲＡＭ２又はＳＤＲＡＭ１６）に記憶されている。ポインタ４１はコア１及びコア２の各レジスタで同じ値に維持されるか、又は、共有メモリで共有されている。ポインタ４１によりリングバッファ４０において次にコードブロックアドレスを記憶すべきアドレスが指示されている。【００５１】
図９の手順はほぼ図７のシングルコアの場合の手順と同様であるが、図９ではコア１とコア２が別々に図７のフローチャート図を実行する。
・図９（ａ）のステップＳ４０が実行される場合
コア１が実行する命令が「Call SAVE_Log」に到達すると、自コア実行ポイント取得部４２はコードブロックアドレスとなる実行ポイントを取得する。実行ポイントはＰＣの値としてよい。図１０によれば、コア１は次のステップで「0x11」のアドレスを実行するので、自コア実行ポイント取得部４２は「0x11」というコードブロックアドレスを取得し、リングバッファ記録部４４に通知する。【００５２】
次に、コア１の他コア実行ポイント取得部４３は、コア２にコア２の実行ポイントを問い合わせ、コア２の実行ポイントを取得する。他コア実行ポイント取得部４３はハード的又はソフト的なコア間の通信方法を利用して、コア２から実行ポイントを取得する。コア２が「0x07」のアドレスの命令を実行していると仮定すると、他コア実行ポイント取得部４３は「0x07」というアドレスを取得し、リングバッファ記録部４４に通知する。【００５３】
リングバッファ記録部４４は、ポインタ４１の指示するリングバッファ４０のアドレスに、コア1のコードブロックアドレスとコア2の実行ポインタを対応づけて（１対に）記憶する。対応づけて記憶するとは、一方から他方を一意に特定できるような記憶態様をいい、所定のアドレスの上位バイトと下位バイトに記憶することや、連続したアドレスに記憶することや、同じ識別番号を付することなどをいう。なお、リングバッファ記録部４４はポインタ４１の値を1つ（アドレス長だけ）大きくし、リングバッファ４０の最大アドレスまで到達したら初期値に戻す。【００５４】
以上により、図１０のリングバッファ４０に示すように、「コア１条件分岐：コア１ 0x11、コア２ 0x07」と記録される。「コア１条件分岐」によりどちらのコアが記録したかが明らかになり、「コア1  0x11、コア２ 0x07」により、コア１が0x11の条件分岐命令を実行する際、コア２が0x07の命令を実行していたことが明らかとなる。【００５５】
・図９（ｂ）のステップＳ４０が実行される場合
コア２がステップＳ４０を実行する際の手順も同じである。コア２の実行するステップが「Call SAVE_Log」に到達すると、自コア実行ポイント取得部４６はコードブロックアドレスとして実行ポイントを取得する。ここでは、自コア実行ポイント取得部４６は「0x06」というアドレスを取得し、リングバッファ記録部４８に通知するものとする。【００５６】
コア２の他コア実行ポイント取得部４７は、コア１にコア１の実行ポイントを問い合わせ、コア１の実行ポイントを取得する。ここでは、他コア実行ポイント取得部４７は「0x23」というアドレスを取得し、リングバッファ記録部４８に通知するものとする。【００５７】
リングバッファ記録部４８は、ポインタ４１の指示するリングバッファ４０のアドレスに、コア１の実行ポインタとコア２のコードブロックアドレスを対応づけて記憶する。【００５８】
以上により、図１０のリングバッファ４０に示すように、「コア２条件分岐：コア１ 0x23、コア２ 0x06」と記録される。「コア２条件分岐」によりどちらのコアが記録したかが明らかになり、「コア1  0x23、コア２ 0x06」により、コア２が0x06の条件分岐命令を実行する際、コア１が0x23の命令を実行していたことが明らかとなる。【００５９】
また、１つのリングバッファ４０にコア１とコア２が時系列にコードブロックアドレスを記録するので、コア１とコア２が実行した条件分岐命令の相対的な実行順が明らかになる。すなわち、コア１だけが時系列にコードブロックアドレスを記憶し、コア２だけがコードブロックアドレスを記録すると、解析時にコア１の条件分岐命令とコア２の条件分岐命令を１つずつ取り出してもコア１の条件分岐命令とコア２の条件分岐命令ではどちらが先に実行されたかを判別することが困難である。リングバッファ４０であればなおさらである。したがって、コア１とコア２の実行履歴を統合して再現できないことになる。これに対し、本実施形態のプロセッサ１００は、コア１とコア２がそれぞれ単独に条件分岐命令を実行しても、コア１とコア２の実行履歴を同じリングバッファ４０に時系列に記録するので、コア１の条件分岐命令とコア２の条件分岐命令の実行順が明らかになる。【００６０】
なお、コードブロックアドレスの記録時にタイムスタンプを記録すればコア１とコア２が別々にコードブロックアドレスを記録してもコア１とコア２の条件分岐命令の実行順が判別できるが、処理負荷の増大やリングバッファ４０の容量を増大させるという不都合がある。【００６１】
・イベントが検出された場合
コア１とコア２は同じプロセッサ１００に配置されているので、コア１とコア２はいずれもほぼ同時にイベント発生を検出する。よって、コア１のイベント処理部４５とコア２のイベント処理部４９とはいずれもコードブロックアドレスの記憶を行う。この場合、２つのイベント処理部４５，４９はほぼ同時にコードブロックアドレスの記録を開始すると考えられるが、リングバッファ４０へのアクセスはハード的又はソフト的に排他制御されるので、いずれか早い方から順番にコードブロックアドレスを記憶する。【００６２】
例えば、コア１のイベント処理部４５は、自コア実行ポイント取得部４２、他コア実行ポイント取得部４３、及び、リングバッファ記録部４４の一連の処理を実行して、実行ポイントとして「0x40」というコードブロックアドレスを取得し、コア２の実行ポイントとして「0x09」というアドレスを取得し、リングバッファ４０に記憶する。これにより、「コア１イベント発生：コア１ 0x40、コア２ 0x09」と記録される。【００６３】
コア２のイベント処理部４９についても同様である。コア２のイベント処理部４９は、自コア実行ポイント取得部４６、他コア実行ポイント取得部４７、及び、リングバッファ記録部４８の一連の処理を実行して、実行ポイントとして「0x11」というコードブロックアドレスを取得し、コア１の実行ポイントとして「0x50」というアドレスを取得し、リングバッファ４０に記憶する。これにより、「コア２イベント発生：コア１ 0x50、コア２ 0x11」と記録される。【００６４】
コードブロックアドレスの記録を停止するため、例えば先にコードブロックアドレスを記録したコア１，２のイベント処理部４５，４９は、記録の完了を他方のコアに通知する。通知を取得したコア１，２のイベント処理部４５，４９はフラグをオンに設定するなどして、他方のコアがイベント発生によるコードブロックアドレスの記録を終了したことを記録する。他方のコアのイベント処理部４５，４９は、イベント発生によるコードブロックアドレスの記録を終了するとフラグを参照して記録を停止してよいか否かを判定する。記録を停止してよいと判定した場合、イベント処理部４５，４９はシングルコアの場合と同様に記録を停止する。【００６５】
以上により、図１０のリングバッファ４０に示すように、イベント発生によるコードブロックアドレスと実行ポインタが「コア１イベント発生：コア１ 0x40、コア２ 0x09」「コア２イベント発生：コア１ 0x50、コア２ 0x11」のように記録される。【００６６】
解析時には、車両メーカやディーラのサービスマンが外部ツールによりリングバッファ４０を読み出す。リングバッファ４０に「イベント発生」と記録されているアドレスの次のアドレスからアドレス順にコードブロックアドレスを読み出し、最後のアドレスまで到達したら先頭に戻り「イベント発生」のアドレスまでリングバッファ４０の記録内容を読み出すことで、コア１とコア２の実行履歴が得られる。なお、「イベント発生」という情報が記録されていなくても、サービスマンや外部ツールはポインタ４１が指示するアドレスによりイベント発生時のコードブロックアドレスが記録されたアドレスを特定できる。【００６７】
サービスマン等はコア１とコア２のプログラム２０の実行履歴を精査し、プログラム２０が予定された順に実行されているか否かや、想定外の実行履歴がないか否かなどを判断する。このような判断により、イベント発生がプログラム２０によるものなのかそうでないかの峻別が可能になり、イベント発生の原因の特定精度を向上させ又は特定までの時間を短縮できる。【００６８】
〔アドレス以外に記憶することが有効な情報〕
コア１とコア２がリングバッファ４０に記憶する情報としてコードブロックアドレスと実行ポインタを例示したが、イベント発生の原因を特定するため以下の情報をコードブロックアドレス及び実行ポインタと共に記憶してもよい。  
(i)  コア１とコア２の汎用レジスタ、フラグ、スタックポインタ、入力値
コア１、コア２は種々のレジスタを備えている。汎用レジスタだけでなく、フラグやスタックポインタもレジスタの一種である。汎用レジスタには演算中の値（作業中のデータの保存のために一時的に記憶される）が格納されるので、コードブロックアドレスと共にこの値を記憶しておくことで、サービスマン等は、演算結果がイベント発生に影響したか否か等を推測することが可能になる。【００６９】
フラグは、ＣＰＵ１、２が特定の命令を実行した際の実行結果を示す値が格納される。例えば、桁あふれした場合はオーバーフローフラグが、演算結果がゼロになった場合にはゼロフラグが、演算結果が負の値になった場合にはＳＦフラグが、それぞれ「１」に設定される。したがって、コードブロックアドレスと共にこの値を記憶しておくことで、サービスマン等は、演算結果が不測の値になったことがイベント発生に影響したか否か等を推測することが可能になる。【００７０】
スタックには関数が実行された際の、レジスタの内容、関数のアドレス、引数、変数などが格納されるが、この関数が別の関数を呼び出すような場合、スタックには呼び出された関数のレジスタの内容、関数のアドレス、引数、変数などが格納される。スタックポインタは、これらの情報の最新の格納位置を示す。したがって、コードブロックアドレスと共にスタックポインタを記憶しておくことで、サービスマン等がその推移から実行履歴を検証することが可能になる。【００７１】
入力値は、例えば、Ｉ／Ｏ２２から入力されたセンサの検出値、他の電子制御装置から受信したデータなどである。入力値は例えばＳＤＲＡＭ１６、ＲＡＭ１，ＲＡＭ２に記憶されているかコア１又はコア２に記憶されている。入力値は演算対象となるものなので、コードブロックアドレスと共にこの値を記憶しておくことで、サービスマン等は演算の対象として入力値が適当であったかな否かを検証することが可能になる。【００７２】
(ii)  分岐先の情報
コードブロックアドレスは分岐元のアドレスであるが、分岐先のアドレスも記録すれば実行履歴をより詳細に記録できたことになる。分岐先のアドレスは例えば「Jmp a ELSE_STATE1」のようにオペランドに記述されている。したがって、コア１，２が「Call SAVE_Log」を実行することにより、実行ポインタだけでなく実行ポインタの命令のオペランドを読み出してコードブロックアドレスと共に記録すればよい。【００７３】
また、分岐先に再度、「Call SAVE_Log」を記述しておき、分岐先においてコアが「Call SAVE_Log」を実行することで、ＰＣに記憶された実行ポインタを読み出せば分岐先のアドレスを記憶することができる。【００７４】
〔割込みについて〕
コア１又はコア２が互いに割り込みしたり、不図示の他のコアからコア１又はコア２が割込みを受ける場合がある。割込み発生時はＩＮＴ１、２が割込み内容（割り込みベクター）に応じて割り込みハンドラを起動して所定の処理を実行するので、割込み発生時も実行する命令のアドレスが大きく変化することになる。しかし、条件分岐命令と違いコア１又はコア２にとっていつ割込みが発生するかは予測が困難である。【００７５】
このため、割込み発生時にコードブロックアドレスを記録するには以下のよう方法がある。
・プログラムバイナリコード３２の所定ステップ毎に「Call SAVE_Log」を記述する。
すなわち、いつ割込みが発生しても所定ステップ以内に割込みの直前のコードブロックアドレスを記録することができる。しかし、「Call SAVE_Log」が多くなるとオーバーヘッドになるので、どのくらいのステップ数の間隔で記述するかは最適化することが好ましい。
・割込みハンドラが起動するプログラムに「Call SAVE_Log」を記述する
割込みの発生時、ＰＣ等を含むコンテキストはスタックされているので、割込みの発生後に起動されるプログラムはスタックポインタにより割込み発生時のコンテキストを参照できる。コンテキストにはＰＣの値が記憶されるので、コア１やコア２は割込み発生時の実行ポインタを記憶することができる。【００７６】
〔マルチプロセッサマイコンの場合〕
上記では、１つのプロセッサが複数のコア又はＣＰＵを有する態様を説明したが、１つ以上のコア又はＣＰＵを有する複数のプロセッサが搭載された態様でも、本実施形態の実行履歴の記録方法は有効である。【００７７】
図１１は、マルチプロセッサマイコンの構成図の一例を示す。プロセッサ１とプロセッサ２がバスを介して接続されている。プロセッサ１、２は1つ以上のコア又はＣＰＵを有していればよい。プロセッサ１はプロセッサ１用のリングバッファ４０を有し、プロセッサ２はプロセッサ２用のリングバッファ４０を有している。リングバッファ４０を別々にしたのは、メモリの共有の自由度を考慮したためで、いずれか一方のリングバッファ４０を共有してもよい。【００７８】
これまで説明したように条件分岐命令の手前に「SAVE_Log」が記述されており、「SAVE_Log」が実行されることによりコードブロックアドレスと実行ポインタが対応づけて記録される。プロセッサ１と２はＤＭＡＣやデバッグポートなどのプロセッサ間通信手段を利用して通信する。これにより、プロセッサ１はプロセッサ２のＰＣの値を、プロセッサ２はプロセッサ１のＰＣの値を、それぞれ取得することができる。【００７９】
また、図１１では、リングバッファ４０を別々にしたため、各プロセッサがＰＣ応答タスク１，２を有する。ＰＣ応答タスク１，２は相手のプロセッサが「SAVE_Log」を実行した際に、自機のプロセッサの実行ポイントを記録するタスクである。【００８０】
図１２は２つのプロセッサ１，２がそれぞれリングバッファ４０へコードブロックアドレスを記憶する手順を説明するフローチャート図の一例である。図１２の処理は図９の処理とステップＳ４０において異なる。【００８１】
・図１２（ａ）のＳ４０１
プロセッサ１が実行する命令が「Call SAVE_Log」に到達すると、自コア実行ポイント取得部４２はコードブロックアドレスとなる実行ポイントを取得する。自コア実行ポイント取得部４２は例えば「0x40」というコードブロックアドレスを取得し、リングバッファ記録部４４に通知する。【００８２】
次に、プロセッサ１の他コア実行ポイント取得部４３は、ＤＭＡ通信などを利用してプロセッサ２に実行ポイントを問い合わせ、プロセッサ２の実行ポイントを取得する。プロセッサ２が「0x09」のアドレスの命令を実行していると仮定すると、他コア実行ポイント取得部４３は「0x09」というアドレスを取得し、リングバッファ記録部４４に通知する。【００８３】
リングバッファ記録部４４は、ポインタ４１の指示するリングバッファ４０のアドレスに、プロセッサ1のコードブロックアドレスとプロセッサ２の実行ポインタを対応づけて（１対に）記憶する。以上により、図１１のプロセッサ１のリングバッファ４０に示すように、「プロセッサ１条件分岐：プロセッサ１ 0x40、プロセッサ２ 0x09」と記録される。【００８４】
さらに、プロセッサ２は、プロセッサ１の他コア実行ポイント取得部４３から実行ポイントの問い合わせを受けることで割込みを発生させ、ＰＣ応答タスク２を実行する。まず、プロセッサ２のＰＣ応答タスク２は、ＰＣの値である実行ポイントを取得する。また、ＰＣ応答タスク２は、ＤＭＡ通信などを利用してプロセッサ１に実行ポイントを問い合わせ、プロセッサ１の実行ポイントを取得する。この実行ポイントはコードブロックアドレスと等しいかその周辺のアドレスとなる。この問い合わせを省略するため、プロセッサ１の他コア実行ポイント取得部４３が実行ポイントの問い合わせる際に実行ポイント（この場合はコードブロックアドレスと等しい）をプロセッサ２に通知してもよい。【００８５】
そして、プロセッサ２のＰＣ応答タスク２は、リングバッファ４０にプロセッサ1のコードブロックアドレスとプロセッサ２の実行ポインタを対応づけて記憶する。以上により、図１１のプロセッサ２のリングバッファ４０に示すように、「プロセッサ１条件分岐：プロセッサ１ 0x40、プロセッサ２ 0x09」と記録される。すなわち、リングバッファ４０の複製が得られるので、プロセッサ１と２がリングバッファ４０を共有する場合と同じ情報が得られる。【００８６】
なお、イベント発生時の実行履歴の記録についても同様に、プロセッサ１と２が同じ（又はほぼ同じ）実行履歴をそれぞれリングバッファ４０に記憶する（Ｓ５０１）。【００８７】
・図１２（ｂ）のＳ４０１
プロセッサ２が起点となる以外は、図１２（ａ）のＳ４０１と同様である。ただし、条件分岐命令を実行したのがプロセッサ２なので、実行履歴はプロセッサ１，２のどちらにおいても例えば「プロセッサ２条件分岐：プロセッサ１ 0x50、プロセッサ２ 0x11」と記録される。【００８８】
以上のように、プロセッサ１が「SAVE_Log」を実行するとプロセッサ１と２が同じ（又はほぼ同じ）実行履歴をそれぞれリングバッファ４０に記憶し、プロセッサ２が「SAVE_Log」を実行するとプロセッサ１と２が同じ（又はほぼ同じ）実行履歴をそれぞれリングバッファ４０に記憶する。【００８９】
このように、プロセッサ１，２のどちらが「SAVE_Log」を実行してもそれぞれが同じ実行履歴を記録するので、マルチプロセッサマイコンにおいても、プロセッサ１と２の命令の実行経路だけでなく、プロセッサ１と２の相対的な命令の実行順序が明らかになる。【００９０】
以上のように、１つのプロセッサ内だけでなく複数のプロセッサが搭載されたマルチプロセッサにおいて、互いの実行履歴を対応づけて記録することができる。なお、プロセッサが３つ以上ある場合、全てのプロセッサが同じ実行履歴を記録することになるだけであり実行手順はプロセッサが２つの場合と同様である。【００９１】
〔別の形態〕
プログラム２０を実行するコア１やコア２が実行履歴を記憶すると、上記のように「Call SAVE_Log」など実行履歴を記録するための命令をプログラム２０に予め埋め込んでおく必要が生じる。これは、コア１、コア２がプログラム２０を実行しながら条件分岐命令を実行するか否かを判定すると仮定すると、全ステップを実行する毎に１つ先の命令が条件分岐命令か否かを判定する必要が生じるためである。【００９２】
しかし、プログラム２０を実行するコア１やコア２とは別に、実行履歴を記憶するコア３を設けることで、「Call SAVE_Log」など実行履歴を記録するための命令をプログラム２０に予め埋め込んでおく必要性を低減できる。【００９３】
図１３は、プロセッサ１００のハードウェア構成図の一例を示す。図１３において図２と同一部の説明は省略する。コア３のＩＮＴ３は、ＩＮＴ１及びＩＮＴ２と接続されている。コア３は制御などのためのプログラム２０の実行を受け持たず、実行履歴を記録する専用の実行履歴記録プログラムを実行する。【００９４】
図１４は、コア３の実行履歴プログラムが実行履歴を記録する手順を示すフローチャート図の一例である。コア３は、実行履歴プログラムを実行することで実現される命令監視部、実行ポイント取得部、リングバッファ記録部、及び、イベント処理部を有する。【００９５】
命令監視部は、コア１及びコア２のＰＣが更新される毎にそれぞれの命令バッファ（又は命令デコーダ）の値をＩＮＴ１〜３を介して取得し、コア１又はコア２が実行する命令がＪｍｐなど予め登録されている（条件分岐命令一覧３１と同じもの）命令と一致するか否かを監視している（Ｓ１１０）。一致する場合は、実行ポイント取得部に通知する。【００９６】
実行ポイント取得部は、条件分岐命令を実行したコア１又はコア２にコードブロックアドレスを要求し、他方のコアに実行ポインタを要求する（Ｓ１２０）。【００９７】
リングバッファ記録部は、コア１又はコア２から取得したコードブロックアドレス及び実行ポインタをリングバッファ４０に記憶する（Ｓ１３０）。こうすることで、コア１とコア２のどちらが条件分岐命令を実行しても、コア３がコア１及びコア２のコードブロックアドレスと実行ポインタを記録できる。なお、どちらかのコアが条件分岐命令を実行したかも記録される。【００９８】
なお、イベントが発生した場合のイベント処理部の処理はコアが２つの場合と同様であり、イベント発生を検出すると（Ｓ１４０）、イベント処理部はコア１とコア２に実行ポインタを要求し（Ｓ１５０）、互いに対応づけてリングバッファ４０に記憶し（Ｓ１６０）、その後、記録を停止する（Ｓ１７０）。【００９９】
したがって、３つめのコア３をＥＤＲ専用にすることで作成プログラム３０がプログラム２０に「Call SAVE_Log」を埋め込む必要がなくなり開発コストを低減できる。【０１００】
〔３つ以上のコアのプロセッサ１００について〕
上記ではコアが２つの場合を例に説明したが、プロセッサ１００がコア１，２以外にコアを有する場合がある。しかしながら、コアが３つ以上存在しても、各コアの処理手順は大きく変わらない。すなわち、コア３が「Call SAVE_Log」を実行すると、コア３の自コア実行ポイント取得部は自コアのアドレスを取得し、他コア実行ポイント取得部は、コア１とコア２から実行ポイントを取得する。コア３のリングバッファ記録部は、ポインタ４１の指示するリングバッファ４０のアドレスに、コア３のコードブロックアドレスとコア１，２の実行ポイントを対応づけて記憶する。コア１，２についても同様である。【０１０１】
また、一方で、コアが３つ以上存在しても、例えばコア３がコア１，２と関係のない処理を実行している場合、コア１，２がコア３の実行ポイントを実行する必要がない。例えば、コア１，２とコア３が全く通信しない（ＩＮＴ１３を有さない）場合、コア１，２がＳＭＰなのに対しコア３はＡＭＰのような場合、又は、コア１，２とコア３が処理上互いに全く影響しない（互いに演算結果を利用しない、プログラム1とプログラム２に実行順依存関係がない、プログラム1とプログラム２が同期を取ることがない等）プログラムを実行しているような場合、である。【０１０２】
このような場合、コア３がコア１，２の検出するイベントに影響する可能性が低いのでコア１，２がコア３の実行履歴を記録する必要性が小さい。【０１０３】
以上説明したように、本実施形態のプロセッサ１００は、複数のコアがそれぞれプログラムを実行した際の実行履歴をコア間の命令の実行順を特定できるように記録することができる。また、一まとまりのコードブロックをより少ないコードブロックアドレスにより記録することができ、効率的に実行履歴を記録できる。
【図１】
2012070137.tif 000003
【図２】
2012070137.tif 000004
【図３】
2012070137.tif 000005
【図４】
2012070137.tif 000006
【図５】
2012070137.tif 000007
【図６】
2012070137.tif 000008
【図７】
2012070137.tif 000009
【図８】
2012070137.tif 000010
【図９】
2012070137.tif 000011
【図１０】
2012070137.tif 000012
【図１１】
2012070137.tif 000013
【図１２】
2012070137.tif 000014
【図１３】
2012070137.tif 000015
【図１４】
2012070137.tif 000016
【手続補正書】
【提出日】平成23年4月8日(2011.4.8)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
複数のコアがそれぞれプログラムを実行するプロセッサであって、
第１コアがプログラムの実行履歴記録ポイントに記述された実行履歴記録命令を実行した場合、前記第１コアが実行する一連の命令を１つのアドレスで指示する第１のコードブロック情報を取得する第１の自コア実行ポイント取得手段と、
前記第１コアが前記実行履歴記録命令を実行した場合、第２コアが実行している命令の第１の実行アドレス情報を取得する第１の他コア実行ポイント取得手段と、
前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報を対応づけて共有メモリに時系列に記憶する第１の実行ポイント情報記録手段と、
前記第２コアが前記実行履歴記録命令を実行した場合、前記第２コアが実行する一連の命令を１つのアドレスで指示する第２のコードブロック情報を取得する第２の自コア実行ポイント取得手段と、
前記第２コアが前記実行履歴記録命令を実行した場合、前記第１コアが実行している命令の第２の実行アドレス情報を取得する第２の他コア実行ポイント取得手段と、
前記実行履歴記録命令を実行したコアの識別情報、前記第２のコードブロック情報及び前記第２の実行アドレス情報を対応づけて前記共有メモリに時系列に記憶する第２の実行ポイント情報記録手段と、
を有するプロセッサ。
【請求項２】
（削除）
【請求項３】
前記共有メモリは、前記第１のコア及び前記第２のコアが、前記共有メモリのアドレス順に、前記第１のコードブロック情報と前記第１の実行アドレス情報、又は、前記第２のコードブロック情報と前記第２の実行アドレス情報を書き込むリングバッファである、
ことを特徴とする請求項１記載のプロセッサ。
【請求項４】
予め定められた事象の発生を検出した場合、前記第１の実行ポイント情報記録手段又は前記第２の実行ポイント情報記録手段は、前記共有メモリに、前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報、又は、前記実行履歴記録命令を実行したコアの識別情報、前記第２のコードブロック情報及び前記第２の実行アドレス情報を記録することを停止する、
ことを特徴とする請求項３記載のプロセッサ。
【請求項５】
前記第１の実行ポイント情報記録手段は、前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報に加え、前記第１コアの汎用レジスタの値、フラグレジスタの値、スタックポインタの値、又は、入力インターフェースを介して取得した入力値、の１つ以上を前記共有メモリに時系列に記憶する、
ことを特徴とする請求項１項記載のプロセッサ。
【請求項６】
前記第１の実行ポイント情報記録手段は、前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報に加え、前記第１コアが前記実行履歴記録命令の次の命令を実行することで移動する移動先のアドレス情報を、前記共有メモリに時系列に記憶する、ことを特徴とする請求項１記載のプロセッサ。
【請求項７】
前記実行履歴記録ポイントは、条件分岐命令又はサブルーチンコール命令の直前のステップである、ことを特徴とする請求項１記載のプロセッサ。
【請求項８】
前記実行履歴記録ポイントは、一まとまりの機能を提供する一連の命令の終わり又は始まりの命令の直前のステップである、ことを特徴とする請求項１記載のプロセッサ。
【請求項９】
前記事象はエアバッグの展開である、ことを特徴とする請求項４記載のプロセッサ。
【請求項１０】
請求項１記載のプロセッサが搭載された車両用の電子制御ユニット。
【請求項１１】
請求項１記載の前記プログラムを作成する作成プログラムであって、ＣＰＵに
前記プログラムのバイナリコードを読み出すステップと、
条件分岐命令一覧に登録された条件分岐命令のいずれかに一致する前記バイナリコードの命令のアドレスを抽出する抽出処理ステップと、
前記第１の自コア実行ポイント取得手段、前記第１の他コア実行ポイント取得手段、及び、前記第１の実行ポイント情報記録手段、に対応する命令又は呼び出す命令を、前記抽出処理ステップで抽出したアドレスの直前に記述するコード埋め込みステップと、
を実行させる作成プログラム。
【請求項１２】
（削除）
【請求項１３】
（削除）
【請求項１４】
複数のコアがそれぞれプログラムを実行するプロセッサであって、
第１コア及び第２コアが実行する命令が、予め登録された命令と一致するか否かを判定する命令監視手段と、
前記第１コアが実行する命令が予め登録された命令と一致する場合、前記第１コアが実行する一連の命令を１つのアドレスで指示する第１のコードブロック情報及び前記第２コアが実行している命令の第１の実行アドレス情報を取得し、
前記第２コアが実行する命令が予め登録された命令と一致する場合、前記第２コアが実行する一連の命令を１つのアドレスで指示する第２のコードブロック情報及び前記第１コアが実行している命令の第２の実行アドレス情報、を取得する実行ポイント取得手段と、
前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報、又は、前記実行履歴記録命令を実行したコアの識別情報、前記第２のコードブロック情報及び前記第２の実行アドレス情報を、それぞれ対応づけて共有メモリに時系列に記憶する実行ポイント情報記録手段と、
を有することを特徴とするプロセッサ。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０００２
【補正方法】変更
【補正の内容】
【０００２】
方式が開示されている。
［０００５］
ところで、近年、車載される電子制御装置の数を抑制しようとそれまでは複数の電子制御装置に分散されていた機能を１つの電子制御装置に集約する試みがある。また、電子制御装置のＣＰＵも一般のコンピュータと同様にマルチコア化が図られるようになってきている。すると、１つのＣＰＵ内の複数のコアが別々にプログラムを実行することになる。このような状況でイベントが発生すると、複数のコアのプログラムの分岐アドレスを別々に記憶するだけでは、イベントの発生に関連する不具合等の特定が困難であるという問題がある。すなわち、コアＡが実行する命令Ａ、コアＢが実行する命令Ｂの実行履歴が別々に記録されていると、命令Ａと命令Ｂの相対的な実行順序が分からないので、解析が困難になる。
［先行技術文献］
［特許文献］
［０００６］
［特許文献１］特開昭６３−２５７０３９号公報
［特許文献２］特開昭６１−２９０５４６号公報
［発明の開示］
［発明が解決しようとする課題］
［０００７］
本発明は、上記課題に鑑み、マルチコア又はマルチＣＰＵ型のＣＰＵが搭載されたプロセッサにおいて、イベント発生の解析に有効な実行履歴を記録できるプロセッサを提供することを目的とする。
［課題を解決するための手段］
［０００８］
本発明は、複数のコアがそれぞれプログラムを実行するプロセッサであって、第１コアがプログラムの実行履歴記録ポイントに記述された実行履歴記録命令を実行した場合、前記第１コアが実行する一連の命令を１つのアドレスで指示する第１のコードブロック情報を取得する第１の自コア実行ポイント取得手段と、前記第１コアが前記実行履歴記録命令を実行した場合、第２コアが実行している命令の第１の
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】０００３
【補正方法】変更
【補正の内容】
【０００３】
実行アドレス情報を取得する第１の他コア実行ポイント取得手段と、前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報を対応づけて共有メモリに時系列に記憶する第１の実行ポイント情報記録手段と、前記第２コアが前記実行履歴記録命令を実行した場合、前記第２コアが実行する一連の命令を１つのアドレスで指示する第２のコードブロック情報を取得する第２の自コア実行ポイント取得手段と、前記第２コアが前記実行履歴記録命令を実行した場合、前記第１コアが実行している命令の第２の実行アドレス情報を取得する第２の他コア実行ポイント取得手段と、前記実行履歴記録命令を実行したコアの識別情報、前記第２のコードブロック情報及び前記第２の実行アドレス情報を対応づけて前記共有メモリに時系列に記憶する第２の実行ポイント情報記録手段と、を有する。
［０００９］
発明の効果
マルチコア又はマルチＣＰＵ型のＣＰＵが搭載されたプロセッサにおいて、イベント発生の解析に有効な実行履歴を記録できるプロセッサを提供することができる。
［図面の簡単な説明］
［００１０］
［図１］本実施形態のプロセッサによる実行履歴の記憶を模式的に説明する図の一例である。
［図２］プロセッサのハードウェア構成図の一例である。
［図３］プログラムへの発生要因記憶プログラムの埋め込み方法を説明する図の一例である。
［図４］プログラムバイナリコードの一部の一例を示す図である。
［図５］コードブロックアドレス一覧の一例を示す図である。
［図６］発生要因記憶プログラムが埋め込まれたプログラムバイナリコードの一例を示す図である。
［図７］シングルコアの場合のプログラムが実行履歴を記憶する手順を示すフローチャート図の一例である。
［図８］各コアの機能ブロック図の一例である。
［図９］マルチコアの場合のプログラムが実行履歴を記憶する手順を示すフローチャート図の一例である。
［図１０］２つのコアによる１つのリングバッファへのコードブロックアドレスの記憶を模式的に説明する図の一例である。
［図１１］マルチプロセッサマイコンの構成図の一例を示す。
［図１２］２つのプロセッサ１，２がそれぞれリングバッファ４０のコードブロックアドレスに記憶する手順を説明するフローチャート図の一例である
［図１３］プロセッサのハードウェア構成図の一例を示す。
【手続補正書】
【提出日】平成25年12月13日(2013.12.13)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
複数のコアがそれぞれプログラムを実行するプロセッサであって、
第１コアがプログラムの実行履歴記録ポイントに記述された実行履歴記録命令を実行した場合、前記第１コアが実行する一連の命令を１つのアドレスで指示する第１のコードブロック情報を取得する第１の自コア実行ポイント取得手段と、
前記第１コアが前記実行履歴記録命令を実行した場合、第２コアが実行している命令の第１の実行アドレス情報を取得する第１の他コア実行ポイント取得手段と、
前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報を対応づけて共有メモリに時系列に記憶する第１の実行ポイント情報記録手段と、
前記第２コアが前記実行履歴記録命令を実行した場合、前記第２コアが実行する一連の命令を１つのアドレスで指示する第２のコードブロック情報を取得する第２の自コア実行ポイント取得手段と、
前記第２コアが前記実行履歴記録命令を実行した場合、前記第１コアが実行している命令の第２の実行アドレス情報を取得する第２の他コア実行ポイント取得手段と、
前記実行履歴記録命令を実行したコアの識別情報、前記第２のコードブロック情報及び前記第２の実行アドレス情報を対応づけて前記共有メモリに時系列に記憶する第２の実行ポイント情報記録手段と、を有するプロセッサ。
【請求項２】
前記共有メモリは、前記第１コア及び前記第２コアが、前記共有メモリのアドレス順に、前記第１のコードブロック情報と前記第１の実行アドレス情報、又は、前記第２のコードブロック情報と前記第２の実行アドレス情報を書き込むリングバッファである、
ことを特徴とする請求項１記載のプロセッサ。
【請求項３】
予め定められた事象の発生を検出した場合、前記第１の実行ポイント情報記録手段又は前記第２の実行ポイント情報記録手段は、前記共有メモリに、前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報、又は、前記実行履歴記録命令を実行したコアの識別情報、前記第２のコードブロック情報及び前記第２の実行アドレス情報を記録することを停止する、
ことを特徴とする請求項２記載のプロセッサ。
【請求項４】
前記第１の実行ポイント情報記録手段は、前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報に加え、前記第１コアの汎用レジスタの値、フラグレジスタの値、スタックポインタの値、又は、入力インターフェースを介して取得した入力値、の１つ以上を前記共有メモリに時系列に記憶する、
ことを特徴とする請求項１項記載のプロセッサ。
【請求項５】
前記第１の実行ポイント情報記録手段は、前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報に加え、前記第１コアが前記実行履歴記録命令の次の命令を実行することで移動する移動先のアドレス情報を、前記共有メモリに時系列に記憶する、ことを特徴とする請求項１記載のプロセッサ。
【請求項６】
前記実行履歴記録ポイントは、条件分岐命令又はサブルーチンコール命令の直前のステップである、ことを特徴とする請求項１記載のプロセッサ。
【請求項７】
前記実行履歴記録ポイントは、一まとまりの機能を提供する一連の命令の終わり又は始まりの命令の直前のステップである、ことを特徴とする請求項１記載のプロセッサ。
【請求項８】
前記事象はエアバッグの展開である、ことを特徴とする請求項３記載のプロセッサ。
【請求項９】
請求項１記載のプロセッサが搭載された車両用の電子制御ユニット。
【請求項１０】
請求項１記載の前記プログラムを作成する作成プログラムであって、ＣＰＵに
前記プログラムのバイナリコードを読み出すステップと、
条件分岐命令一覧に登録された条件分岐命令のいずれかに一致する前記バイナリコードの命令のアドレスを抽出する抽出処理ステップと、
前記第１の自コア実行ポイント取得手段、前記第１の他コア実行ポイント取得手段、及び、前記第１の実行ポイント情報記録手段、に対応する命令又は呼び出す命令を、前記抽出処理ステップで抽出したアドレスの直前に記述するコード埋め込みステップと、
を実行させる作成プログラム。
【請求項１１】
複数のコアがそれぞれプログラムを実行するプロセッサであって、
第１コア及び第２コアが実行する命令が、予め登録された命令と一致するか否かを判定する命令監視手段と、
前記第１コアが実行する命令が予め登録された命令と一致する場合、前記第１コアが実行する一連の命令を１つのアドレスで指示する第１のコードブロック情報及び前記第２コアが実行している命令の第１の実行アドレス情報を取得し、
前記第２コアが実行する命令が予め登録された命令と一致する場合、前記第２コアが実行する一連の命令を１つのアドレスで指示する第２のコードブロック情報及び前記第１コアが実行している命令の第２の実行アドレス情報、を取得する実行ポイント取得手段と、
プログラムの実行履歴記録ポイントに記述された実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報、又は、前記実行履歴記録命令を実行したコアの識別情報、前記第２のコードブロック情報及び前記第２の実行アドレス情報を、それぞれ対応づけて共有メモリに時系列に記憶する実行ポイント情報記録手段と、
を有することを特徴とするプロセッサ。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０００８
【補正方法】変更
【補正の内容】
【０００８】
上記課題に鑑み、本発明は、複数のコアがそれぞれプログラムを実行するプロセッサであって、第１コアがプログラムの実行履歴記録ポイントに記述された実行履歴記録命令を実行した場合、前記第１コアが実行する一連の命令を１つのアドレスで指示する第１のコードブロック情報を取得する第１の自コア実行ポイント取得手段と、前記第１コアが前記実行履歴記録命令を実行した場合、第２コアが実行している命令の第１の実行アドレス情報を取得する第１の他コア実行ポイント取得手段と、前記実行履歴記録命令を実行したコアの識別情報、前記第１のコードブロック情報及び前記第１の実行アドレス情報を対応づけて共有メモリに時系列に記憶する第１の実行ポイント情報記録手段と、前記第２コアが前記実行履歴記録命令を実行した場合、前記第２コアが実行する一連の命令を１つのアドレスで指示する第２のコードブロック情報を取得する第２の自コア実行ポイント取得手段と、前記第２コアが前記実行履歴記録命令を実行した場合、前記第１コアが実行している命令の第２の実行アドレス情報を取得する第２の他コア実行ポイント取得手段と、前記実行履歴記録命令を実行したコアの識別情報、前記第２のコードブロック情報及び前記第２の実行アドレス情報を対応づけて前記共有メモリに時系列に記憶する第２の実行ポイント情報記録手段と、を有することを特徴とする。
【国際調査報告】
2012070137.tif 000017
2012070137.tif 000018
2012070137.tif 000019
2012070137.tif 000020