(57)【要約】【課題】待ち時間の記録のためのオーバーヘッドを減らすことができる。【解決手段】電子制御装置は、複数のＣＰＵコアと、共有資源とを備える電子制御装置であって、ＣＰＵコアのそれぞれは排他制御により共有資源を独占して使用可能であり、カウンタ値が格納される更新カウンタ格納部と、ＣＰＵコアが実行したプログラムのログが格納されるログ格納部と、ＣＰＵコアが共有資源にアクセスしたときに、カウンタ値を変化させるカウンタ更新部と、ＣＰＵコアが共有資源にアクセスしたときに、共有資源が他のＣＰＵコアにより排他制御されていない場合には、カウンタ値を含むログをログ格納部に記録するカウンタ記録部とをさらに備える。【選択図】図１
2018036864.tif 000002
【特許請求の範囲】
【請求項１】
複数のＣＰＵコアと、共有資源とを備える電子制御装置であって、
前記ＣＰＵコアのそれぞれは排他制御により前記共有資源を独占して使用可能であり、
カウンタ値が格納される更新カウンタ格納部と、
前記ＣＰＵコアが実行したプログラムのログが格納されるログ格納部と、
前記ＣＰＵコアが前記共有資源にアクセスしたときに、前記カウンタ値を変化させるカウンタ更新部と、
前記ＣＰＵコアが前記共有資源にアクセスしたときに、前記共有資源が他のＣＰＵコアにより排他制御されていない場合には、前記カウンタ値を含む前記ログを前記ログ格納部に記録するカウンタ記録部とをさらに備える電子制御装置。
【請求項２】
請求項１に記載の電子制御装置であって、
前記カウンタ更新部は、前記ＣＰＵコアが前記共有資源にアクセスしたときに前記共有資源が他のＣＰＵにより排他制御されている場合に、前記カウンタ値を変化させる電子制御装置。
【請求項３】
請求項１に記載の電子制御装置であって、
前記カウンタ更新部は、前記ＣＰＵコアが前記共有資源にアクセスして所定の処理単位を実行する毎に、前記カウンタ値を変化させる電子制御装置。
【請求項４】
請求項１に記載の電子制御装置であって、
時刻情報を保持するタイマを更に備え、
前記カウンタ記録部は、前記ＣＰＵコアが前記共有資源に一回目にアクセスしたときに、前記共有資源が他のＣＰＵコアにより排他制御されている場合は、時刻情報を前記タイマから取得し、前記時刻情報をさらに含む前記ログを前記ログ格納部に格納する電子制御装置。
【請求項５】
請求項１に記載の電子制御装置であって、
前記共有資源は、前記ＣＰＵコアが実行している処理を識別する識別情報を格納する識別情報格納部を備え、
前記カウンタ記録部は、前記ＣＰＵコアが二回目以降のアクセスで前記共有資源を排他制御した場合に、前記識別情報格納部から前記識別情報を取得し、前記識別情報をさらに含む前記ログを前記ログ格納部に格納する電子制御装置。
【請求項６】
請求項５に記載の電子制御装置であって、
前記カウンタ更新部は、前記ＣＰＵコアが前記共有資源を排他制御した場合に、前記ＣＰＵコアが実行している処理に基づき前記識別情報格納部の前記識別情報を更新する電子制御装置。
【請求項７】
請求項１から請求項６までのいずれか一項に記載の電子制御装置であって、
前記カウンタ値を時間に換算するための換算情報を格納する記憶部と、
前記換算情報を用いて前記カウンタ値を実時間に換算する解析部と、を備える電子制御装置。
【請求項８】
請求項１から請求項６までのいずれか一項に記載の電子制御装置と、解析装置と、を備える解析システムであって、
前記解析装置は、
前記電子制御装置の前記ログ格納部に格納された前記ログが入力されるログ収集部と、
前記カウンタ値を実時間に換算するための換算情報を格納する記憶部と、
前記換算情報を用いて、前記ログ収集部に入力された前記カウンタ値を実時間に換算する解析部と、を備える解析システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、電子制御装置、および解析システムに関する。
【背景技術】
【０００２】
複数のＣＰＵが協調して動作する電子制御装置においては、複数のＣＰＵが共有する資源へのアクセスの排他制御が必要になる。あるＣＰＵが共有資源を使用している場合は、他のＣＰＵは先のＣＰＵの使用が完了するまでは共有資源を使用できず、待ち時間が生じる。この待ち時間の発生は、電子制御装置の処理能力を低下させるため、待ち時間を生じさせないことが望ましい。そのためには待ち時間の原因の解析が必要であり、解析のために待ち時間をログとして記録することが求められる。
特許文献１には、時刻レジスタにアクセスし、現在時刻と取得した時刻との差分として待ち時間を算出する手法が開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】国際公開第２０１２／１３２０１７号
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１に記載されている発明では、待ち時間の記録のためのオーバーヘッドが大きい。
【課題を解決するための手段】
【０００５】
本発明の第１の態様による電子制御装置は、複数のＣＰＵコアと、共有資源とを備える電子制御装置であって、前記ＣＰＵコアのそれぞれは排他制御により前記共有資源を独占して使用可能であり、カウンタ値が格納される更新カウンタ格納部と、前記ＣＰＵコアが実行したプログラムのログが格納されるログ格納部と、前記ＣＰＵコアが前記共有資源にアクセスしたときに、前記カウンタ値を変化させるカウンタ更新部と、前記ＣＰＵコアが前記共有資源にアクセスしたときに、前記共有資源が他のＣＰＵコアにより排他制御されていない場合には、前記カウンタ値を含む前記ログを前記ログ格納部に記録するカウンタ記録部とをさらに備える。
本発明の第２の態様による解析システムは、第１の態様の電子制御装置と、解析装置と、を備え、前記解析装置は、前記電子制御装置の前記ログ格納部に格納された前記ログが入力されるログ収集部と、前記カウント値を実時間に換算するための換算情報を格納する記憶部と、前記換算情報を用いて、前記ログ収集部に入力された前記カウンタ値を実時間に換算する解析部と、を備える。
【発明の効果】
【０００６】
本発明によれば、待ち時間の記録のためのオーバーヘッドを減らすことができる。
【図面の簡単な説明】
【０００７】
【図１】解析システムの構成を示す図
【図２】電子制御装置の動作例を示す図
【図３】第１バッファの一例を示す図
【図４】第２バッファの一例を示す図
【図５】時間変換テーブルの一例を示す図
【図６】解析結果の一例を示す図
【図７】電子制御装置の動作を表すフローチャート
【図８】ログ解析の動作を表すフローチャート
【図９】第２の実施の形態における電子制御装置の構成を示す図
【図１０】第２の実施の形態における電子制御装置の動作を表すフローチャート
【図１１】第３の実施の形態における第１バッファの一例を示す図
【図１２】第３の実施の形態における時間変換テーブルの一例を示す図
【図１３】第３の実施の形態における電子制御装置の動作を表すフローチャート
【発明を実施するための形態】
【０００８】
（第１の実施の形態）
以下、図１〜図８を参照して、電子制御装置の第１の実施の形態を説明する。
図１は、本発明に係る電子制御装置１００、および解析システム１の構成を示す図である。解析システム１は、電子制御装置１００と、解析装置２００とから構成される。
【０００９】
電子制御装置１００は、たとえばＥＣＵ（ＥｌｅｃｔｒｏｎｉｃＣｏｎｔｒｏｌ Ｕｎｉｔ）である。電子制御装置１００は、第１ＣＰＵ１６０と、第２ＣＰＵ１７０と、これら２つのＣＰＵが使用可能な共有資源１１０と、主記憶装置であるメモリ１３０と、現在時刻の情報を有するタイマ１２０と、ログ出力部１８０とを備える。以下では、第１ＣＰＵ１６０と第２ＣＰＵ１７０とをまとめて、「ＣＰＵ」とも呼ぶ。
【００１０】
共有資源１１０は、メモリ１３０の一部の領域、メモリ１３０とは独立した物理メモリ、またはいずれかのＣＰＵのハードウエアレジスタである。共有資源１１０は、第１ＣＰＵ１６０および第２ＣＰＵ１７０からアクセスが可能であり、後述する排他制御によりいずれかのＣＰＵにより共有資源１１０が専有される。共有資源１１０は、ロック変数１１１、およびタスク情報１１２が格納される記憶部を備える。
【００１１】
ロック変数１１１は、排他制御の状態を示す変数であり、たとえば「ゼロ」と「１」の値をとる本実施の形態では、ロック変数１１１が「０」の状態とは、共有資源１１０がいずれのＣＰＵによっても排他制御されていない、すなわち専有されていない状態である。また、ロック変数１１１が「１」の状態とは、共有資源１１０がいずれかのＣＰＵによって排他制御されている、すなわち専有されている状態である。
【００１２】
タスク情報１１２は、共有資源１１０を専有した最新のタスクの識別子を示す変数である。換言すると、ロック変数１１１が最後に「１」に設定された際に、共有資源１１０を占有したＣＰＵにおいて実行されていたタスクの識別子がタスク情報１１２として保存される。なお、タスクの識別子だけではそのタスクを実行したＣＰＵを特定できない場合は、そのタスクを実行したＣＰＵを特定する情報も識別情報としてタスク情報１１２に含まれる。なお上述したタスクとは、ＣＰＵが実行する処理を意味しており、処理系によってジョブ、プロセス、スレッドなどと呼ばれる。
【００１３】
第１ＣＰＵ１６０および第２ＣＰＵ１７０のそれぞれは、個別のＣＰＵであり、それぞれがＣＰＵコアを有する。すなわち電子制御装置１００は、複数の物理ＣＰＵを備えるいわゆるマルチプロセッサ構成を有する装置である。第１ＣＰＵ１６０は、不図示のプログラムをメモリ１３０に展開して実行することにより、第１ロック取得部１６１および第１カウンタ記録部１６２として動作する。第２ＣＰＵ１７０は、不図示のプログラムをメモリ１３０に展開して実行することにより、第２ロック取得部１７１および第２カウンタ記録部１７２として動作する。第１ＣＰＵ１６０および第２ＣＰＵ１７０は、以下のように共有資源１１０を一時的に専有して使用する。
【００１４】
ＣＰＵ，すなわち第１ＣＰＵ１６０および第２ＣＰＵ１７０は、共有資源１１０を使用する必要が生じると、まずロック変数１１１の値を確認する。ＣＰＵが確認した際にロック変数１１１が「ゼロ」であれば、ＣＰＵはロック変数１１１を「１」に書き換えて共有資源１１０を専有して使用し、使用が終了するとロック変数１１１を「１」から「ゼロ」に書き換える。ＣＰＵが確認した際にロック変数１１１が「１」であった場合は、そのＣＰＵは所定時間ごとにロック変数１１１にアクセスし、ロック変数１１１が「ゼロ」に変更されるまでアクセスを続ける。なお、ＣＰＵがロック変数１１１にアクセスする時間間隔は既知であり、この時間間隔に基づき後述する時間変換テーブル２１２があらかじめ作成されている。
【００１５】
このように、共有資源１１０の専有に成功するまで、上記の例ではロック変数１１１が「ゼロ」になるまで、アクセスを繰り返す排他制御方式は「スピンロック」と呼ばれる。本実施の形態では、スピンロックにおける共有資源１１０の専有を試みた回数、すなわちロック変数１１１の値を確認した２回目以降の回数を「スピン回数」と呼ぶ。たとえば、ロック変数１１１を確認した初回で「ゼロ」であった場合はスピン回数はゼロであり、ロック変数１１１を確認した３回目で初めて「ゼロ」であった場合はスピン回数は２である。また、共有資源１１０を使用するために、初回にロック変数１１１の値を確認してからロック変数１１１に「１」を代入できるまでの時間を「ロック待ち時間」と呼ぶ。さらに、ロック変数１１１を「ゼロ」から「１」に書き換えて共有資源１１０を排他制御することを「ロック取得」とも呼ぶ。
【００１６】
このロック取得を行うのが、第１ロック取得部１６１および第２ロック取得部１７１である。第１ロック取得部１６１は第１ＣＰＵ１６０が共有資源１１０を使用する場合に動作し、第２ロック取得部１７１は第２ＣＰＵ１７０が共有資源１１０を使用する場合に動作する。第１ロック取得部１６１および第２ロック取得部１７１による、ロック変数１１１の確認、およびロック変数１１１が「ゼロ」であった場合の「１」の代入は、ＴＥＳＴ−ａｎｄ−ＳＥＴ命令としてアトミックに実行される。すなわち、変数の確認と変数への代入は他のＣＰＵからは一連の動作として割り込まれることなく実行される。
【００１７】
第１カウンタ記録部１６２、および第２カウンタ記録部１７２は、第１ロック取得部１６１および第２ロック取得部１７１によるロック取得後に、ロック変数１１１の値などを第１バッファ１５１および第２バッファ１５２に格納する。第１カウンタ記録部１６２、および第２カウンタ記録部１７２の動作は後に詳述する。
タイマ１２０は、時刻を管理するハードウェアである。タイマ１２０は、時刻情報を示す時刻レジスタ１２１を備える。時刻情報は、絶対時刻であってもよいし、電子制御装置１００の電源がオンにされた時点など所定の時刻を基準、たとえばゼロとする相対時刻であってもよい。
【００１８】
メモリ１３０は、記憶装置であり、ＣＰＵによって実行されるプログラム及びデータが保持される。メモリ１３０は、その機能として更新カウンタ格納部１４０と、ログ格納部１５０とを備える。なお、共有資源１１０、メモリ１３０、およびタイマ１２０は、それぞれ電子制御装置１００上のＣＰＵと独立したハードウェアであってもよいし、ＳｏＣ（Ｓｙｓｔｅｍ−ｏｎ−Ｃｈｉｐ）のように一つの半導体チップ上に統合されていてもよい。
【００１９】
更新カウンタ格納部１４０には、第１カウンタ１４１、および第２カウンタ１４２が格納される。第１カウンタ１４１は、第１ＣＰＵ１６０により更新されるカウンタ値であり、第１ＣＰＵ１６０のスピン回数を示す。第２カウンタ１４２は、第２ＣＰＵ１７０により更新されるカウンタ値であり、第２ＣＰＵ１７０のスピン回数を示す。第１カウンタ１４１、および第２カウンタ１４２の初期値はゼロであり、更新によりそれぞれ１ずつ増加される。
【００２０】
ログ格納部１５０は、第１バッファ１５１、および第２バッファ１５２を備える。第１バッファ１５１には第１ＣＰＵ１６０が実行したプログラムのログが格納される。第２バッファ１５２には第２ＣＰＵ１７０が実行したプログラムのログが格納される。ログ格納部１５０に格納されたログは、後述するログ出力部１８０を経由して解析装置２００に出力される。
ログ出力部１８０は、解析装置２００のログ収集部２７０と通信を行うインタフェースである。ログ出力部１８０はたとえば、ＪＴＡＧなどのデバッグ用インタフェース、またはＣＡＮ（ＣａｒＡｒｅａＮｅｔｗｏｒｋ）やＩＥＥＥ８０２．３に対応する通信インタフェースである。ログ出力部１８０は、解析装置２００からの要求に応じて、または一定時間ごとに解析装置２００にログを出力する。
【００２１】
（解析装置の構成）
解析装置２００は、メモリ２１０と、ログ解析部２２０と、表示部２３０と、ＣＰＵ２６０と、ログ収集部２７０とを備える、たとえばコンピュータである。メモリ２１０には、電子制御装置１００の各ＣＰＵのログが集約される収集バッファ２１１、スピン回数と時間の関係を示す時間変換テーブル２１２、およびログ解析部２２０により出力される解析結果２１３が格納される。
ログ解析部２２０は、収集バッファ２１１に格納されるログを時間変換テーブル２１２を用いて解析する。換言するとログ解析部２２０は、スピン回数として記録されているロック待ち時間を実時間に変換する。ログ解析部２２０が解析した結果は、解析結果２１３としてメモリ２１０に格納されるとともに表示部２３０に表示される。
【００２２】
表示部２３０は、収集バッファ２１１に格納されるログ、およびログ解析部２２０により出力された解析結果２１３を表示する。ただし表示部２３０は、解析装置２００に接続された表示装置に表示すべき情報を出力する装置であってもよい。ＣＰＵ２６０は、解析装置２００を動作させる演算装置である。ＣＰＵ２６０のアーキテクチャ、コア数、ソケット数、動作速度等は特に限定されない。
ログ収集部２７０は、電子制御装置１００のログ出力部１８０と通信を行うインタフェースである。ログ収集部２７０はたとえば、ＪＴＡＧなどのデバッグ用インタフェース、またはＣＡＮやＩＥＥＥ８０２．３に対応する通信インタフェースである。ログ収集部２７０は、電子制御装置１００から受信するログを収集バッファ２１１に格納する。
【００２３】
（動作例）
図２を用いて第１ＣＰＵ１６０および第２ＣＰＵ１７０の動作例を説明する。図２に示すタイムチャートは、第１ＣＰＵ１６０および第２ＣＰＵ１７０が実行するタスク、およびロック取得を示している。図示左から右に向かって時間が経過している。図２の上部に示す数字は時刻レジスタ１２１から得られる時刻を示している。後に図３、図４を用いて説明する、第１バッファ１５１、および第２バッファ１５２に格納されるログは図２に示す動作により得られたログである。なお以下では、複数回実行される共有資源１１０の排他制御、すなわちロック取得のそれぞれを便宜的に区別するために、実行される順番に、ロックＬ，ロックＭ，ロックＮ、・・・と呼ぶ。
【００２４】
第１ＣＰＵ１６０は、時刻８５０から時刻９１０までの間タスクＡを実行しており、時刻８８０に割り込みＲが発生し、時刻９００まで割り込みＲが継続する。第１ＣＰＵ１６０は、時刻８６０にロックＬの取得を開始し、時刻８８５にロックＮの取得を開始し、時刻９００の少し前にロックＯの取得を開始している。第２ＣＰＵ１７０は、時刻８４０から時刻９２０までの間タスクＢを実行しており、時刻８７０に割り込みＱが発生し、時刻８９０まで割り込みＱが継続する。第２ＣＰＵ１７０は、時刻８８０にロックＭの取得を開始し、ロックＭの取得後は共有資源１１０を使用して時刻８８５を経過した後に共有資源１１０の使用を終了した。また、第１ＣＰＵ１６０のロックＮの取得に関して、その時のスピン回数は３００であり、その前に共有資源１１０を使用していたタスクは割り込みＱである。それ以外のロック取得、すなわちロックＬ，ロックＭ，ロックＯのスピン回数はゼロである。スピン回数がゼロの場合はロックの取得は即座に行われる。
【００２５】
（バッファの構成）
図３、および図４は、第１バッファ１５１、および第２バッファ１５２に格納される情報の一例を示す図である。ここでは、図２に示す動作が行われた際に、第１バッファ１５１、および第２バッファ１５２に格納される情報を示している。第１バッファ１５１、および第２バッファ１５２の構成は同一なので、代表して第１バッファ１５１を説明する。第１バッファ１５１には、１または複数のレコードから構成されるログが格納される。第１バッファ１５１の各レコードは、イベント種類３１１、イベント内容３１２、タイムスタンプ３１３、待ち時間３１４、タスク情報３１５の５つのフィールドを備える。第１バッファ１５１の各レコードが、第１ＣＰＵ１６０において実行されるプログラムの各イベントに対応する。
【００２６】
イベント種類３１１のフィールドには、発生したイベントの種類、たとえば「タスク開始」、「ロック取得」などが格納される。イベント内容３１２のフィールドには、発生したイベントの対象、たとえば「タスクＡ」「割り込みＲ」などが格納される。たとえばイベント種類が「タスク開始」、イベント内容３１２が「タスクＡ」であれば、そのログは、そのＣＰＵにおいてタスクＡの実行が開始された、というイベントを表している。
【００２７】
タイムスタンプ３１３のフィールドには、イベントが発生した時刻の情報が格納される。時刻情報は、タイマ１２０の時刻レジスタ１２１から得られる。待ち時間３１４のフィールドには、第１カウンタ１４１から得られるロック待ち時間を示す情報、すなわちスピン回数が格納される。タスク情報３１５のフィールドには、スピン回数が１以上であるときにロック取得に成功した際のタスク情報１１２の値が格納される。以下では、あるフィールドに格納された値をフィールドの名称で呼ぶことがある。たとえば「イベント種類３１１のフィールドに格納された値がｘｘ」であることを、「イベント種類３１１がｘｘ」と記載することがある。
各レコードのフィールドには、特定の条件で記録される、または特定の条件で記録されないものがある。
【００２８】
タイムスタンプ３１３のフィールドには、以下の条件で記録がされない。すなわち、イベント種類３１１が「ロック取得」であり待ち時間３１４がゼロ（０）の場合は、タイムスタンプ３１３のフィールドには値が記録されない。それ以外の場合、すなわち第１ＣＰＵ１６０が二回目以降のアクセスでロック取得できた場合に、タイムスタンプ３１３のフィールドには値が記録される。ロック取得の待ち時間がゼロの場合は時刻を記録する必要性に乏しく、さらに時刻の記録に要するオーバーヘッドが大きいからである。図３、および図４に示す例では、待ち時間３１４がゼロであるロックＬ，Ｍ，Ｏのイベントではタイムスタンプ３１３が記録されていない。
【００２９】
待ち時間３１４のフィールドには、イベント種類３１１が「ロック取得」である場合に記録される。すなわち、イベント種類３１１が「ロック取得」以外の場合は、待ち時間３１４のフィールドには値が記録されない。前述のとおり、待ち時間３１４のフィールドにはスピン回数が格納されるので、スピンが発生しえない「ロック取得」以外のイベントでは記録が不可能だからである。図３および図４に示す例では、待ち時間３１４がゼロではないロックＮのイベントのみタスク情報３１５が記録される。
【００３０】
タスク情報３１５のフィールドには、イベント種類３１１が「ロック取得」であり待ち時間３１４がゼロ以外である場合、すなわち第１ＣＰＵ１６０が二回目以降のアクセスでロック取得できた場合に、値が記録される。それ以外の場合はタスク情報３１５のフィールドには値が記録されない。ロック取得の待ち時間がゼロの場合は、直前に共有資源１１０を使用していたタスクを特定する必要性が乏しいからである。
なお、図２と図３においては、第１バッファ１５１および第２バッファを単純な表として記載しているが、リングバッファのような構造であってもよく、また実際のデータ格納には、可変長のレコードを用いてもよい。
【００３１】
（時間変換テーブル）
図５は、時間変換テーブル２１２の一例を示す図である。時間変換テーブル２１２は、第１バッファ１５１や第２バッファ１５２における待ち時間のフィールドに格納されたスピン回数と実時間の対応表であり、待ち時間３２１、実時間３２２のフィールドを備える。待ち時間３２１のフィールドには、待ち時間すなわちスピン回数が格納され、実時間３２２のフィールドには、待ち時間３２１に格納された待ち時間（スピン回数）の値に対応する実時間の値が格納される。図５には、待ち時間がゼロであれば実時間もゼロであり、待ち時間が「１」であれば実時間は「５マイクロ秒」であり、待ち時間が「１＋ｎ」であれば実時間は「５＋４＊ｎマイクロ秒」であることが示されている。
【００３２】
たとえば図２および図３に示したロックＮについて、時間変換テーブル２１２を用いることで以下のことがわかる。ロックＮは、図３の待ち時間３１４に格納されている待ち時間の値が３００、すなわち１＋２９９であるため、ロックＮを取得するのに要した実時間は５＋４＊２９９＝１２０１マイクロ秒である。さらに、ロックＮの取得を開始したのが時刻８８５なので、時刻８８５から１２０１マイクロ秒経過したときにロックＮが取得されたことがわかる。
なお、時間変換テーブル２１２に格納される情報は、図５に示したようなテーブル形式以外の情報であってもよい。すなわち、スピン回数と実時間の関係を適切に表す情報であれば、どのような形式の情報を時間変換テーブル２１２に格納してもよい。
【００３３】
（解析結果）
図６は、解析装置２００のログ解析部２２０が出力する解析結果２１３の一例を示す図である。解析結果２１３には、収集バッファ２１１に格納されたログを解析して得られた情報であって、待ち時間の発生したロック取得イベントの詳細が記される。解析結果２１３を構成するレコードのそれぞれはロック取得イベントにそれぞれ対応する。解析結果２１３は、処理ＣＰＵ３３１と、発生処理３３２と、ロック３３３と、タイムスタンプ３３４と、実待ち時間３３５と、原因ＣＰＵ３３６と、原因処理３３７との７つのフィールドから構成される。
【００３４】
処理ＣＰＵ３３１のフィールドには、そのロック取得イベントが発生したＣＰＵの識別子、または名称が格納される。発生処理３３２のフィールドには、そのロック取得イベントを発生させたタスクもしくは割り込み処理の名称が格納される。ロック３３３のフィールドには、便宜的に設定したロックの名称が格納される。タイムスタンプ３３４のフィールドには、そのロック取得イベントが発生した時刻の情報が格納される。実待ち時間３３５のフィールドには、時間変換テーブル２１２を用いて変換されたロック取得までの待ち時間が格納される。原因ＣＰＵ３３６のフィールドには、ロック取得において待ちの原因となったＣＰＵの識別子または名称が格納される。原因処理３３７のフィールドには、ロック取得において待ちの原因となったタスクの識別子が格納される。待ちの原因となったＣＰＵ及びタスクとは、そのイベントにおいてロック取得を試みた際に、そのロックを保持していたＣＰＵとそのＣＰＵが実行していたタスクである。待ちの原因となったＣＰＵ及びタスクは、タスク情報１１２から特定される。
【００３５】
図６の１レコード目を具体的に説明する。このレコードは、図３における４レコード目のログに基づき生成されている。第１ＣＰＵ１６０が時刻１８５にロックＮを取得するために、スピン回数３００の待ちが発生した。そのため解析結果２１３では、処理ＣＰＵ３３１に「第１ＣＰＵ」、発生処理３３２に「割り込みＲ」、ロック３３３に「ロックＮ」、タイムスタンプ３３４に「１８５」が格納される。また、３００回のスピンは、時間変換テーブル２１２によると１２０１マイクロ秒に相当するので、実待ち時間３３５のフィールドには「１２０１マイクロ秒」が格納される。直前に共有資源１１０を使用したタスクは割り込みＱであり、そのタスクは第２ＣＰＵ１７０により実行されたので、原因ＣＰＵ３３６のフィールドには「第２ＣＰＵ」、原因処理３３７のフィールドには「割り込みＱ」が格納される。
【００３６】
（解析システム１の動作概要）
解析システム１の動作概要を説明する。解析システム１の動作は、ログの収集と解析に大別される。ログの収集は電子制御装置１００により実行され、ログの解析は解析装置２００により実行される。
電子制御装置１００の第１ＣＰＵ１６０および第２ＣＰＵ１７０は、不図示のプログラムを実行することによりそれぞれソフトウエアを動作させる。これらのソフトウエアは、共有資源１１０の使用を必要とする。第１ＣＰＵ１６０および第２ＣＰＵ１７０は、ソフトウエアのイベントのログをログ格納部１５０に格納する。格納されるログは、タスクの実行開始と終了、割り込み処理の開始と終了、そして共有資源１１０を使用するためのロックの取得処理などである。本実施の形態では、ロックの取得処理のログに注目しているので、それ以外のログの記録処理の説明は省略する。
【００３７】
第１ＣＰＵ１６０は、第１ロック取得部１６１を用いてロックを取得し、取得したロックに関するログを第１カウンタ記録部１６２を用いて第１バッファ１５１に記録する。第２ＣＰＵ１７０は、第２ロック取得部１７１を用いてロックを取得し、取得したロックに関するログを第２カウンタ記録部１７２を用いて第２バッファ１５２に記録する。ログ出力部１８０は、ログ格納部１５０に格納されたログを解析装置２００に出力する。
【００３８】
解析装置２００のＣＰＵ２６０は、電子制御装置１００から出力されたログをログ解析部２２０に解析させる。ログ解析部２２０が解析した結果は、解析結果２１３としてメモリ２１０に格納されるとともに表示部２３０に表示される。
以下では、図７を用いて第１ＣＰＵ１６０におけるロック取得の動作、およびロックに関するログの格納の動作を説明し、図８を用いてログ解析部２２０の動作を説明する。なお、第２ＣＰＵ１７０におけるロック取得の動作、およびロックに関するログの格納の動作は、第１ＣＰＵ１６０の動作と同様なので説明を省略する。
【００３９】
（ロック取得と記録のフローチャート）
図７を用いて、第１ＣＰＵ１６０による、ロック取得動作およびロック取得に関するログ記録動作を説明する。以下に説明する各ステップの実行主体は、第１ＣＰＵ１６０である。
ステップＳ４００では、第１カウンタ１４１のカウンタ値をゼロにリセットする。続くステップＳ４０１では共有資源１１０を使用するために、前述のＴＥＳＴ−ａｎｄ−ＳＥＴ命令を用いてロックの取得を試みる。続くステップＳ４０２ではステップＳ４０１におけるロック取得が成功したか否かを判断し、成功したと判断する場合はステップＳ４０６に進み、失敗したと判断する場合はステップＳ４０３に進む。
【００４０】
ステップＳ４０３では第１カウンタ１４１のカウンタ値をインクリメント、すなわち１増加させる。続くステップＳ４０４では、第１カウンタ１４１のカウンタ値が「１」であるか否かを判断する。カウンタ値が「１」であると判断する場合、すなわちステップＳ４００が実行された後にステップＳ４０２で初めて否定判断された場合はステップＳ４０５に進む。カウンタ値が「１」以外であると判断する場合、すなわちステップＳ４００が実行された後にステップＳ４０２で否定判断されたのが２回目以降である場合はステップＳ４０１に戻る。ステップＳ４０５では、時刻レジスタ１２１からタイムスタンプを取得し、ステップＳ４０１に戻る。
ロックの取得に成功すると実行されるステップＳ４０６では、第１カウンタ１４１のカウンタ値がゼロであるか否かを判断する。ゼロであると判断する場合はステップＳ４０７に進み、ゼロ以外であると判断する場合はステップＳ４０８に進む。
【００４１】
ステップＳ４０７では、第１バッファ１５１を記録対象として、以下の情報を第１カウンタ記録部１６２に記録させる。すなわち、第１ＣＰＵ１６０において現在実行されているイベントの種類、すなわち「ロック取得」、イベントの内容、および第１カウンタ１４１のカウンタ値を記録させる。ステップＳ４０８では、第１バッファ１５１を記録対象として、以下の情報を第１カウンタ記録部１６２に記録させる。すなわち、第１ＣＰＵ１６０において現在実行されているイベントの種類、イベントの内容、第１カウンタ１４１のカウンタ値、ステップＳ４０５において取得したタイムスタンプ、およびタスク情報１１２を記録させる。
ステップＳ４０７またはステップＳ４０８の実行が終了すると実行されるステップＳ４０９では、タスク情報１１２に第１ＣＰＵ１６０において現在実行されているタスクの情報を格納し、図７に示すフローチャートを終了する。
【００４２】
（ログ解析のフローチャート）
図８は、収集バッファ２１１に収集されたログを解析し、解析結果２１３を出力するログ解析部２２０の動作を表すフローチャートである。以下に説明する各ステップの実行主体は解析装置２００のＣＰＵ２６０である。
ステップＳ５０１では、収集バッファ２１１にログが収納されているいずれかのＣＰＵを処理対象として選択してステップＳ５０２に進む。後述するように、ステップＳ５０１とステップＳ５０９の間、すなわちステップＳ５０２〜ステップＳ５０８の処理を、収集バッファ２１１にログが収納されている全てのＣＰＵについて実行する。
【００４３】
ステップＳ５０２では、処理対象に選択されたＣＰＵのいずれかのログを処理対象として選択してステップＳ５０３に進む。後述するように、ステップＳ５０２とステップＳ５０８の間、すなわちステップＳ５０３〜ステップＳ５０７の処理を、処理対象のＣＰＵの全てのログについて実行する。
ステップＳ５０３では、処理対象のログのイベント種類３１１が「ロック取得」であるか否かを判断し、「ロック取得」であると判断する場合はステップＳ５０４に進み、それ以外であると判断する場合はステップＳ５０８に進む。
【００４４】
ステップＳ５０４では、処理対象のログの待ち時間が「１」以上であるか否かを判断し、「１」以上であると判断する場合はステップＳ５０５に進み、それ以外、すなわちゼロであると判断する場合はステップＳ５０８に進む。
ステップＳ５０５では、処理対象のログのタスク情報３１５のフィールドの値に基づきそのタスクを実行していたＣＰＵを特定する。続くステップＳ５０６では、処理対象のログの待ち時間３１４のフィールドの値を、時間変換テーブル２１２を用いて実時間に変換してステップＳ５０７に進む。
【００４５】
ステップＳ５０７では、処理対象のログの情報を解析結果２１３に記録する。このとき解析結果２１３の各フィールドに記録する値は、以下のとおりである。処理ＣＰＵ３３１は、ステップＳ５０２〜Ｓ５０８のループにおいて現在処理対象のＣＰＵの名称である。発生処理３３２の値は、処理対象のログの直前のログにおけるイベント内容３１２の値である。ロック３３３の値は、処理対象のログにおけるイベント内容３１２の値である。タイムスタンプ３３４の値は、処理対象のログにおけるタイムスタンプ３３１の値である。実待ち時間３３５の値は、ステップＳ５０６において算出された実時間である。原因ＣＰＵ３３６の値は、ステップＳ５０５において特定されたＣＰＵの名称である。原因処理３３７の値は、処理対象のログにおけるタスク情報３１５の値である。
【００４６】
続くステップＳ５０８では、処理対象のＣＰＵの全てのログを処理対象としたか否かを判断する。未処理のログがあると判断する場合は未処理のログのいずれかを処理対象としてステップＳ５０３に戻り、全てのログを処理したと判断する場合はステップＳ５０９に進む。
ステップＳ５０９では、収集バッファ２１１にログが格納されている全てのＣＰＵを処理対象としたか否かを判断する。未処理のＣＰＵがあると判断する場合は未処理のＣＰＵのいずれかを処理対象としてステップＳ５０２に戻り、全てのＣＰＵを処理したと判断する場合は図８のフローチャートを終了する。
【００４７】
上述した第１の実施の形態によれば、次の作用効果が得られる。
（１）電子制御装置１００は、複数のＣＰＵ、すなわち第１ＣＰＵ１６０および第２ＣＰＵ１７０と、共有資源１１０とを備える。ＣＰＵのそれぞれは、排他制御により共有資源１１０を独占して使用可能である。ＣＰＵのそれぞれは、カウンタ値が格納される更新カウンタ格納部１４０と、カウントが完了したカウント値を含む、第１ＣＰＵ１６０および第２ＣＰＵ１７０が実行したプログラムのログが格納されるログ格納部１５０とを備える。ＣＰＵは、ＣＰＵが共有資源１１０にアクセスしたときに、更新カウンタ格納部１４０に格納されたカウンタ値を更新させるカウンタ更新部、すなわち第１ロック取得部１６１および第２ロック取得部１７１と、ＣＰＵが共有資源１１０にアクセスしたときに、共有資源１１０が他のＣＰＵにより排他制御されていない場合には、更新カウンタ格納部１４０に格納されたカウンタ値を含むログをログ格納部１５０に記録するカウンタ記録部、すなわち第１カウンタ記録部１６２および第２カウンタ記録部１７２とを備える。
【００４８】
電子制御装置１００は、ＣＰＵが共有資源１１０にアクセスしたときに、共有資源１１０が他のＣＰＵにより排他制御されている場合、すなわちロック変数１１１が「１」の場合にはカウンタの値を更新する。そのため、タイマ１２０へのアクセスによるオーバーヘッドを生じさせることなく、アクセスが生じたことをカウンタ値の更新として更新カウンタ格納部１４０に記録することができる。なお、更新カウンタ格納部１４０に格納されるカウンタ値は、ロック取得を試みた２回目以降の回数、すなわちスピン回数を表す。
【００４９】
また電子制御装置１００は、共有資源１１０が他のＣＰＵにより排他制御されていない場合、すなわちロック変数１１１がゼロの場合には、オーバーヘッドの大きいタイマ１２０へのアクセスを行うことなく、更新カウンタ格納部１４０に格納されたカウント値をログ格納部１５０に格納する。そのため、ログを記録するためのオーバーヘッドが小さい。この利点は特に、待ち時間がゼロであった場合に顕著である。たとえば待ち時間の算出は、待ち時間の開始時と終了時にそれぞれタイマから時刻を取得し、２つの時刻の差を待ち時間として算出する手法が広く行われているが、この手法ではタイマ１２０へのアクセスが２回行われる。時刻の取得に要する時間はロックの取得に要する時間よりも長く、さらに時刻の取得が２回も行われるため、待ち時間の算出のオーバーヘッドが大きくなってしまう問題がある。しかし本発明によればこのような問題を生じさせることなく、待ち時間を記録することができる。
【００５０】
（２）電子制御装置１００のＣＰＵは、ＣＰＵが共有資源１１０にアクセスして所定の処理単位を実行する毎に、すなわちスピンロックが実行されるごとに更新カウンタ格納部１４０に格納されたカウンタの値を変化させる。
そのため、実行間隔および実行時間が既知であるスピンロックの実行回数を記録することで、オーバーヘッドの大きいタイマへのアクセスを行うことなく、待ち時間を記録することができる。
【００５１】
（３）電子制御装置１００は、時刻情報を保持するタイマ１２０を備える。ＣＰＵが共有資源１１０に一回目にアクセスしたときに、共有資源１１０が他のＣＰＵにより排他制御されている場合は、時刻情報をタイマ１２０から取得し、時刻情報をさらに含むログをログ格納部１５０に格納する。
そのため、タイマ１２０へのアクセスのオーバーヘッドを隠蔽しつつ、待ち時間が生じた時刻を記録することができる。カウンタが更新されたことは、共有資源１１０が他のＣＰＵにより使用されており、ロック取得を試みたＣＰＵは所定時間の経過後に再度ロック取得を試みることを意味する。そのため、ロック取得を試みたＣＰＵがタイマ１２０へアクセスしても、そのオーバーヘッドは少なくとも一部が隠蔽されることになる。この効果は、第１ＣＰＵ１６０および第２ＣＰＵ１７０の少なくとも一方が、以下の特徴を有する場合に顕著である。すなわち、ＣＰＵが、スピン時にバス占有を防ぐためにＣＰＵを一定時間停止する命令を発行する特徴を有する場合に効果が顕著である。
【００５２】
（４）共有資源１１０は、ＣＰＵが実行している処理を識別する識別情報を格納する識別情報格納部、すなわちタスク情報１１２を記憶する領域を備える。カウンタ記録部、すなわち第１カウンタ記録部１６２および第２カウンタ記録部１７２は、ＣＰＵが２回目以降のアクセスで共有資源１１０を排他制御した場合に、識別情報格納部から識別情報、すなわちタスク情報１１２を取得し、タスク情報１１２をさらに含むログをログ格納部１５０に格納する。
そのため、待ち時間を発生させた処理、すなわち従前に共有資源１１０を使用していた処理の識別情報をログ格納部１５０に記録することができる。
【００５３】
（５）カウンタ更新部、すなわち第１ロック取得部１６１および第２ロック取得部１７１は、共有資源１１０を排他制御した場合に、ＣＰＵが実行している処理に基づき識別情報格納部の識別情報を更新する。
タスク情報１１２に共有資源１１０を使用しているタスクの情報を格納するので、あるＣＰＵが共有資源１１０を使用できなかった場合に、その原因となっていた処理、すなわち従前に共有資源１１０を使用していた処理を特定させることが可能となる。
【００５４】
（６）解析システム１は、電子制御装置１００と、解析装置２００とを備える。解析装置２００は、電子制御装置１００のログ格納部１５０に格納された情報が入力されるログ収集部２７０と、カウンタ値を実時間に換算するための換算情報、たとえば時間変換テーブル２１２を格納する記憶部、すなわちメモリ２１０と、換算情報を用いて、ログ収集部２７０に入力されたカウンタ値を実時間に換算するログ解析部２２０と、を備える。
そのため解析装置２００は、電子制御装置１００が記録したカウンタ値を実時間に変換できる。すなわち解析システム１は、共有資源１１０の排他制御による待ち時間をスピン回数として記録することで記録時のオーバーヘッドを低減しつつ、その記録したスピン回数を解析装置２００を用いて実時間に変換することができる。
【００５５】
（変形例１）
第１バッファ１５１および第２バッファ１５２の待ち時間３１４には、タイマ１２０から取得した時刻を格納してもよい。すなわち図７のステップＳ４０８において、時刻レジスタ１２１からタイムスタンプを取得して格納してもよい。この場合は、解析装置２００は、タイムスタンプ３１３に格納された時刻と待ち時間３１４に格納された時刻との差を演算することによりロック取得のために待機した実時間を算出する。
この変形例１によれば、解析装置２００は時間変換テーブル２１２を備える必要がないという第１の利点、およびより正確な待ち時間算出を行うことができるという第２の利点を有する。なお、待ち時間がゼロとなる場合以外は、時刻レジスタ１２１にアクセスして時刻を取得してもそのオーバーヘッドの影響は相対的に小さく、デメリットは小さい。
【００５６】
（変形例２）
第１カウンタ１４１は、第１ＣＰＵ１６０のレジスタや第１ＣＰＵ１６０が備える不図示のメモリに格納されてもよい。同様に第２カウンタ１４２は、第２ＣＰＵ１７０のレジスタや第２ＣＰＵ１７０が備える不図示のメモリに格納されてもよい。
この変形例２によれば、高速なアクセスが可能な同一ＣＰＵ内で書き換えが行われるので、カウンタ値の初期化および更新のオーバーヘッドを低減することができる。
【００５７】
（変形例３）
第１カウンタ１４１が独立して設けられず、第１バッファ１５１が第１カウンタ１４１の役割も兼ねてよい。この場合は第１ロック取得部１６１は、第１カウンタ１４１に格納されるカウンタ値を初期化および更新する代わりに、第１バッファ１５１の待ち時間３１４のフィールドにカウンタの初期値であるゼロを書き込み、更新する。同様に第２カウンタ１４２が独立して設けられず、第２バッファ１５２が第２カウンタ１４２の役割も兼ねてよい。
【００５８】
（変形例４）
電子制御装置１００は、３つ以上のＣＰＵを備えてもよい。また電子制御装置１００は、単一のパッケージに収められ複数のコアを有するＣＰＵを１つ備えてもよい。単一のパッケージに収められ複数のコアは、同一であってもよいし異なっていてもよい。さらに、各ＣＰＵコアのアーキテクチャ及び動作速度は同一であってもよいし、異なっていてもよい。
【００５９】
（変形例５）
メモリ１３０は、ＣＰＵごとに独立していてもよい。この場合には、ログ格納部１５０および更新カウンタ格納部１４０には、それぞれのＣＰＵごとのメモリ１３０に存在する。さらに、プログラムを保持する不揮発性メモリとデータを保持する揮発性メモリに分かれている構成であってもよい。
【００６０】
（変形例６）
電子制御装置１００が第３のＣＰＵを備え、その第３のＣＰＵが第１ロック取得部１６１、第１カウンタ記録部１６２、第２ロック取得部１７１、および第２カウンタ記録部１７２の少なくとも１つを実行してもよい。また、第１ロック取得部１６１、第１カウンタ記録部１６２、第２ロック取得部１７１、および第２カウンタ記録部１７２の少なくとも１つが、ハードウエア回路により実行されてもよい。
【００６１】
（その他の変形例）
上述した第１の実施の形態をさらに以下のように変形してもよい。
（１）電子制御装置１００がタイマを複数備え、ＣＰＵごとに異なるタイマを参照してもよい。この場合は、各ＣＰＵの用いている時刻レジスタ１２１の値の差を記録するなど、補正処理を行う。
（２）第１カウンタ記録部１６２および第２カウンタ記録部１７２は、図７のステップＳ４０８においてタスク情報１１２を記録しなくてもよい。この場合は、第１ロック取得部１６１および第２ロック取得部１７１は、図７のステップＳ４０９におけるタスク情報１１２の更新を実行しなくてよく、第１バッファ１５１および第２バッファ１５２がタスク情報３１５のフィールドを備えなくてもよい。
【００６２】
（３）第１ロック取得部１６１および第２ロック取得部１７１は、カウンタ値にかかわらずタイムスタンプを取得しなくてもよい。すなわち、図７のステップＳ４０３を実行したらカウンタ値を評価することなくステップＳ４０１に戻ってもよい。
（４）電子制御装置１００は、共有資源１１０を複数備えてもよい。この場合、それぞれの共有資源１１０はロック変数１１１およびタスク情報１１２を独立して備える。
【００６３】
（第２の実施の形態）
図９〜図１０を参照して、電子制御装置の第２の実施の形態を説明する。以下の説明では、第１の実施の形態と同じ構成要素には同じ符号を付して相違点を主に説明する。特に説明しない点については、第１の実施の形態と同じである。本実施の形態では、主に、電子制御装置がカウント値から実時間への換算を行う診断部を備える点で、第１の実施の形態と異なる。
【００６４】
図９は、第２の実施の形態における電子制御装置１００Ａの構成を示す図である。電子制御装置１００Ａは、第１の実施の形態における電子制御装置１００の構成からログ出力部１８０が削除され、診断部９００が追加される。また、メモリ１３０には時間変換テーブル２１２および解析結果２１３がさらに格納される。特に説明しない構成、および動作は第１の実施の形態と同様である。
【００６５】
診断部９００は、第１ＣＰＵ１６０および第２ＣＰＵ１７０のいずれかが不図示のＲＯＭに格納されたプログラムを実行することにより実現される機能を機能ブロックとして表したものである。診断部９００は、ログ格納部１５０に格納されたログを解析する。診断部９００は、解析により異常を検出すると、たとえば待ち時間が所定の時間よりも長い場合は、所定の異常時処理を実行する。診断部９００は、一定の時間が経過すると、または診断を要するような所定の事象が発生すると動作する。
【００６６】
（診断部のフローチャート）
図１０は第２の実施の形態における診断部９００の動作を表すフローチャートである。以下では、図８に示したログ解析部２２０の動作を表したフローチャートとの差異を説明する。以下に説明する各ステップの実行主体は、第１ＣＰＵ１６０および第２ＣＰＵ１７０のいずれかである。以下ではこの実行主体を「ＣＰＵ」とする。
ステップＳ５０７までの処理はログ解析部２２０と同様なので説明を省略する。ステップＳ５０７の実行が完了すると、ステップＳ５２１を実行する。
【００６７】
ステップＳ５２１では、ステップＳ５０６において変換した実時間が所定値以上であるか否かを判断する。所定値以上であると判断する場合はステップＳ５２２に進み、所定値未満であると判断する場合はステップＳ５０８に進む。
ステップＳ５２２では所定の異常時処理を実行してステップＳ５０８に進む。異常時処理とはたとえば、最小構成の実行状態への移行、または異常検出した回数をカウントし所定の閾値に達した場合の電子制御装置１００の再起動などである。
【００６８】
上述した第２の実施の形態によれば、次の作用効果が得られる。
（１）電子制御装置１００Ａは、カウント値を時間に換算するための換算情報、たとえば時間変換テーブル２１２を格納する記憶部、すなわちメモリ１３０と、時間変換テーブル２１２を用いてカウンタ値を実時間に換算する解析部、すなわち診断部９００と、を備える。
そのため電子制御装置１００Ａは、解析装置２００を用いることなくカウンタ値を実時間に換算することができる。これにより、図１０のステップＳ５２１に示したように、換算した実時間を用いた診断を実行できる。
【００６９】
（第２の実施の形態の変形例）
第２の実施の形態を以下のように変形してもよい。
（１）診断部９００は、算出した待ち時間以外を診断に利用してもよい。たとえば、待ちの原因となったタスクが所定のものでなかった場合に、何らかの実行順序の異常が起きたと判定して、これを異常として診断してもよい。
（２）診断部９００は、解析結果をメモリ１３０に記録しなくてもよい。
（３）電子制御装置１００Ａは、ログ出力部１８０をさらに備えてもよい。
【００７０】
（第３の実施の形態）
図１１〜図１３を参照して、電子制御装置の第３の実施の形態を説明する。以下の説明では、第１の実施の形態と同じ構成要素には同じ符号を付して相違点を主に説明する。特に説明しない点については、第１の実施の形態と同じである。本実施の形態では、主に、スピン回数ではなくベーシックブロックの実行回数をカウントする点で、第１の実施の形態と異なる。
【００７１】
（ベーシックブロック）
ベーシックブロックとは、プログラムの実行単位であって、その単位中に分岐もしくは合流を含まないものである。ベーシックブロックは分岐や合流を含まないので、実行する環境、すなわちＣＰＵやメモリ等が同一であれば、ベーシックブロックの実行時間は一定である。本実施の形態では３つのベーシックブロック（Ａ，Ｂ，Ｃ）を用いて説明する。それぞれのベーシックブロックの電子制御装置１００における実行時間は既知である。
【００７２】
（構成）
解析システム１のハードウエア構成は第１の実施の形態と同様である。ただし第１カウンタ１４１と第２カウンタ１４２のそれぞれは、ベーシックブロックＡ，Ｂ，Ｃにそれぞれ対応する３つのカウンタ（Ａ，Ｂ，Ｃ）を備える。また時間変換テーブル２１２として格納される情報が第１の実施の形態と異なる。さらに電子制御装置１００の不図示のＲＯＭに格納されるプログラムが第１の実施の形態と異なり、第１ロック取得部１６１および第２ロック取得部１７１の動作が第１の実施の形態と異なる。
【００７３】
図１１は、本実施の形態における第１バッファ１５１の構造の一例を示した図である。第１バッファ１５１を構成するフィールドの構成は第１の実施の形態と同様であり、待ち時間３１４のフィールドに格納される値が異なる。すなわち待ち時間３１４のフィールドには、第１カウンタ１４１に格納されるカウンタＡ，カウンタＢ，カウンタＣの値が格納される。これ以外の点は第１の実施の形態と同様である。図１１に示す例では、ロックＭの取得時に、ベーシックブロックＡが３回、ベーシックブロックＢが１回、ベーシックブロックＣが２回実行されたことを示している。第２バッファ１５２の構成、および第２バッファ１５２に格納される情報は第１バッファ１５１と同様である。
【００７４】
図１２は、時間変換テーブル２１２Ａの一例を示す図である。時間変換テーブル２１２Ａには、それぞれのベーシックブロックに対応する時間が記録される。具体的には時間変換テーブル２１２Ａは、ベーシックブロック番号３２３のフィールドと、時間３２４のフィールドとを備える。ベーシックブロック番号３２３のフィールドには、ベーシックブロックの識別子またはベーシックブロックの名称が格納される。時間３２４のフィールドには、ベーシックブロックの１回の実行に要する時間が格納される。
なお、図１１と図１２に示す例によれば、各ベーシックブロックの実行時間から、ロックＭの取得のための待ち時間は、３＊２０＋１＊３８＋２＊１９＝１３６マイクロ秒と算出される。
【００７５】
（ロック取得部の動作）
ロック取得部、すなわち第１ロック取得部１６１および第２ロック取得部１７１は、第１の実施の形態では、ＴＥＳＴ−ａｎｄ−ＳＥＴ命令を用いてロックを取得したが、第３の実施の形態では、ＬｏａｄＬｉｎｋｅｄ命令（以下、「ＬＬ命令」と呼ぶ）、およびＳｔｏｒｅ Ｃｏｎｄｉｔｉｏｎａｌ命令（以下、「ＳＣ命令」と呼ぶ）を用いてロックを取得する。
【００７６】
ＬＬ命令とは、指定されたメモリ領域をロードすると同時に、その領域に対して「リンク」を生成する命令である。この「リンク」は、他のＣＰＵが同じ領域に書き込みを行うと消滅する。ＳＣ命令とは、指定されたメモリ領域に対して「リンク」が残存している場合に限り、値をストアする命令である。ＳＣ命令における「リンク」の残存の確認は、以下のことを意味する。すなわち、「リンク」が残存していることは、ＬＬ命令からＳＣ命令までの間に、他のＣＰＵが同じ領域に書き込みを行っていないことを示している。すなわちこれにより、読み込みと書き込みのアトミシティの保証、つまり読み込みと書き込みが不可分の一体として成功したことが保証される。
【００７７】
（フローチャート）
図１３は、第３の実施の形態における第１ＣＰＵ１６０による、ロック取得動作およびロック取得に関するログ記録動作を示すフローチャートである。図１３に示すように、ステップＳ４５１がベーシックブロックＡ、ステップＳ４５４がベーシックブロックＢ、ステップＳ４５５がベーシックブロックＣである。それぞれのベーシックブロックを実行すると、各ベーシックブロックに対応するカウンタを更新する。図１３に示すフローチャートは、第１の実施の形態における図７に相当する。以下では主に図７との相違点を説明する。
【００７８】
ステップＳ４００Ａでは、第１カウンタ１４１のカウンタＡ〜Ｃをゼロにリセットし、ステップＳ４５１に進む。ステップＳ４５１ではＬＬ命令を用いてロック変数１１１を読出してステップＳ４５２に進む。ステップＳ４５２ではカウンタＡをインクリメント、すなわちカウンタ値を１増加させてステップＳ４５３に進む。
ステップＳ４５３では、ステップＳ４５１において読みだしたロック変数１１１がゼロであったか否かを判断する。ＣＰＵは、ゼロであると判断する場合はステップＳ４５５に進み、ゼロでないと判断する場合はステップＳ４５４に進む。
【００７９】
ステップＳ４５４では、ステップＳ４５１において生成したリンクを破棄する。続くステップＳ４０３Ａでは、カウンタＢをインクリメントしてステップＳ４０４Ａに進む。ステップＳ４０４ＡではカウンタＢとカウンタＣのカウンタ値の和が「１」であるか否かを判断する。カウンタ値が「１」であると判断する場合はステップＳ４０５に進み、カウンタ値が「１」以外であると判断する場合はステップＳ４５１に戻る。ステップＳ４０５では、時刻レジスタ１２１からタイムスタンプを取得し、ステップＳ４５１に戻る。
【００８０】
ステップＳ４５５では、ＳＣ命令を用いてロック変数１１１に「１」を書き込む。続くステップＳ４５６では、カウンタＣをインクリメントする。続くステップＳ４５７ではステップＳ４５５における書き込みが成功したか否かを判断し、成功したと判断する場合はステップＳ４０６Ａに進み、失敗したと判断する場合はステップＳ４０４Ａに進む。ステップＳ４０６Ａでは、カウンタＢのカウンタ値がゼロであるか否かを判断する。ゼロであると判断する場合はステップＳ４０７に進み、ゼロ以外であると判断する場合はステップＳ４０８に進む。
ステップＳ４０７以降の処理は第１の実施の形態と同様なので説明を省略する。
【００８１】
上述した第３の実施の形態によれば、次の作用効果が得られる。
（１）カウンタ更新部、すなわち第１ロック取得部１６１および第２ロック取得部１７１は、共有資源１１０にアクセスしたときに、所定の処理単位が実行される毎に、すなわち各ベーシックブロックが実行されるごとに更新カウンタ格納部１４０に格納された、それぞれのベーシックブロックに対応するカウンタの値を更新させる。
そのため、実行間隔および実行時間が既知であるベーシックブロックの実行回数を記録することで、オーバーヘッドの大きいタイマへのアクセスを行うことなく、待ち時間を記録することができる。
【００８２】
（２）カウンタ更新部、すなわち第１ロック取得部１６１および第２ロック取得部１７１は、共有資源１１０が他のＣＰＵにより排他制御されている場合に、カウンタＢまたはカウンタＣのカウンタ値を変化させる。そのため、共有資源１１０にアクセスしたが排他制御できなかった回数を記録することができる。
第１の実施の形態と異なり、第３の実施の形態では、共有資源１１０が他のＣＰＵにより排他制御されている場合には、ステップＳ４５３でゼロであると判断する場合と、後述のステップＳ４５７で書き込みが失敗したと判断する場合の二通りがある。カウンタＢとカウンタＣのカウンタ値の和を用いることで、排他制御できなかった回数を記録することができる。
また、ステップＳ４０４Ａにおいては、カウンタＢとカウンタＣのカウンタ値の和「１」であるかと判断することにより、いずれの場合によったとしても、排他制御できなかった１回目の場合に時刻を取得することができ、第１の実施形態と同様に、オーバーヘッドを隠蔽しつつ待ち時間が生じた時刻を記録する効果を得ることができる。
【００８３】
（変形例）
第３の実施の形態では、ベーシックブロックの実行回数をカウントしたが、これより細かい粒度での処理の回数をカウントしてもよいし、荒い粒度での処理の回数をカウントしてもよい。例えば、細かい粒度でのカウントとして、ＣＰＵの命令ごとにカウントする構成が考えられる。この場合は、ログ格納部１５０には、ＣＰＵの各命令ごとの実行時間が格納されることになる。また、命令ごとにカウントする場合は、ソフトウェアでこれを実現することは極めてオーバーヘッドが高いため、ＣＰＵ等のハードウェア回路を用いてカウントすることが望ましい。ハードウェアによる命令ごとの計数を行う方法によれば、ベーシックブロックごとの実行回数を計数するようにソフトウェアを変更する必要がなく、相対的にオーバーヘッドを減らす効果が得られる。
【００８４】
なお、第１の実施形態においても、更新カウンタ格納部１４０に格納されたカウンタのインクリメント処理はソフトウェアで行う必要はない。たとえば、ＣＰＵの一つまたは複数のレジスタとしてカウンタが実装され、ＣＰＵが特定の命令を実行した場合に、対応するカウンタが加算される形であってもよい。この場合はたとえば、図７のステップＳ４０７およびステップＳ４０８においてログ格納部１５０に記録される待ち時間３１４は、ハードウェアから読みだしたカウンタの値となる。この場合も、第１の実施の形態の作用効果に加えて、オーバーヘッドをさらに減らす効果が得られる。
【００８５】
プログラムは不図示のＲＯＭに格納されるとしたが、プログラムはメモリ１３０に格納されていてもよい。また、電子制御装置１００が不図示の入出力インタフェースを備え、必要なときに入出力インタフェースと電子制御装置１００が利用可能な媒体を介して、他の装置からプログラムが読み込まれてもよい。ここで媒体とは、例えば入出力インタフェースに着脱可能な記憶媒体、または通信媒体、すなわち有線、無線、光などのネットワーク、または当該ネットワークを伝搬する搬送波やディジタル信号、を指す。また、プログラムにより実現される機能の一部または全部がハードウエア回路やＦＰＧＡにより実現されてもよい。
上述した各実施の形態および変形例は、それぞれ組み合わせてもよい。
上記では、種々の実施の形態および変形例を説明したが、本発明はこれらの内容に限定されるものではない。本発明の技術的思想の範囲内で考えられるその他の態様も本発明の範囲内に含まれる。
【符号の説明】
【００８６】
１  …  解析システム
１００、１００Ａ  …  電子制御装置
１１０  …  共有資源
１１１  …  ロック変数
１１２  …  タスク情報
１２０  …  タイマ
１４０  …  更新カウンタ格納部
１５０  …  ログ格納部
１６０  …  第１ＣＰＵ
１６１  …  第１ロック取得部
１６２  …  第１カウンタ記録部
１７０  …  第２ＣＰＵ
１７１  …  第２ロック取得部
１７２  …  第２カウンタ記録部
２００  …  解析装置
２１１  …  収集バッファ
２１２、２１２Ａ  …  時間変換テーブル
２２０  …  ログ解析部
２３０  …  表示部
９００  …  診断部
【図１】
2018036864.tif 000003
【図２】
2018036864.tif 000004
【図３】
2018036864.tif 000005
【図４】
2018036864.tif 000006
【図５】
2018036864.tif 000007
【図６】
2018036864.tif 000008
【図７】
2018036864.tif 000009
【図８】
2018036864.tif 000010
【図９】
2018036864.tif 000011
【図１０】
2018036864.tif 000012
【図１１】
2018036864.tif 000013
【図１２】
2018036864.tif 000014
【図１３】
2018036864.tif 000015