Vitis ソフトウェア プラットフォームを使用したデバッグ

この章では、これまで説明してきたデザイン フローで可能なデバッグについて説明します。最初のオプションは、AMD Vitis™ソフトウェア プラットフォームを使用したデバッグです。

Vitis ソフトウェア プラットフォーム デバッガーには、次のデバッグ機能があります。

  • Arm® Cortex™-A72、Arm Cortex-R5F、および MicroBlaze™ プロセッサ アーキテクチャ上のプログラムのデバッグをサポート (ヘテロジニアス マルチプロセッサ ハードウェア システムのデバッグ)。

  • ハードウェア ボード上のプログラムのデバッグをサポート。

  • リモート ハードウェア システムでのデバッグをサポート。

  • プログラムをデバッグするための豊富な機能を備えた IDE を提供。

  • テスト スクリプトの実行および自動化のためのツール コマンド言語 (Tcl) インターフェイスを提供。

Vitis ソフトウェア プラットフォーム デバッガーを使用すると、プログラムの実行中に何が起こっているかを確認できます。プロセッサを停止するブレークポイントまたはウォッチポイントの設定、プログラムのステップ実行、プログラム変数およびスタックの確認、システム内のメモリの内容の確認などを実行できます。

Vitis ソフトウェア プラットフォームでは、システム デバッガーを使用したデバッグがサポートされます。

カスタマイズ システム デバッガー

Vitis ソフトウェア プラットフォーム デバッガーを使用すると、コードを 1 行ずつをステップ スルーできます。プロセッサを停止するブレークポイントまたはウォッチポイントの設定、プログラムのステップ実行、プログラム変数およびスタックの確認、システム内のメモリの内容の確認などを実行できます。

デバッガーでは、シングル アプリケーション デバッグと GNU デバッガー (GDB) によるデバッグがサポートされます。AMD のカスタマイズ済みシステム デバッガーは、オープンソース ツールから作成されたツールで、Vitis ソフトウェア プラットフォームに統合されています。システム デバッガーでは、hw_server がデバッグ エンジンとして使用されます。Vitis ソフトウェア プラットフォームは、各ユーザー インターフェイス操作を一連の TCF (Target Communication Framework) コマンドに変換し、システム デバッガーからの出力を処理して、デバッグされているプログラムの現在のステートを表示します。ハードウェア上のプロセッサとの通信には、hw_server が使用されます。次の図に、このデバッグ ワークフローを示します。

図 1: システム デバッガーのフロー

../../../../_images/quz1567060977342_LowRes.png

デバッグ ワークフローは、次の要素で構成されます。

  • 実行可能 ELF ファイル: ELF ファイルを実行できユーザー アプリケーションをデバッグするには、デバッグ用にコンパイルされた ELF ファイルを使用する必要があります。デバッグ ELF ファイルには、デバッガーへの追加のデバッグ情報が含まれ、ソース コードと元のソースから生成された 2 進数間が直接関連付けられます。ビルド コンフィギュレーションを管理するには、ソフトウェア アプリケーションを右クリックして [Build Configurations] → [Manage] をクリックします。

  • デバッグ コンフィギュレーション: デバッグ セッションを開始するには、Vitis ソフトウェア プラットフォームでデバッグ コンフィギュレーションを作成する必要があります。このコンフィギュレーションには、実行ファイル名、デバッグするプロセッサ ターゲットなど、デバッグ セッションを開始するのに必要な情報が含まれます。デバッグ コンフィギュレーションを作成するには、ソフトウェア アプリケーションを右クリックして [Debug As] → [Debug Configurations] をクリックします。

  • Vitis ソフトウェア プラットフォームの [Debug] パースペクティブ: [Debug] パースペクティブを使用すると、ワークベンチでプログラムのデバッグまたは実行を管理できます。ブレークポイントを設定、実行中のプログラムを一時停止、コードをステップ実行、変数の内容を確認するなど、プログラムの実行を制御できます。[Debug] パースペクティブを表示するには、[Window] → [Open Perspective] → [Debug] をクリックします。

Vitis ソフトウェア プラットフォームで、コードの修正、実行ファイルの構築、プログラムのデバッグというサイクルを繰り返すことができます。

注記

コンパイル後にソースを編集すると、デバッグ情報がソースに直接リンクされるため、行番号が変更されます。同様に、最適化されたバイナリをデバッグすると、実行トレース中に予期しないジャンプが発生することがあります。

Vitis ソフトウェア プラットフォームでのソフトウェアのデバッグ

この例では、Hello World アプリケーションのデバッグについて説明します。

APU または RPU で Hello World アプリケーションを作成しなかった場合は、「ベアメタル Hello World アプリケーションの実行」または「DDR メモリでのベアメタル Hello World アプリケーションの実行」の手順に従ってください。

