Skip to main content

IAR Embedded Workbench for Arm 9.70.x

変数と式の扱いの概要

このセクションの内容:

このページでは、変数を参照するさまざまな方法と、関連するいくつかの概念について説明します。

変数と式の扱いの概要について

変数の値を参照、計算する方法はいろいろあります。これらの方法はベーシックなデバッグには適しています。

  • ツールチップウォッチは、エディタウィンドウで表示され、変数や、より複雑な式の値を表示するための最も簡単な方法です。マウスポインタで変数を指すだけで、 変数の横にその値が表示されます。

  • [自動]ウィンドウには、現在のステートメントやその近くにある文の変数や式が自動的に表示されます。実行が停止すると、ウィンドウは自動的に更新されます。

  • [ローカル]ウィンドウには、ローカル変数、つまりアクティブな関数の自動変数と関数パラメータが表示されます。実行が停止すると、ウィンドウは自動的に更新されます。

  • [ウォッチ]ウィンドウを使用すると、C-SPY式および変数の値をモニタできます。 実行が停止すると、ウィンドウは自動的に更新されます。

  • [ライブウォッチ]ウィンドウは繰り返しサンプリングを行い、アプリケーションの実行中に式の値を表示します。式の変数は、グローバル変数のように、静的に特定できる必要があります。

  • [静的変数]ウィンドウには、静的記憶寿命を持つ変数の値が表示されます。実行が停止すると、ウィンドウは自動的に更新されます。

  • [マクロクイック起動]ウィンドウと[クイックウォッチ]ウィンドウでは、式を評価するタイミングを細かく制御できます。

  • [シンボル]ウィンドウには、ランタイムライブラリのシンボルを含め、静的な位置を持つすべてのシンボル(すなわち、C/C++関数、アセンブララベル、静的記憶寿命変数)が表示されます。

変数を見るためのこれらの追加方法は、より高度な分析に適しています。

  • [データログ]ウィンドウと[データログサマリ]ウィンドウには、データログブレークポイントを設定して選択する最大4つの異なるメモリ位置へのアクセスログが表示されます。データログを使用すると、頻繁にアクセスするデータを容易に検索できます。データを特定したら、より効率的なメモリに配置するかどうかを検討できます。

  • [イベントログ]ウィンドウと[イベントログサマリ]ウィンドウには、実行がアプリケーションコードの特定位置を通過する際に生成されるイベントログ が表示されます。[タイムライン]ウィンドウは、共通の時間軸に相関するこれらのイベントログをグラフィックを使用して表示します。イベントのログを使用すると、プログラムのフローを解析したり、アプリケーションコードの特定の場所に関係するデータを点検するときに役立ちます。

    Cortex ITM通信チャンネルは、実行中のアプリケーションからC-SPYイベントログシステムにイベントを渡すときに使用されます。アプリケーションのソースコードで使用できる定義済のプリプロセッサマクロがあります。イベントログは、プログラムの実行時にこうしたマクロが渡されるたびに生成されます。各イベントとともに値を渡すことができます。この値は通常、変数またはレジスタの識別子か内容のどちらかです(スタックポインタなど)。値は8ビット、16ビット、32ビットのフォーマットで書き込むことができます。小さいサイズを使用すると、SWOワイヤで必要な帯域幅が少なくなります。イベントは関連のPC(プログラムカウンタ)の値があるかどうかに関わらず生成できます。PCの値によって、デバッガでイベントを実行されたコードに関連付けることができます。

これらのウィンドウの詳細については、アプリケーションタイムラインを参照してください。

C-SPY式

C-SPY 式には、関数呼び出しを除く任意の種類の C 言語の式を使用できます。また、以下に示すシンボルも使用できます。

これらのシンボルから構成された式を C-SPY 式と呼び、さまざまな方法でC-SPY 式をモニタできます。有効な C-SPY 式の例を以下に示します。

i + j
i = 42
myVar = cVar
cVar = myVar + 2
#asm_label
#R2
#PC32
my_macro_func(19)

いくつかの異なる関数で同じ名前で宣言された静的変数がある場合、 function::variableという記述を使用して、どの変数をモニタするかを指定します。グローバル変数(ファイルスコープで定義された変数)には、[静的変数]ウィンドウで変数を表すのと同じ構文 module\variable を使用できます。ウィンドウ例えば、source_a.csource_b.c という 2 つのソースファイルがあり、それぞれに同一の static int var = 0; 定義が存在する場合、特定の変数を指定するために source_a\var または source_b\var と記述できます。

注記

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

C/C++ シンボル

