絶対番地配置指定(#pragma address)
|
絶対番地に配置する変数を定義したいモジュール中で#pragma address宣言を行うことにより,任意のアドレスに変数を配置することができます。
[機能]
[効果]
[方法]
- | 絶対番地に配置する変数を定義したいモジュール中で,#pragma address宣言を行います。 |
#pragma address [(]変数名=絶対アドレス[,...][)]
|
注 | 絶対アドレス:実効アドレス(C言語表記の2,8,10または16進数定数で記述) |
[制限]
- | #pragma address指定は,変数の宣言前にしてください。変数宣言後の#pragm aaddress指定は作用しません(警告も出力されません)。 |
- | const修飾した変数に対して#pragma addressを指定する場合はエラーとなります。【V1.04以前】 |
#pragma address i=0xf2000
const int i = 0; //エラー
|
- | 初期値付きで宣言した変数に対して#pragma addressを指定する場合はエラーとなります。【V1.04以前】 |
- | 初期値付きで宣言したconst修飾型でない変数に対して#pragma addressを指定する場合はエラーとなります。【V1.05以降】 |
#pragma address i=0xf2000
int i = 0; //エラー
|
- | #pragma addressを同一の変数に対して複数回指定した場合はエラーとなります。 |
#pragma address i=0xf2000
#pragma address i=0xf2000 //エラー
int i;
|
- | 異なる変数に対して同一アドレスを指定した場合,もしくは変数のアドレスが重なった場合はエラーとなります。 |
- | 暗黙,明示問わずにnearと指定した変数に対して#pragma address宣言する場合,指定した絶対アドレスが0x0F0000 〜 0x0FFFFFの範囲に無い場合はコンパイル・エラーとなります。指定した絶対アドレスがSFR領域である場合はリンク・エラーとなります。【V1.04以前】 |
- | 暗黙,明示問わずにnearと指定したconst修飾型でない変数に対して#pragma address宣言する場合,指定した絶対アドレスが0x0F0000 〜 0x0FFFFFの範囲に無い場合はコンパイル・エラーとなります。指定した絶対アドレスがSFR領域である場合はリンク・エラーとなります。【V1.05以降】 |
#pragma address n_i1=0xF0000
char __near n_i1; //コンパイル可
#pragma address n_i2=0xEFFFF
char __near n_i2; //エラー
#pragma address n_i3=0xEFFFF
char n_i3; //エラー
//-memory_model=small,mediumともにbssはnearであるため
#pragma address f_i=0xEFFFF
char __far f_i; //コンパイル可
|
- | 暗黙,明示問わずに,nearと指定したconst変数に対して指定したアドレスがミラー元領域にない場合,リンク・エラーとなります。【V1.05以降】 |
#pragma address i=0xf3000
const int i = 0; // エラー
|
[使用例]
Cソースを以下に示します。
#pragma address (io=0x0ffe00)
int io; //ioは0x0ffe00番地に配置
func(void){
io = 0;
}
|
アセンブリ・ソースにおける変数の宣言とセクション割り付けは以下となります。
.PUBLIC _io
.SECTION .bss, BSS
.ORG 0xFFE00
_io:
.DS 2
|
関数中では以下のコードが出力されます。
clrw ax
movw !LOWW(_io), ax
|
[備考]
- | #pragma address指定しても,変数にvolatile属性を自動付加することはしません。
オプション-volatileを使うことで,#pragma addressを含む全ての静的変数にvolatile属性を付加することができます。
個別にvolatileを付加する場合は,変数宣言にvolatileを付けてください。 |
- | 変数を特定の番地に割り当てるにあたっては,変数の整列条件を配慮してください。また,64Kバイト境界をまたいで配置しないようにしてください。 |