コンパイラ出力セクション名の変更(#pragma section)
|
コンパイラが出力するセクション名を切り替えます。
[機能]
- | コンパイラが出力するセクション名を切り替えます。
コンパイラが出力するセクション名とデフォルトの配置については,「6.1.1 セクション名」を参照してください。 |
- | #pragma指令以降に書いた宣言に作用します。 |
[効果]
- | 特定のデータや関数の集まりに対してデフォルトとは異なるセクション名を付けることで,それらのデータや関数の集まりをほかのデータや関数とは別のアドレスに配置したり,セクション単位で特定の処理をすることが可能となります。 |
[方法]
#pragma section セクション種別 変更セクション名
セクション種別:{text|const|data|bss}
|
指定した種別のセクションの名前を変更します。
すべての種別のセクションの名前を変更します。
すべての種別のセクションの名前をデフォルト・セクション名にします。
- | 変更セクション名に使用可能な文字は,次のとおりとします。
ただし,先頭は0~9以外の文字のみ使用可能とします。
また“.”はセクション種別を指定する場合のみ,先頭のみ使用可能であり,先頭を除く文字列内で使用した場合はコンパイル・エラーとなります。セクション種別を指定しない場合は,“.”を使用するとコンパイル・エラーとなります。 |
- | セクション種別がtextであればその#pragma宣言以降に定義された関数のセクション名を変更します。
ただし,割り込みハンドラの先頭アドレスは16ビットでアドレッシングできなければなりません。 |
- | セクション種別がconst,data,またはbssの場合は,その#pragma宣言以降に実体を定義したconst,data,またはbssのセクション名を変更します。 |
- | セクション種別と変更セクション名の両方を指定する場合,セクション名には以下の規則で文字列を付加します。 |
- | near セクション(.text, .const, .data, .bss)
変更セクション名 + "_n" |
#pragma section data MyData
int __near ndata = 5; //生成セクション名 : MyData_n
|
- | far セクション(.textf, .constf, .dataf, .bssf)
変更セクション名 + "_f" |
#pragma section bss MyBss
int __far fdata; //生成セクション名 : MyBss_f
|
- | saddr セクション(.sdata, .sbss)
変更セクション名 + "_s" |
#pragma section bss MyBss
int __saddr sdata; //生成セクション名 : MyBss_s
|
|
#pragma section
text MyText
|
#pragma section
bss MyBss
|
#pragma section
data MyData
|
#pragma section
const MyConst
|
void __near func() { }
|
MyText_n
|
|
|
|
void __far func() { }
|
MyText_f
|
|
|
|
int __near i;
|
|
MyBss_n
|
|
|
int __far i;
|
|
MyBss_f
|
|
|
int __saddr i;
|
|
MyBss_s
|
|
|
int __near i = 5;
|
|
|
MyData_n
|
|
int __far i = 5;
|
|
|
MyData_f
|
|
int __saddr i = 5;
|
|
|
MyData_s
|
|
const int __near i = 5;
|
|
|
|
MyConst_n
|
const int __far i = 5;
|
|
|
|
MyConst_f
|
- | 変更セクション名のみを指定する場合,その#pragma宣言以降にあるプログラム領域,定数領域,初期化データ領域,および未初期化データ領域のすべてのセクション名を変更します。この場合,各セクションの変更後のセクション名は,現在のセクション名の後に変更セクション名の文字列を追加し,更に_s/_n/_fのいずれかを付けたセクション名となります。現在のセクション名に_n/_fが付いている場合は,それを取り除きます。 |
#pragma section bss XXX
int __near i; //セクション名はXXX_n
#pragma section YYY
int __far j; //セクション名はXXXYYY_f
//bss はnear/far まとめてセクション名が変化するため,
//__farでもXXXが付加される。
|
- | セクション種別も変更セクション名も記述しなかった場合は,その#pragma宣言以降にあるプログラム領域,定数領域,初期化データ領域,および未初期化データ領域の全てのセクション名をデフォルト・セクション名に戻します。 |
- | #pragma sectionを関数内に記述した場合,有効範囲は関数内に限らず記述位置以降すべてとなります。関数内でtextのセクションを変更した場合,次の関数から有効となります。switchテーブルのセクション配置は,各関数の先頭時点で指定したconstデータのセクションとなります。 |
[制限]
- | 割り込みベクタテーブルはセクション名を変更できません。 |
[使用例]
int __near ni_1; //.bss
int __far fi_1; //.bssf
#pragma section bss MyBss
int __near ni_2; //MyBss_n
int __far fi_2; //MyBss_f
#pragma section
int __near ni_3; //.bss
int __far fi_3; //.bssf
|
#pragma section abc
int __near na; //.bssabc_n セクションに配置
int __far fa; //.bssfabc_f セクションに配置
int __near ni=1; //.dataabc_n セクションに配置
int __far fi=1; //.datafabc_f セクションに配置
const int __near nc=1; //.constabc_n セクションに配置
const int __far fc=1; //.constfabc_f セクションに配置
void __near f(void) //.textabc_n セクションに配置
{
na=nc;
}
#pragma section
int __near nb; //.bss セクションに配置
void __near g(void) //.text セクションに配置
{
nb=nc;
}
|
int __near ni_1; //.bss
int __far fi_1; //.bssf
#pragma section bss MyBss
int __near ni_2; //MyBss_n
int __far fi_2; //MyBss_f
#pragma section XXX
int __near ni_3; //MyBssXXX_n セクションに配置
int __far fi_3; //MyBssXXX_f セクションに配置
#pragma section
int __near ni_4; //.bss
int __far fi_5; //.bssf
|