ハードウェアトレース
Note
SOLID 2.2.0 以降で使用できます。
概要
ARMプロセッサの ETB または ETR ユニットの機能を使用し、命令トレースを取得・表示します。
- ETBトレース
CPU内蔵のトレース専用メモリにトレース情報を保存します。ターゲットの動作パフォーマンスに影響を与えませんが、保存可能なサイズが少ないというデメリットがあります。 利用可能な内蔵メモリのサイズはターゲットに依存しますが、一般的に8KBから64KB程度です。
- ETRトレース
ターゲットのRAM上にトレース情報を保存します。使用するサイズを指定可能で、ETBトレースと比べて大きなサイズのメモリを確保できます。 ただし、メモリバスを占有し、システムのパフォーマンスに大きな影響を与える可能性があります。また、メモリ帯域の問題でトレースデータのオーバーフローが多発する可能性があります。
利用可能なターゲット
ETBトレースを使用するには、SoCにETB(ETF)ユニットが搭載されている必要があります。
ETRトレースを使用するには、SoCにETRユニットが搭載されている必要があります。
準備
デバッガコンフィグ (
jetarm.cfg
) のROMテーブル設定 (CS_ROM_TBL
) に、必要なCoreSightコンポーネントのアドレスが正しく記述してください。ETBを使用する場合は、ETM/ETB(ETF)/Funnel の設定が必要です。
ETRを使用する場合は、ETM/ETR/Funnelの設定が必要です。
ETBの設定
プロジェクトのプロパティを開き
を編集します。
ハードウェアトレースの設定ダイアログで、 トレースタイプ を ETB に設定し、取得したいコアにチェックを入れます。
Note
ETBはトレースメモリが小さいため、複数コアを同時に選択すると目的の範囲のトレースを取得できない可能性が高くなります。
ETRの設定
ETRを使用する場合は、トレースデータをターゲット上のRAMに保存するため、その物理アドレスを指定する必要があります。 ここでは、メモリマップデザイナと連携する方法について解説します。
ハードウェアトレースの設定ダイアログで、 トレースタイプ を ETR に設定し、 SMMのシンボルからアドレスとサイズを取得 にチェックを入れます。
メモリマップデザイナと連携しない場合には、直接物理アドレスとサイズを指定してください。この場合、プログラムが使用するメモリ領域と重ならないように注意してください。
メモリマップデザイナに
ETR
という名前でメモリ領域を作成し、AttributeもETR
に設定します。 このとき、物理メモリを必ず指定してください。仮想アドレスはNO_ADDRESS
で問題ありません。
トレースデータの参照
デバッグを開始し、ブレーク後にメニューの
からトレースウィンドウを開くと、 実行を開始してからブレークするまでの実行履歴(トレースパケット)のダンプ結果が表示されます。コンテキストメニューから、逆アセンブルや関数表示などを選択すると、表示を切り替えられます。
逆アセンブル表示
実行履歴を逆アセンブルで表示します。
関数表示
関数の呼び出し履歴を表示します。
表示コアの切り替え
他のCPUコアのトレースを表示したい場合は、ハードウェアトレースウィンドウ左上のドロップダウンリストからコア番号を選択してください。
トレース設定
設定を行うには、ハードウェアトレースウィンドウの左上の設定アイコンをクリックしてください。
実行時のトレースの設定ダイアログが開きます。
サイクルカウンタ
この設定を有効にすると、逆アセンブル表示内に、Cycle count: に続いてサイクル数が表示されるようになります。 しきい値 を指定すると、サイクルカウントがこの値に達するまで出力されなくなります。
Note
しきい値を小さい値にした場合、より細かい範囲で実行に要したサイクル数を知ることができますが、サイクルカウンタのデータが頻繁に出力されトレースデータが増加するため、オーバーフローに繋がる可能性があります。
以下の画像は、サイクル数の表示例です。ある区間にかかったサイクル数を確認できます。 オーバーフローなど、何らかの原因でサイクルカウント出力が抑制される事があり、その場合には Unknown が表示されます。
ストールモード(オーバーフロー抑制)
Note
実装依存の機能のため、ターゲットによっては利用できない場合があります。
この設定を有効にすると、トレースユニットのFIFO内のデータがある一定のレベルに達した時に、CPUを停止させてオーバーフローを防ぎます。 ただし、頻繁にオーバーフローする環境で有効にすると、実行パフォーマンスに大きな影響を与えるため注意が必要です。
アドレス範囲
タスクIDやアドレスでトレースの範囲を絞り込むことが出来ます。
タスクID を指定すると、そのタスク以外のトレースが出力されなくなります。 また、開始アドレス と 終了アドレス を指定すると、そのアドレス範囲を実行したときのみにトレースが出力されます。
この設定によって劇的にトレースデータの量が削減できる可能性があるため、少ないトレースメモリ量でも対象の解析がしやすくなる場合があります。 また、トレースバスやターゲットメモリへの負荷も軽減され、トレースのオーバーフローを抑制する効果も期待できます。
参考
ETBとETRの比較
ETB |
ETR |
|
---|---|---|
取得可能なトレースの量 |
☓ |
○ |
オーバーフローの発生頻度 |
△ |
☓ |
ターゲットへの負荷 |
○ |
☓ |
設定の手間 |
○ |
△ |
ETBはCPUに内蔵されているトレース専用のメモリにトレースデータを保存するため、実行中のターゲットには影響をほぼ与えませんが、メモリサイズが小さい(8KB~64KB)ので、解析したい範囲が限定的な場合に向いています。
ETRはターゲットのRAMを使用するため、アドレスを設定(物理アドレス)する必要があります。また、DRAMコントローラが初期化される前には使用できません。
トレースのオーバーフローは、ターゲットプログラムの性質、トレースバスの帯域によって発生頻度が変化します。また、ETRの場合にはターゲットのメモリ帯域も影響します。
タイトなループを回っている場合(ブランチが多い場合)、トレースパケットのサイズが爆発しオーバーフローが発生する確率が高くなります。また、直接ブランチよりも間接ブランチが多い場合に発生しやすくなります。
トレースバスの帯域はターゲットとなるSoCに依存します。
ターゲットのメモリ帯域はSoCの他に、動作中のプログラムのメモリアクセス頻度も影響します。