変数のデフォルトの配置セクションは、次のとおりになります。
- | 初期値なし変数: B, B_2, B_1セクション |
- | 初期値あり変数: D, D_2, D_1セクション(ROM)、R, R_2, R_1セクション(RAM) |
- | const変数: C, C_2, C_1セクション |
配置する領域(セクション)を変更するには、#pragma sectionでセクション種別、セクション名を指定します。
#pragma section セクション種別 セクション名
変数宣言/定義
#pragma section
セクション種別を指定すると指定した種別のみがセクション名変更の対象になります。
尚、RXファミリC/C++コンパイラでは、変数のアライメント数に応じて配置するセクションを分けています。
例)
B : アライメント数が4バイトの初期値無し変数を配置
B_2: アライメント数が2バイトの初期値無し変数を配置
B_1: アライメント数が1バイトの初期値無し変数を配置
初期値あり変数の場合は、初期値がROMに配置されて、変数自体はRAMに配置されます(ROM/RAM両方の領域が必要になります)。スタートアップ・ルーチンのresetprg.cファイルを使用した場合は、INITSCT関数でROMの初期値をRAMの変数にコピーします。
セクション種別と生成されるセクションの関係は次のとおりです。
名称
|
セクション名称
|
属性
|
形式種別
|
初期値/書き込み
|
アライメント
|
定数領域
|
C*1*2
|
romdata
|
相対
|
有/不可
|
4byte
|
C_2*1*2
|
romdata
|
相対
|
有/不可
|
2byte
|
C_1*1*2
|
romdata
|
相対
|
有/不可
|
1byte
|
初期化データ
|
D*1*2
|
romdata
|
相対
|
有/可
|
4byte
|
D_2*1*2
|
romdata
|
相対
|
有/可
|
2byte
|
D_1*1*2
|
romdata
|
相対
|
有/可
|
1byte
|
未初期化データ
|
B*1*2
|
data
|
相対
|
無/可
|
4byte
|
B_2*1*2
|
data
|
相対
|
無/可
|
2byte
|
B_1*1*2
|
data
|
相対
|
無/可
|
1byte
|
switch文分岐テーブル領域
|
W*1
|
romdata
|
相対
|
有/不可
|
4byte
|
W_2*1
|
romdata
|
相対
|
有/不可
|
2byte
|
W_1*1
|
romdata
|
相対
|
有/不可
|
1byte
|
C++初期処理
後処理データ
|
C$INT
|
romdata
|
相対
|
有/不可
|
4byte
|
C++仮想関数表
|
C$VTBL
|
romdata
|
相対
|
有/不可
|
4byte
|
絶対アドレス変数
|
$ADDR_
<section>_
<address>*3
|
data
|
絶対
|
有無/可不可*4
|
-
|
可変ベクタ領域
|
C$VECT
|
romdata
|
相対
|
無/可
|
-
|
注 1. | sectionオプションまたは拡張子#pragma sectionでセクション名を切り替えることができます。
ただし、文字列リテラルなどデータの一部に#pragma sectionの影響を受けないものがあります。
詳しくは、4.2.3 #pragma指令の#pragma sectionの詳細説明を参照ください。 |
注 2. | セクション名切り替えの際に、アライメント数が4のセクションを指定することで、アライメントが1または2のセクション名も変更されます。#pragma endianでendianオプションと異なる指定のエンディアンを指定した場合、#pragma endian bigであれば_Bを、#pragma endian littleであれば_Lを、セクション名の後ろに付加した専用のセクションを生成し、該当データを格納します。
ただし、文字列リテラルなどデータの一部に#pragma endianの影響を受けないものがあります。
詳しくは、4.2.3 #pragma指令の#pragma endianの詳細説明を参照ください。 |
注 3. | <section>はC, D, Bのセクション名称、<address>は絶対アドレス値(16進数)になります。 |
注 4. | 初期値、書き込み操作は<section>の属性に従います。 |