Skip to main content

IAR Embedded Workbench for Arm 9.70.x

C-SPYマクロの概要

このセクションの内容:

C-SPY マクロを使用する理由

C-SPY マクロは、単独で使用することもできますが、複雑なブレークポイントおよび割り込みシミュレーションとともに使用することにより、さまざまなタスクを実行できます。マクロが役に立つ例をいくつか示します。

  • トレース出力、変数値の出力、ブレークポイントの設定などによるデバッグセッションの自動化。

  • ハードウェアレジスタの初期化などのハードウェア設定。

  • 実行中のアプリケーションへのシミュレーションしたデータの入力。

  • 周辺デバイスのシミュレーション。割り込みを参照してください。シミュレータドライバを使用している必要があります。

  • たとえば、スタックの深さを計算する関数など、簡単なデバッグユーティリティ関数の開発\arm\src\ディレクトリの例、stack.macを参照してください。

C-SPY マクロの使用の概要

C-SPY マクロを使用するには、以下のことを行う必要があります。

  • マクロ変数と関数を記述して、1つまたは複数のマクロファイルに収集

  • マクロを登録

  • マクロを実行

マクロの登録と実行については、いくつかの方法から選択できます。どの方法を選択するかは、操作や自動化のレベル、どの段階でマクロを登録および実行するかによって異なります。

セットアップマクロ関数およびファイルの概要

予約済のセットアップマクロ関数名がいくつかあります。これらは以下のような特定のタイミングに呼び出されるマクロ関数を定義する際に使用できます。

  • ターゲットシステムとの通信確立後、アプリケーションソフトウェアをダウンロードするまでの間

  • アプリケーションソフトウェアのダウンロードが完了した直後

  • リセットコマンドが発行されるたび

  • デバッグセッションの終了直後

マクロ関数を呼び出すタイミングを定義するには、予約済の名前でマクロ関数を定義、登録する必要があります。たとえば、アプリケーションソフトウェアをロードする前に特定のメモリエリアをクリアする必要がある場合は、マクロセットアップ関数 execUserPreload が適しています。アプリケーションソフトウェアをロードする前に一部の CPU レジスタやメモリにマッピングされたペリフェラルを初期化する必要がある場合にも、この関数は適しています。

これらの関数をセットアップマクロファイルに定義します。これは C-SPY の起動前にロードできます。 この場合、マクロ関数は C-SPY を起動するたびに自動的に登録されます。これは、C-SPY の初期化を自動化する場合や、複数のセットアップマクロファイルを登録する必要がある場合にも使用できます。

各セットアップマクロ関数の詳細については、予約済みのセットアップマクロ関数名についてのリファレンス情報を参照してください。

メモリの再配置

Arm を基本とする多くのプロセッサに共通する機能は、メモリの再配置機能です。メモリコントローラでは、リセット後に、フラッシュのような不揮発性メモリにアドレスのゼロをマッピングするのが一般的です。メモリコントローラを設定することで、RAM をアドレスマップのゼロに配置し、不揮発性メモリをアドレスマップの上位に配置するように、システムメモリを再配置することができます。再配置することで、例外テーブルは RAM に置かれ、ターゲットハードウェアにコードをダウンロードしたときに簡単に修正できます。C-SPY でこれを処理するには、セットアップマクロのexecUserPreload() 関数が適しています。例については、メモリの再配置を参照してください。

マクロ言語の概要

マクロ言語の構文は C 言語に非常によく似ています。以下の共通点があります。

  • マクロ文はCの文と似ています。

  • マクロ関数を、パラメータとリターン値の有無を指定して定義できます。

  • Cライブラリ関数に似た定義済み組み込みシステムマクロ。ファイルのオープンやクローズ、ブレークポイントの設定、割り込みシミュレーションの定義など便利なタスクを実行できます。

  • マクロ変数。グローバルかローカルのどちらかで、C-SPY式で使用できます。

  • マクロ文字列。定義済システムマクロを使用して操作することができます。

マクロ言語のコンポーネントの詳細については、マクロ言語についてのリファレンス情報を参照してください。

以下に示すマクロ関数の例では、マクロ言語のさまざまなコンポーネントが示されています。

__var oldVal;
CheckLatest(val)
{
 if (oldVal != val)
 {
  __message "Message: Changed from ", oldVal, " to ", val, "\n";
  oldVal = val;
 }
}

注記

マクロの予約語は、名前の衝突を避けるために、2 連のアンダースコアで始まります。