MAEC TOOL NEWS:
MAECT-M3T-NC308WA-021216D
M3T-NC308WA V.5.00 Release 1
ご使用上のお願い
|
M32C/80, M16C/80, M16C/70シリーズ用Cコンパイラ(アセンブラ・統合化開発環境付き) M3T-NC308WA V.5.00 Release 1 の使用上の注意事項を連絡します。
- 型修飾子 "near" および "far" で修飾された変数の配置に関する注意事項
- #pragma SECTIONでromまたはdataセクションの名称を変更する場合の注意事項
- 型修飾子 "near" および "far" で修飾された変数の配置に関する注意事項
- 1.1 内容
- 型修飾子 "near" (または "_near")および "far" (または "_far")で修飾して変数を定義した場合、変数が正しく配置されないことがあります。
なお、その変数をアクセスするコードのアドレッシングモード等は、修飾子に従って正しく生成されます。
コンパイルオプション "-fFRAM(-ffar_RAM)", "-fNROM(-fnear_ROM)" 等を指定した場合も、"near" および "far" の修飾をしている変数は正しく配置されないことがあります。
- 1.2 発生条件
- 以下3点の条件をすべて満たす場合に発生します。
- (1) 関数の外で変数が宣言されている。または、関数の中でstatic記憶クラスの変数が宣言されている。
- (2) (1)の変数の宣言に、型修飾子 "near", "far", "_near" または "_far" が使用されている。
- (3) (2)の型修飾子が、デフォルトの配置(またはオプションにより変数の配置が変更された場合には、その変更後の配置)とは異なる配置の修飾である。
- 1.3 発生例
"file_a.c"
-----------------------------------------------------------------------
int a;
int near b;
int far c;
int i = 0;
int near j = 1;
int far k = 2;
const int x = 3
const int near y = 4;
const int far z = 5;
-----------------------------------------------------------------------
"file_a.c" をオプション "-fFRAM", "-fNROM" を指定しないでコンパイルした場合に、"near" および "far" で修飾した変数が配置されるセクションを下表に示します。
条件を満たす変数は「誤った配置」で示すセクションに配置されます。
| 変数の宣言の記述 | 正しい配置 | 誤った配置 | 正誤 |
/* 初期値なし デフォルトは "near" */
int a;
int near b;
int far c; |
bss_NE
bss_NE
bss_FE |
bss_NE
bss_NE
bss_NE |
誤 |
/* 初期値あり デフォルトは "near" */
int i = 0;
int near j = 1;
int far k = 2; |
data_NE
data_NE
data_FE |
data_NE
data_NE
data_NE |
誤 |
/* const デフォルトは "far" */
const int x = 3;
const int near y = 4;
const int far z = 5; |
rom_FE
rom_NE
rom_FE |
rom_FE
rom_FE
rom_FE |
誤 |
|
- 1.4 回避策
- 以下の方法でソースを記述してください。
- (1) 正しいセクションに配置されない変数を、別のソースファイルで定義する。
- (2) (1)のソースファイルをオプション "-fFRAM", "-fNROM" を指定してコンパイルする。
- (3) 元のソースでその変数を定義している部分は、"extern" を付加し、(1)のソースで定義した変数を参照する。
[例:発生例の回避方法]
(1) 変数c,k,yを "file_b.c" で定義。
"file_b.c"
-----------------------------------------------------------------------
int far c;
int far k = 2;
const int near y = 4;
-----------------------------------------------------------------------
(2) "file_b.c" をオプション "-fFRAM", "-fNROM" を指定してコンパイル。
-----------------------------------------------------------------------
>nc308 -c -fFRAM -fFROM file_b.c
-----------------------------------------------------------------------
(3) "file_a.c" を以下のとおり変更。
"file_a.c"
-----------------------------------------------------------------------
int a;
int near b;
extern int far c; /* extern を付加 */
int i = 0;
int near j = 1;
extern int far k; /* extern を付加、初期値を削除 */
const int x = 3
extern const int near y; /* extern を付加、初期値を削除 */
const int far z = 5;
-----------------------------------------------------------------------
- 1.5 恒久対策
- 本内容は、次期バージョンアップで改修する予定です。
M3T-NC308WA V.5.00 Release 1 ご使用上のお願い
MAECT-M3T-NC308WA-021216D
- #pragma SECTIONでromまたはdataセクションの名称を変更する場合の注意事項
- 2.1 内容
- 単一ソースファイル中に、romまたはdataセクションに対する #pragma SECTION を複数行記述した場合、コンパイルが異常終了することがあります。
- 2.2 発生例
- (1) System Error が発生する例
file_c.c
------------------------------------------------------------
const int a = 0;
#pragma SECTION rom rom1
const int b = 1;
#pragma SECTION rom rom2
const int c = 2;
#pragma SECTION rom rom3
const int d = 3;
#pragma SECTION rom rom4
const int e = 4;
#pragma SECTION rom rom5
const int f = 5;
------------------------------------------------------------
- (2) コアダンプが発生する例
file_d.c
------------------------------------------------------------
int i = 0;
#pragma SECTION data data1
#pragma SECTION data data2
#pragma SECTION data data3
#pragma SECTION data data4
#pragma SECTION data data5
#pragma SECTION data data6
#pragma SECTION data data7
#pragma SECTION data data8
#pragma SECTION data data9
#pragma SECTION data data10
int j = 2;
------------------------------------------------------------
- 2.3 回避策
- romセクションやdataセクションを複数のセクションに分割する場合、変数を定義するソースファイルを各セクション毎に分割してください。
- [例:発生例の回避方法]
(1) "file_c.c" で定義しているセクションrom~rom5および変数を別のファイルで定義。
- 変数b,c,d,e,fを外部参照
file_c.c
--------------------------------------------------------
const int a = 0;
extern const int b, c, d, e, f;
--------------------------------------------------------
- rom1 セクションと変数bを定義
file_c_1.c
--------------------------------------------------------
#pragma SECTION rom rom1
const int b = 1;
--------------------------------------------------------
- ※ rom2~rom5もrom1と同様に別のファイルでセクションの定義と変数の定義を記述する。
- (2) "file_d.c" の不要な "#pragma SECTION" をコメント行に変更する。
------------------------------------------------------------
int i = 0;
/*#pragma SECTION data data1*/
/*#pragma SECTION data data2*/
/*#pragma SECTION data data3*/
/*#pragma SECTION data data4*/
/*#pragma SECTION data data5*/
/*#pragma SECTION data data6*/
/*#pragma SECTION data data7*/
/*#pragma SECTION data data8*/
/*#pragma SECTION data data9*/
#pragma SECTION data data10
int j = 2;
------------------------------------------------------------
- 2.4 恒久対策
- 本内容は、次期バージョンアップで改修する予定です。