Skip to main content

IAR Embedded Workbench for Arm 9.70.x

マクロ言語についてのリファレンス情報

このセクションの内容:

マクロ関数

C-SPY のマクロ関数は、C-SPY 変数定義と、マクロが呼び出されたときに実行されるマクロ文で構成されます。マクロ関数には任意の個数のパラメータを引き渡すことができます。また、マクロ関数は終了時に値を返すことができます。

C-SPY マクロの形式は、以下のとおりです。

macroName (parameterList)
{
  macroBody
}

ここで、parameterList にはコンマ区切りのマクロパラメータリスト、macroBody には C-SPY 変数定義および C-SPY 文を記述します。

タイプチェックは、マクロ関数に引き渡される値とリターン値のいずれでも実行されません。

マクロ変数

マクロ変数は、アプリケーション外で定義して配置される変数です。C-SPY式で使用できるほか、アプリケーションデータ(アプリケーションの変数値)を割り当てることができます。C-SPY 式の詳細については、C-SPY式を参照してください。

マクロ変数を定義する構文は、以下のとおりです。

__var nameList;

ここで、nameList にはコンマ区切りの C-SPY 変数名リストを指定します。

マクロ本体の外で定義したマクロ変数は、グローバルスコープになり、デバッグセッション全体に存在します。マクロ本体内部で定義されたマクロ変数は、その定義文の実行時に作成され、マクロから戻るときに破棄されます。

デフォルトでは、マクロ変数は符号付き整数として処理され、0 に初期化されます。式で C-SPY 変数に値を割り当てると、その式の型も変数に適用されます。以下に例を示します。

意味

myvar = 3.5;

myvardouble 型、値 3.5 になりました。

myvar = (int*)i;

myvarint 型ポインタになり、値は i と同一です。

表27 C-SPY マクロ変数の例 


C のシンボルと C-SPY マクロ変数の間で名前が重複する場合は、C-SPY マクロ変数の方が C の変数よりも優先されます。マクロ変数はデバッガホストに割り当てられるため、アプリケーションは影響されないことに注意してください。

マクロパラメータ

マクロパラメータは、デバイスサポートをパラメータ化するためのものです。名前付きパラメータは通常の C-SPY マクロ変数と同様に動作しますが、以下の点が異なります:

  • パラメータの定義はイニシャライザを持つことができます。

  • パラメータの値はオプションを使用して設定できます(IDEまたはcspybatを使用)。

  • オプションから設定した値は、イニシャライザで設定した値より優先されます。

  • パラメータには イニシャライザを与えるか、オプションで設定するか、あるいはその両方が必要です。そうでなければ、未定義エラーとなり、そのパラメータにアクセスするとランタイムエラーが発生します。

1 つまたは複数のマクロパラメータを定義する際の構文は以下の通りです。

__param param[=value, ...;]

コマンドラインオプション ‑‑macro_param を使用して、パラメータの値を指定します(‑‑macro_paramを参照)。

マクロ文字列

C のデータ型に加えて、マクロ変数にマクロ文字列の値を保持できます。マクロ文字列は C 言語文字列と異ななることに、注意してください。

C-SPY 式に "Hello!" などの文字列リテラルを書き込む場合、この値はマクロ文字列になります。char* はターゲットメモリの文字列を参照する必要がありますが、C-SPY ではターゲットメモリに実際に存在するいかなる文字列も使用できないため、これは C- 形式文字ポインタ char* ではありません。

__strFind または __subString などの組み込みマクロ関数を使用して、マクロ文字列を操作できます。結果として新しいマクロ文字列が作成されます。str + "tail" のような + 演算子を使用して、マクロ文字列を連結できます。str[3] などのサブスクリプションを使用して、個々の文字も取得できます。sizeof(str) を使用して、文字列の長さを取得できます。マクロ文字列はNULL 終了ではないことに注意してください。

マクロ関数 _ _toString を使用して、アプリケーション内の NULL 終了 C 文字列(char* または char[])からマクロ文字列に変換します。たとえば、アプリケーションに以下の C 文字列の定義があると仮定します。

char const *cstr = "Hello";

次に、以下のマクロの例を検討します。

