Everything

絶対番地配置指定(#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バイト境界をまたいで配置しないようにしてください。