hello world アプリケーションを作成したら、Vitis ソフトウェア プラットフォームで次の例を実行してソフトウェアをデバッグします。

  1. アプリケーションを右クリックし、[Build Project] をクリックしてアプリケーションをビルドします。

  2. 次の図に示すように、アプリケーション プロジェクトを右クリックし、[Debug As] → [Launch on Hardware (Single Application Debug)] をクリックします。

    ../../../../_images/image40.jpeg

    注記

    [Debug] パースペクティブは、[Window] → [Debug Perspective] をクリックしても起動できます。

    ../../../../_images/image41.jpeg

    注記

    このページに示されているアドレスは、システムで表示されているものと若干異なる場合があります。

    プロセッサが main() メソッドの始め部分にあり、プログラム実行が 0x00000000fffc0cf0 で停止していることがわかります。この情報は [Disassembly] ビューで確認できます。このビューに、アセンブリ レベルのプログラム実行が 0x00000000fffc0cf0 で一時停止していることが示されています。

    注記

    [Disassembly] ビューが表示されていない場合は、[Window] → [Disassembly] をクリックします。

  3. helloworld.c ウィンドウにも、C コードの最初の実行可能な行で実行が一時停止していることが表示されています。[Registers] ビューを選択し、プログラム カウンターである pc レジスタに 0x00000000fffc0cf0 が含まれていることを確認します。

    注記

    [Registers] ウィンドウが表示されていない場合は、[Window] → [Registers] をクリックします。

  4. helloworld.c ウィンドウの printf(“Hello World from APUnr”); を読み出すコード行の横の空白をダブルクリックします。これにより、printf コマンドにブレークポイントが設定されます。ブレークポイントの確認には、[Breakpoints] ウィンドウを使用します。

    注記

    [Breakpoints] ウィンドウが表示されていない場合は、[Window] → [Breakpoints] をクリックします。

  5. [Run] → [Step Into] をクリックし、init_platform () ルーチンにステップインします。プログラムの実行が 0x00000000fffc0cf0 の位置で一時停止します。コール スタックの深さは 2 レベルになります。

  6. [Run] → [Resume] をクリックし、プログラムをブレークポイントまで実行します。

    プログラムの実行は、printf コマンドを含むコードの行で停止します。[Disassembly] および [Debug] ウィンドウに、プログラムの実行が 0x00000000fffc0cf4 で停止していることが示されます。

    注記

    helloworld ソース コードを変更した場合、ウィンドウに表示される実行アドレスは異なる場合があります。

  7. [Run] → [Resume] をクリックし、プログラムを最後まで実行します。

    プログラムの実行が完了すると、[Debug] ウィンドウにプログラムが exit というルーチンで一時停止していることが示されます。これは、デバッガーの制御下で実行しているときに発生します。

  8. コードを複数回再実行します。シングル ステップ、メモリの検査、ブレークポイント、コードの変更、および print 文の追加を試してみます。ビューの追加および移動を試します。

    ヒント

    Vitis ソフトウェア プラットフォームのデバッグ ショートカット (ステップ イン (F5)、ステップ リターン (F7)、ステップ オーバー (F6)、および再開 (F8)) を使用できます。または、ツールバー ボタンを使用することもできます。

XSCT を使用したデバッグ

XSCT の一部として使用できる XSDB を使用してコマンド ライン モードでデバッグできます。この例では、XSCT を使用してベアメタル アプリケーション hello_world_r5 をデバッグします。

次の手順は、XSCT を使用して Arm Cortex-R5F にベアメタル アプリケーションをロードする方法を示しています。

この例は、XSDB/XSCT を使用して可能なコマンド ライン デバッグを示すことを目的としています。要件に基づいて、システム デバッガー GUI または XSCT のコマンド ライン デバッガーのいずれかを使用してコードをデバッグできます。すべての XSCT コマンドはスクリプト記述可能であり、これはこの例で説明するコマンドに当てはまります。

ターゲットの設定

  1. USB ケーブルでターゲット USB-JTAG コネクタとホスト コンピューターの USB ポートを接続します。

  2. SW1 を次の図のように設定して、ボードを JTAG ブート モードに設定します。

    ../../../../_images/image43.jpeg
  3. 電源スイッチ SW13 を使用してボードに電源を投入します。

  4. Vitis IDE ツールバーの [XSCT Console] ボタンをクリックして、[XSCT Console] ビューを開きます。または、[Xilinx] → [XSCT Console] をクリックしても XSCT コンソールを開くことできます。

    ../../../../_images/image44.jpeg
  5. [XSCT Console] ビューで、次の connect コマンドを使用して JTAG を介してターゲットに接続します。

    xsct% connect
    

    connect コマンドは、接続のチャネル ID を返します。

  6. pdi/bin ファイルを読み込みます。

    device program <path to .pdi file>
    

    注記

    PDI ファイルは C:\edt\edt_versal\edt_versal.runs\impl_1\edt_versal_wrapper.pdi にあります。Windows では、バックスラッシュがエスケープ文字として解釈されないように、パス名は中かっこで囲む必要があります。たとえば、{C:\path\to\file.pdi} のようにして、バックスラッシュがエスケープ文字として解釈されないようにします。これは、スラッシュを使用する Linux では必要ありません。

