Everything

コンパイラ出力セクション名の変更(#pragma section)


コンパイラが出力するセクション名を切り替えます。

[機能]

-

コンパイラが出力するセクション名を切り替えます。
コンパイラが出力するセクション名とデフォルトの配置については,「6.1.1 セクション名」を参照してください。

-

#pragma指令以降に書いた宣言に作用します。

[効果]

-

特定のデータや関数の集まりに対してデフォルトとは異なるセクション名を付けることで,それらのデータや関数の集まりをほかのデータや関数とは別のアドレスに配置したり,セクション単位で特定の処理をすることが可能となります。

[方法]

#pragma section セクション種別 変更セクション名
        セクション種別:{text|const|data|bss}

指定した種別のセクションの名前を変更します。

 

#pragma section 変更セクション名

すべての種別のセクションの名前を変更します。

 

#pragma section

すべての種別のセクションの名前をデフォルト・セクション名にします。

 

-

変更セクション名に使用可能な文字は,次のとおりとします。
ただし,先頭は0~9以外の文字のみ使用可能とします。
また“.”はセクション種別を指定する場合のみ,先頭のみ使用可能であり,先頭を除く文字列内で使用した場合はコンパイル・エラーとなります。セクション種別を指定しない場合は,“.”を使用するとコンパイル・エラーとなります。

-

0~9

-

a~z

-

A~Z

-

.

-

@

-

_

-

セクション種別が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データのセクションとなります。

[制限]

-

割り込みベクタテーブルはセクション名を変更できません。

[使用例]

(1)

セクション名とセクション種別を指定する場合

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

(2)

セクション種別を省略する場合

#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;
}

(3)

セクション種別指定なしとありの混在の場合

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