C シンボルは、アプリケーションの C ソースコードで定義したシンボルです。たとえば、変数や定数、関数(関数はシンボルとして使用できますが、実行はできません)。C 言語のシンボルは、その名前で参照できます。C++ シンボルに、C-SPY シンボルや式で有効でない関数呼び出しが暗黙的に含まれる場合があります。

注記

C/C++ で使用可能な一部の属性(たとえばvolatile)は、C-SPY で完全にサポートされていません。たとえば、次の行は C-SPY で認められません。

sizeof(unsigned char volatile __memattr *)

しかし、次の行は認められます。

sizeof(unsigned char __memattr *)

アセンブラシンボル

アセンブラシンボルは、アセンブララベルやレジスタ(たとえばプログラムカウンタやスタックポインタ、その他の CPU レジスタ)です。デバイス記述ファイルを使用する場合は、

I/O ポートなど、メモリにマッピングされたすべてのペリフェラルも、CPU レジスタと同様にアセンブラシンボルとして使用できます。デバイス記述ファイルの修正を参照してください。

アセンブラシンボルの頭に#が付いている場合は C-SPY 式で使用できます。

実行される内容

#PC32++

プログラムカウンタ値をインクリメント。

myVar = #SP

スタックポインタレジスタの現在の値を C-SPY 変数に割り当てます。

myVar = #label

myVarlabelのアドレスにある整数値に設定します。

myptr = &#label7

myptrlabel7をポイントするint * ポインタに設定します。

表18 C-SPY アセンブラシンボル式 


ハードウェアレジスタとアセンブララベルの名前が衝突する場合、ハードウェアレジスタが優先的に選択されます。そのような場合にアセンブララベルを参照するには、ラベルをバッククォート `(ASCII 文字 0x60)で囲む必要があります。以下に例を示します。以下に例を示します。

実行される内容

#PC32

プログラムカウンタを参照。

#´PC32´

アセンブララベルPC32を参照。

表19 ハードウェアレジスタとアセンブララベルの名前が衝突する場合の処理 


[レジスタ]ウィンドウには、デフォルトで使用できるプロセッサ固有のシンボルが、CPU レジスタレジスタグループに基づいて表示されます。レジスタウィンドウを参照してください。

C-SPYマクロ関数

マクロ関数は、C-SPY マクロ変数定義と、マクロが呼び出されたときに実行されるマクロ文から構成されます。

C-SPY マクロ関数とその使用方法の詳細については、マクロ言語の概要を参照してください。

C-SPY マクロ変数

マクロ変数の定義と配置はアプリケーションの外部で行われ、C-SPY 式で使用できます。C 言語のシンボルと C-SPY マクロ変数の名前が衝突する場合、C-SPY マクロ変数が C 言語の変数よりも優先的に選択されます。マクロ変数に代入すると、その値と型の両方に代入が行われます。

C-SPY マクロ変数とその使用方法の詳細については、マクロ言語についてのリファレンス情報を参照してください。

sizeofの使用

標準 C によればsizeof には 2 つの構文形式があります。

sizeof(type)
sizeof expr

前者がタイプ用で、後者が式用です。

注記

C-SPY では、sizeof演算子の使用時に式を括弧で囲いません。たとえば、sizeof (x+2)ではなくsizeof x+2を使用します。

変数情報の制限

C 言語の変数の値は、ステップポイント、すなわち文の先頭の命令と関数呼び出しの位置でのみ有効です。その場合、エディタウィンドウで淡い緑色で強調表示されます。実際には、変数の値はそれ以外の位置でもアクセスでき、正しい値を示すことがほとんどです。

プログラムカウンタがステートメントの内部でステップポイント以外の位置を指している場合は、そのステートメントまたはステートメントの一部は通常の強調表示色よりも薄い色で強調表示されます。

最適化の影響

コンパイラは、予想される動作が実行できる範囲内であれば、可能な限り自由にアプリケーションソフトウェアを最適化します。最適化によって、コードが影響を受けます。生成されたコードがソースコードにどう関連するかが明確でなくなり、デバッグがより困難になるためです。通常は、高いレベルで最適化を行うと、コードに変更が生じ、予想と違って、変数の値を参照できなくなります。

1 つ例を示します。

myFunction()
{
 int i = 42;
 ...
 x = computer(i); /* Here, the value of i is known to C-SPY */
 ...
}

変数iが宣言されてから実際に使用されるまで、コンパイラはその変数用のスペースをスタックやレジスタに確保する必要はありません。コンパイラはこのコードを最適化できますが、C-SPY はその変数が実際に使用されるまでその値を表示できなくなります。一時的に使用できない状態にある変数の値を表示しようとすると、C-SPY は以下のメッセージを表示します。

Unavailable

デバッグセッションで変数の値を常に把握する必要がある場合は、コンパイル時に一番低い最適化レベル、[なし]を指定する必要があります。