XSCT を使用したアプリケーションのロード

次に、XSCT を使用してアプリケーションをロードする手順を示します。

  1. xsct% targets を実行します。

    target コマンドにより、使用可能なターゲットがリストされ、各 ID を使用してターゲットを選択できます。ターゲット ID は、JTAG チェーンで検出されるときにターゲットに ID が割り当てられるため、セッションごとに変更できます。

    注記

    スクリプト記述などの非対話型の使用法では、ID を使用してターゲットを選択するのではなく、-filter オプションを利用してターゲットを選択できます。

    次の図に示すように、ターゲットが一覧表示されます。

    ../../../../_images/image45.png
  2. Arm Cortex-R5F コア 0 に hello_world_r5 アプリケーションをダウンロードします。

  3. RPU Cortex-R5F コア 0 のターゲット ID を選択します。

    tcl
    xsct% targets 3
    xsct% rst -processor
    

    rst-processoror コマンドは個々のプロセッサ コアのリセットをクリアします。AMD Versal™ デバイスを JTAG ブート モードで起動すると、すべての Cortex-A72 コアおよび Cortex-R5F コアがリセット状態に保持されるので、この操作は重要です。これらのコアでデバッグを実行する前に、各コアのリセットをクリアする必要があります。リセットは XSDB の rst コマンドでクリアできます。

    注記

    rst -cores コマンドは、現在のターゲットが子である、グループ (APU または RPU など) 内にあるすべてのプロセッサ コアのリセットをクリアします。たとえば、Cortex-A72#0 が現在のターゲットである場合、rst -cores は APU のすべての Cortex-A72 コアのリセットをクリアします。

    xsct% dow {C:\edt\edt_vck190\helloworld_r5\Debug\helloworld_r5.elf}

    または

    xsct% dow C:/edt/edt_vck190/helloworld_r5/Debug/helloworld_r5.elf

    ここで、ELF ファイルのセクションが順にダウンロードされるのが表示されます。XSCT プロンプトはダウンロードが正常に完了すると表示されます。次に、シリアル端末 (Tera Term、Minicom、または UART-0 USB シリアル接続用の Vitis ソフトウェア プラットフォーム シリアル端末インターフェイス) を設定します。

シリアル端末の設定

  1. 使用しているホスト コンピューターに応じて Tera Term または Minicom を使用し、端末セッションを開始します。COM ポートとボー レートを次の図に示すように設定します。

    ../../../../_images/image46.png
  2. ポート設定では、デバイス マネージャーで COM ポートを検証します。VCK190 ボードでは 3 つの USB UART インターフェイスを使用できます。最も小さい番号のインターフェイスに関連付けられた COM ポートを選択します。この例の UART-0 については、COM ポートに対して Interface-0 を選択します。

XSCT を使用したアプリケーションの実行およびデバッグ

  1. アプリケーションを実行する前に、main () にブレークポイントを設定します。

    xsct% bpadd -addr &main
    

    このコマンドにより、ブレークポイント ID が返されます。bplist コマンドを使用して挿入されたブレークポイントを確認できます。XSCT のブレークポイントの詳細を、XSCT で「help breakpoint」と入力して確認します。

  2. プロセッサ コアの実行を再開します。

    xsct% con
    

    コアがブレークポイントに到達すると、次のメッセージが表示されます。

    xsct% Info: Cortex-R5 \#0 Stopped at 0x10021C (Breakpoint)
    
  3. コアが停止しているので、レジスタを表示して確認します。

    xsct% rrd
    
  4. ローカル変数を表示します。

    xsct% locals
    
  5. ソース コードの行をステップ実行し、スタックト レースを表示します。

    tcl
    xsct% nxt
    Info: Cortex-R5 #0 Stopped at 0x100490 (Step)
    xsct% bt
    

    help コマンドを使用すると、ほかのオプションを表示できます。

    ../../../../_images/image47.png

    help running コマンドを使用すると、XSCT を使用してアプリケーションを実行またはデバッグするためのオプションを表示できます。

    ../../../../_images/image48.png
  6. コードを実行します。

    xsct% con
    

    ここで、UART-0 端末に Cortex-R5F アプリケーションのメッセージが表示されます。