-pid


コンパイル・オプション / マイコンオプション

[指定形式]

-pid[={ 16|32 }]

 

-

省略時解釈

定数領域セクションC_8, C, C_2およびC_1、リテラルセクションLとswitch文分岐テーブルセクションW, W_2およびW_1をPID(位置独立データ)としません。

[詳細説明]

-

定数領域セクションC_8, C, C_2およびC_1、リテラルセクションLとswitch文分岐テーブルセクションW, W_2およびW_1をPID(位置独立データ)とします。

-

PIDのアクセスは、すべてPIDレジスタからの相対アドレスで行います。これにより、PIDはリンク後に任意のアドレスに配置することができます。

-

PID機能を実現するためには、汎用レジスタを1本消費します。

-

<PIDレジスタ>

-

下記の表の規則に基づき、fint_registerオプションの指定に応じてR9からR13のうちの1本を選択します。なお、fint_registerの指定がない場合はR13を選択します。

表 2.10

fint_registerオプションとPIDレジスタの関係

fint_registerオプション

PIDレジスタ

fint_register指定なし

R13

fint_register=0

fint_register=1

R12

fint_register=2

R11

fint_register=3

R10

fint_register=4

R9

 

-

PIDレジスタは、PIDのアクセスに使用する用途以外には使用されません。

-

<パラメータ>

-

パラメータは、PIDレジスタから定数領域セクションをアクセスする際の、オフセットの最大幅のビット数を16または32で選択します。

-

オフセット幅を省略してpidオプションを選択した場合の解釈は、pid=16です。pid=16では、PIDレジスタがアクセスできる定数領域セクションのサイズが64KB〜256KB(アクセス幅により変動する)に制限されます。pid=32では、PIDレジスタがアクセスできる定数領域セクションのサイズに制限はありませんが、PIDをアクセスするコードのサイズが増大します。

-

なお、pid=32 と 外部シンボル割り付け情報が有効なmapオプションを同時指定した場合は、割り付け情報により、PIDレジスタによるアクセスが可能な場合はpid=16と同じコードを生成します。

[例]

-

const修飾した外部参照シンボルをアクセス

extern const int pid;
int work;
void func1()
{
        work = pid;
}
[-pidなし]
_func1:
            MOV.L       #_pid,R4
            MOV.L       [R4],R5
            MOV.L       #_work,R4
            MOV.L       R5,[R4]
            RTS
[-pid=16あり] (*ただし、PIDレジスタがR13の場合)
_func1:
            MOV.L       _pid-__PID_TOP:16[R13],R5
            MOV.L       #_work,R4
            MOV.L       R5,[R4]
            RTS
            .glb        __PID_TOP
[-pid=32あり] (*ただし、PIDレジスタがR13の場合)
_func1:
            ADD         #(_pid-__PID_TOP),R13,R6
            MOV.L       [R6],R5
            MOV.L       #_work,R4
            MOV.L       R5,[R4]
            RTS
            .glb        __PID_TOP

-

const修飾した外部定義シンボルのアドレスを取得

extern const int pid = 1000;
const int *ptr;
void func2()
{
        ptr = &pid;
}
[-pidなし]
_func2:
            MOV.L       #_ptr,R4
            MOV.L       #_pid,[R4]
            RTS
[-pidあり] (*ただし、PIDレジスタがR13の場合)
_func2:
            ADD         #(_pid-__PID_TOP),R13,R5
            MOV.L       #_ptr,R4
            MOV.L       R5,[R4]
            RTS
            .glb        __PID_TOP

[備考]

-

PIDである領域のアドレスを、静的初期化の初期化式に使用しないでください。エラー E0523027となります。

-

PIDアドレスを静的初期化に用いる例:

extern const int pid_data1;            /* PIDになる                      */
const int *ptr1_for_pid = &pid_data1;  /* PIDのアドレスで静的初期化: エラー */
const int pid_data4[] = {1,2,3,4};     /* PIDになる                      */
const int *ptr2_for_pid = pid_data4;   /* PIDのアドレスで静的初期化: エラー */

-

PID機能を利用するアプリケーションプログラムのスタートアップを作成する際は、「スタートアップ」ではなく、「アプリケーションのスタートアップ」を参照ください。

-

pidオプション選択時は、同一の外部変数は、必ずファイル間でconst修飾を統一してください。これは、pidオプションはconst修飾のある変数をPIDにするためです。もしconst修飾の統一が不明な外部変数がある場合は、pidオプション(PID機能)は使用しないでください。

-

pidオブション選択時に、ファイル指定のあるmapオプションを有効にした場合、ファイル間で同じ外部変数に対してconst修飾が統一されていない外部参照変数に対して警告W0530809を表示することがあります。表示された変数はPIDとして扱います。

-

C++またはEC++コンパイル時は、pidオプションを選択できません。選択すると、警告W0511171を表示してpidの選択を無効とします。

-

pidオプション選択時は、base=rom=<レジスタ> を選択できません。選択すると、警告W0551149を表示してbase=rom=<レジスタ>の選択を無効とします。

-

pidオプションで選択されたPIDレジスタが、baseオプションでも選択された場合はエラーE0511150になります。

-

pidオプションとnouse_pid_registerオプションを同時に選択するとエラーE0511150になります。

-

アプリケーションおよびPID機能の内容については、「PIC/PID機能の利用」を参照してください。