関数や変数のグループを特定のセクションに配置する方法
テクニカル・ノート 27498
アーキテクチャ:
ARM
コンポーネント:
linker
更新日:
2018/09/04 7:08
はじめに
このテクニカルノートでは、#pragma location ディレクティブを使用せずに、指定されたセクションに複数の関数または変数を配置する2つの方法について説明します。
解説
#pragma locationを使用して、名前付きセクションに1つの関数(または変数)を配置できます。
たとえば、次のように書きます。
#pragma location="MY_FUNC"
void f(void);
ただし、#pragma location は、配置する関数(または変数)が多数ある場合は使用できません。
以下に方法を説明します:
• 単一のpragmaディレクティブを使用して複数の関数/変数を配置する。
• リンカ配置ディレクティブを使用して、オブジェクトファイルからいくつかの関数を配置する
単一のpragmaディレクティブを使用して複数の関数/変数を配置
関数/変数の宣言と定義についてのデフォルトの配置と属性を設定するためのpragmaディレクティブが2つあります:
• #pragma default_variable_attributes
• #pragma default_function_attributes
これらの2つのプラグマディレクティブは、複数の#pragma location ディレクティブを使用する代わりに、複数の宣言と定義に単一の#pragma を使用することを可能にします。
これらの pragma ディレクティブの使用例
ソースコード中でいくつかの関数をMY_FUNC セクションに配置する。
#pragma default_function_attributes = @ "MY_FUNC"
int fun1(int x)
{
return x + 1;
}
int fun2(int x)
{
return x - 1;
}
/* Stop placing functions in section MY_FUNC */
#pragma default_function_attributes =
int fun3(int x)
{
return x + x;
}
/* Place following data in section MY_DATA */
#pragma default_variable_attributes = @ "MY_DATA"
int data1;
int data2;
/* Stop placing data in section MY_DATA */
#pragma default_variable_attributes =
int data3;
int main()
{
data1 = fun1(5);
data2 = fun2(5);
data3 = fun3(5);
return data1 + data2 + data3;
}
MY_DATA セクションの指定されたメモリアドレス範囲にすべてのデータを配置するために、リンカ設定ファイル(icf)に次の行を追加してください:
define region DATA_region = mem:[from 0x20000000 to 0x20001FFF ];
place in DATA_region { readwrite section MY_DATA };
MY_FUNC セクションの指定されたメモリアドレス範囲にすべてのコードを配置するために、リンカ設定ファイル(icf)に次の行を追加してください:
define region FUNC_region = mem:[ from 0x70000 to 0x70FFF ];
place in FUNC_region { readonly section MY_FUNC };
リンカ配置ディレクティブを使用して、オブジェクトファイルからいくつかの関数を配置
いくつかの#pragma location を使用するより便利な方法は、関数を別のソースファイルに置き、place in directive ディレクティブ使用して、リンカにオブジェクトファイルからすべての関数を選択させる方法です。
以下手順に従ってください:
1. 配置したい関数を1つ(またはいくつか)のソースファイルに集めます。
2. すでに書かれている全ての#pragma location ディレクティブを削除します。
3. .icfファイルを編集し、以下に例示するようにキーワードobject を含む place in ディレクティブを追加します。
.icfファイルに次の行を追加すると、ソースファイルUtilities.c のすべてのコードを指定されたメモリアドレス範囲に配置します:
define region UTILITIES_region = mem:[ from 0x71000 to 0x71FFF ];
place in UTILITIES_region { readonly object Utilities.o };
まとめ
特定のメモリアドレス範囲にデータ/コードを配置するために、いくつもの#pragma location ディレクティブを使用する必要はありません。 代わりに、ここに説明した方法を使用してください。
リンカ配置ディレクティブ place in の詳細については、「IAR C / C ++開発ガイド」の ‘セクションの選択’ 章を参照してください。
全ての製品名は、それぞれの所有者の商標または登録商標です