__var str;         /* A macro variable */
str = cstr         /* str is now just a pointer to char */
sizeof str         /* same as sizeof (char*), typically 2 or 4 */
str = __toString(cstr,512)  /* str is now a macro string */
sizeof str         /* 5, the length of the string */
str[1]             /* 101, the ASCII code for 'e' */
str += " World!"   /* str is now "Hello World!" */

フォーマットした出力を参照してください。

マクロ文

マクロ文は、相当する C 文と同様に機能します。 以下の C-SPY マクロ文を使用できます。

expression;

C-SPY 式の詳細については、C-SPY式を参照してください。

注記

64 ビットのアーキテクチャでは、#PCは C-SPY マクロで明確ではありません。よって、64 ビット MCU をデバッグするときは、C-SPY マクロのAArch32 には#PC32、AArch64 には #PC64を使用する必要があります。32ビット MCU をデバッグするときは #PCを使用します。

条件文
if (expression)
  statement

if (expression)
  statement
else
  statement
ループ文
for (init_expression; cond_expression; update_expression)
  statement

while (expression)
  statement

do
  statement
while (expression);
return文
return;

return expression;

リターン値が明示的に設定されていない場合は、デフォルトでは signed int 0 が返されます。

ブロック

マクロ文をブロックとしてグループ化できます。

{
  statement1
  statement2
  .
  .
  .
  statementN
}

フォーマットした出力

C-SPY では、フォーマットした出力をさまざまな方法で生成できます。

__message argList;

[デバッグログ]ウィンドウに出力します。

__fmessage file, argList;

指定ファイルに出力します。

__smessage argList;

フォーマットした出力を文字列に格納して戻します。

ここで、argList は C-SPY の式か文字列をコンマで区切ったリストで、file_ _openFile システムマクロの実行結果です(__openFileを参照)。

[デバッグログ]ウィンドウにメッセージを出力するには、以下の手順に従います。

var1 = 42;
var2 = 37;
__message "This line prints the values ", var1, " and ", var2, " in the Debug Log window.";

この手順を実行すると、以下のメッセージが[デバッグログ]ウィンドウに出力されます。

This line prints the values 42 and 37 in the Debug Log window.

出力を指定のファイルに書き込む場合 :

__fmessage myfile, "Result is ", res, "!\n";

文字列を生成する場合 :

myMacroVar = __smessage 42, " is the answer.";

myMacroVar に、ここで文字列 "42 is the answer." が格納されます。

引数の表示フォーマットの指定

argList のスカラ引数(数値またはポインタ)のデフォルトの表示フォーマットは、後に : およびフォーマット指定子を記述することで変更できます。使用可能な指定子は次のとおりです。

%b

2 進数のスカラ引数

%o

8 進数のスカラ引数

%d

10 進数のスカラ引数

%x

16 進数のスカラ引数

%c

文字のスカラ引数

これらの指定子は、[ウォッチ]ウィンドウや[ローカル]ウィンドウで使用可能なフォーマットと同一ですが、プレフィックスや文字列 / 文字の前後の引用符は出力されません。

例:

__message "The character '", cvar:%c, "' has the decimal value ", cvar;

変数の値に応じて、以下のメッセージが出力されます。

The character 'A' has the decimal value 65

注記

単一引用符で括った文字(文字定数)は整数定数として処理され、文字としてフォーマットされません。以下に例を示します。以下に例を示します。

__message 'A', " is the numeric value of the character ", 'A':%c;

この場合、次のように出力されます。

65 is the numeric value of the character A

オプションで、その最小幅に整数をフォーマットするため、% と文字の間に数字を挿入することができます。バイナリ、8 進数、および 16 進数は 0 が左側に付けたされ、少数および文字はスペースが付け足されます。リクエストした最小幅に合わない数字は切り捨てられません

例 :

__message 31:%4x;     // 001f
__message 31:%4d;     //   31
__message 31:%8b;     // 00011111

注記

特定タイプ用デフォルトフォーマットは主に[ウォッチ]ウィンドウやその他の関連するウィンドウで使用できるように設計されています。例えば、タイプ char'A' (0x41) に、文字(主に C 文字列)用ポインタは 0x8102 "Hello" にフォーマットされるように、文字列部分には文字列の始めの部分(現在、60 文字まで)が表示されます。

char* 型の値の出力時にフォーマット指定子 %x を使用して、ポインタ値を16 進数表記で出力するか、またはシステムマクロ _ _toString を使用して全文字列値を取得します。