デバッグ

Arm Cortex-M3および-M4アプリケーションの見つけにくいバグを見つける方法

  • IAR
  • 5分間かかります
<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >Arm Cortex-M3および-M4アプリケーションの見つけにくいバグを見つける方法</span>

 

デバッグは開発において常に重要な要素であり、今日、ほとんどの開発者はJTAG/SWDデバッグプローブを利用することができます。しかし、比較的低価格のトレース・プローブを使用することで、開発者はアプリケーションの動作を理解する可能性がさらに広がり、困難な状況のデバッグが非常に容易になります。

Arm Cortex-M3または-M4コアをベースとするデバイスを選択した場合、その便利なオンチップデバッグロジックから多くのことを得ることができます。

デバッグ・アーキテクチャは、図1に示すように5つの主要ユニットで構成されています。これらの中には、ETM(Embedded Trace Macrocell)のようにオプションのものもあるので、お使いのデバイスにどれが実装されているかを確認する必要があるかもしれません。

how-to-find-hard-to-find_figure1.png

図1.ARM Cortex-M3およびM4デバイスのデバッグアーキテクチャ

SWO トレース

ITM(Instrumentation Trace Macrocell)は、低速アクセスポート経由で選択されたトレースデー タを提供する軽量トレースです。計測トレースは、I-jet のようなデバッグ・プローブを使用して利用することができます。ITM は、ソフトウェアトレース用に 32 チャンネルを提供し、ソフトウェアが SWO 経由でデバッガに配信するパケットを生成するために使用することができます。これは、コアがメッセージやデータを出力するために停止する必要がないため、非常に少ないオーバ ヘッドでコードのインスツルメンテーションに使用することが可能です。必要なのは、32 個の ITM スティミュラス・レジスタの 1 つに 1 回の書き込み操作だけです。一方、すべての命令がトレースされるわけではありません。

ITM は、別のユニットである DWT(Data Watchpoint and Trace)によってトリガされるトレース・イベントも処理します。DWT は、システムバスから情報を収集し、ITM にパケット化、タイムスタンプ、SWO チャネルへの配信のためのイベントを生成する一連の機能を提供します。

DWT には 4 つの独立したコンパレータ(ウォッチポイント)があり、アドレスが一致した時、 またはデータが一致した時にイベントを生成します。これらは ETM のトリガー、ITM パケットのトリガー、特定の条件下でのコードのブレークなど、 様々な用途に使用できます。ETM をトリガする 4 つのウォッチポイントのうちの 1 つを設定することは、長時間実行するアプリケーショ ンをデバッグする際に便利です。指定したアドレスでトレースデータ収集を開始・停止する単純なトレース 開始・停止ブレークポイントだけでなく、例えば、ある変数が特定の値に達した時など、複雑なトレース 開始・停止条件を設定することも可能になります。

DWTは、割り込みトレース機能と、プログラムカウンタレジスタを一定間隔でサンプリングするPCサンプラも提供します。サンプリングは実行される命令のほとんどを見逃す可能性があるため、アプリケーションの所在を完全に把握することはできませんが、アプリケーションがどの関数に時間を費やしたかについての情報を提供することができます。

組み込みトレース・マクロセル

ITM と DWT は非常に便利で、ほとんどの組込みプロジェクトには十分かもしれませんが、 時には、最も困難な問題を解決するために、さらに強力なデバッグモードが必要になります。ETM(Embedded Trace Macrocell)は、実行された命令の一つ一つをトレースすることで、マイクロコントローラの動作に関する比類のない洞察を提供し、他の方法では見つけることが難しい、あるいは不可能なバグを見つけることを可能にします。

ETMを使用するには、命令をメモリに保存できる特別なトレース・デバッグ・プローブが必要です。もちろん、メモリサイズによって、格納できる命令数(サンプル数)は制限されます。IAR システムズのトレースプローブ I-jet Trace for Arm Cortex-M は、一度に 4 ビットのトレースデータを読み取ります。4 ビットは、Arm Cortex-M デバイスの標準的なトレース幅です。I-jet Trace は最大 32Msamples の大容量のトレース・メモリを持っていますが、ETM プロトコルは圧縮されているため、サンプル数と命令数を 1 対 1 で対応付けることはできません。サンプルあたりの最大命令数は、完全な線形実行(コードにジャンプや分岐がない)の場合で 7.5 命令です。平均は4ビットサンプルあたり約2命令です。

DWT や ITM が提供するイベント・トレースとは異なり、ETM はアプリケーションが割り込みを受 信する前に何をしていたか、ISR が実行されている間に何をしていたか、割り込みから抜けた後に何が起こったかを知ることができます。ETM は、アプリケーションが割り込みを受ける前に何をしていたのか、ISR が実行されている間何をしていたのか、そして割り込みから抜けた後どうなったのかを知ることができます。要するに、押し付けがましくなく、リアルタイムでアプリケーションの動作を完全に把握することができます。

デバッグの場面でトレース・データを使う最も明白な方法は、例えば、実行がおかしくなったプログラ ムを追跡するときに、時間をさかのぼって見ることです。プログラムが逸脱した後に実行を停止し、トレース出力を調べることで、どこで問題が発生したかを確認することができます。

how-to-find-hard-to-find_figure2.jpg

図 2: IAR Embedded Workbench での ETM トレース出力の検索

トレースを使用する最も簡単な方法である、過去にさかのぼって実行を検証することに加えて、ETM トレースを使用することで可能になる他の便利な機能があります。コードカバレッジ解析は、コードのどの部分が実行され、どの部分が実行されていないかについての情報を提供します。この情報は、コードのすべての部分がテストされたことを確認できるため、テス トの際に非常に役立ちます。関数プロファイリングは、各関数に費やされている時間を示し、コードの最適化や改善に最も力を入れるべき場所を決定するのに役立ちます。サンプリングされた SWO トレースを使用した関数プロファイリングも有用ですが、これは ETM トレースで利用可能な完全なトレースデータではなく、統計的なプロファイルに基づいています。

IAR Embedded Workbench では、I-jet Trace のような ETM トレースを搭載したトレースプローブを使用することで、上記のすべての機能を使用することができます。