Everything
A.1.1 配置領域を変更する

変数のデフォルトの配置セクションは、次のとおりになります。

-

初期値なし変数: 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の変数にコピーします。

セクション種別と生成されるセクションの関係は次のとおりです。

表 A.1

セクション一覧

名称

セクション名称

属性

形式種別

初期値/書き込み

アライメント

定数領域

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>の属性に従います。