Skip to main content

IAR Embedded Workbench for Arm 9.70.x

ツールとアプリケーション間の相互処理

このセクションの内容:

リンクプロセスとアプリケーションでシンボルを相互処理する方法は以下の4種類があります。

  • リンカコマンドラインオプション‑‑define_symbolを使用してシンボルを作成する。リンカは、アプリケーションがラベル、サイズ、デバッガのセットアップなどとして使用できるパブリック絶対定数シンボルを作成します。

  • コマンドラインオプション‑‑config_defまたは設定ディレクティブdefine symbolを使用し、export symbolディレクティブを使用しシンボルをエクスポートして、エクスポート済み設定シンボルを作成する。LINKは、アプリケーションがラベル、サイズ、デバッガのセットアップなどとして使用できるパブリック絶対定数シンボルを作成します。

    このシンボル定義の利点の1つは、このシンボルを設定ファイルで式として使用できる点です。たとえば、メモリ範囲へのセクションの配置を制御するときなどに使用します。

  • 名前付きセクションまたはブロックに対して、コンパイラ演算子__section_begin__section_end、または__section_size、またはアセンブラ演算子SFBSFE、またはSIZEOFを使用する。これらの演算子は、、同じ名前を持つ連続したセクションのシーケンス、またはリンカー設定ファイルで指定されたリンカーブロックの開始アドレス、終了アドレスおよびサイズへのアクセスを可能にします。

  • コマンドラインオプション‑‑entryは、アプリケーションの開始ラベルをリンカに通知します。これは、リンカより、実行の開始位置をデバッガに通知するときのルートシンボルとして使用されます。

次のラインは-D を使用してシンボルを作成する方法を示します。この方法を使用する必要がある場合は、これらのオプションをこのようなコマンドラインに追加します:

‑‑define_symbol NrOfElements=10
‑‑config_def MY_HEAP_SIZE=1024

リンカ設定ファイルでは、次のように定義されています。

define region ROM = [from 0x00000 size 0x10000];
define region RAM = [from 0x20000 size 0x10000];

/* Export of symbol */
export symbol MY_HEAP_SIZE;

/* Setup a heap area with a size defined by an ILINK option */
define block MyHEAP with size = MY_HEAP_SIZE, alignment
= 8 {};

place in RAM { block MyHEAP };

以下の行をアプリケーションソースコードに追加します。

#include <stdlib.h>

/* Use symbol defined by ILINK option to dynamically allocate an array of elements
with specified size. The value takes the form of a label. */
extern int NrOfElements;

typedef char Elements;
Elements *GetElementArray()
{
  return malloc(sizeof(Elements) * (long) &NrOfElements);
}
/* Use a symbol defined by ILINK option, a symbol that in the
 * configuration file was made available to the application.
 */
extern char MY_HEAP_SIZE;
/* Declare the section that contains the heap. */
#pragma section = "MYHEAP"

char *MyHeap()
{
  /* First get start of statically allocated section, */
  char *p = __section_begin("MYHEAP");

  /* ...then we zero it, using the imported size. */
  for (int i = 0; i < (int) &MY_HEAP_SIZE; ++i)
  {
    p[i] = 0;
  }
  return p;
}