-pic


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

[指定形式]

-pic

 

-

省略時解釈

プログラムセクションをPIC(位置独立コード)としてコード生成しません。

[詳細説明]

-

プログラムセクションをPIC(位置独立コード)としてコード生成します。

-

PICにおいては、関数呼び出しはすべてBSRまたはBRA命令を用いて行い、また関数のアドレスを取得するときはPCからの相対アドレスを用いるようにします。これによって、PICはリンク後に任意のアドレスに配置することができます。

[例]

-

関数呼び出し (ただし、branch=32の場合)

void func()
{
        sub();
}
 
[-picなし]
_func:
            MOV.L       #_sub,R14
            JMP         R14
 
[-picあり]
_func:
            MOV.L       #_sub-L11,R14
L11:
            BRA         R14

-

関数アドレスの取得

void func1(void);
void (*f_ptr)(void);
void func2(void)
{
     f_ptr = func1;
}
 
[-picなし]
_func2:
            MOV.L       #_f_ptr,R4
            MOV.L       #_func1,[R4]
            RTS
 
[-picあり]
_func2:
            MOV.L       #_f_ptr,R4
L11:
            MVFC        PC,R14
            ADD         #_func1-L11,R14
            MOV.L       R14,[R4]
            RTS

[備考]

-

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

-

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

-

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

void pic_func1(void), pic_func2(int), pic_func3(int);     /* PICになる       */
void (*fptr1_for_pic) = pic_func1;      /* PICアドレスを静的初期化で使用: エラー */
struct PIC_funcs{ int code; void (*fptr)(int); };
struct PIC_funcs pic_funcs[] = {
    { 2, pic_func2 },                   /* PICアドレスを静的初期化で使用: エラー */
    { 3, pic_func3 },                   /* PICアドレスを静的初期化で使用: エラー */
};

-

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

-

PIC機能については、「スタートアップ」の章の「PIC/PID機能の利用」の項目も参照してください。