Renesas Synergy™

FAQ 1008077 : スタック・エリアのアドレスを、C言語で記述しているプログラム上で使用できますか?

回答

デフォルトのスタート・アップ・モジュールでは、__stack は、外部変数定義(.globl宣言)をしていないので、他のファイルからの参照はできません。

__stack に.globl宣言をすれば、他のファイルからの参照が可能になります。

また、スタック・エリアは、最下位アドレスに__stackというシンボルを定義して、 スタック・ポインタに __stackのアドレスとサイズを加算したものを設定しています。
そのため、エンドのアドレスにシンボルはありません。

次のようにすることにより、スタック・エリアのエンドのアドレスの次のアドレスを定義することは可能になります。
スタック・エリアの最後のアドレスではないので注意してください。

        .set    STACKSIZE、 0x200
        .bss
        .globl  __stack                         -- 追加
        .globl  __stack_end                     -- 追加
        .lcomm  __stack, STACKSIZE, 4
        .lcomm  __stack_end, 0, 0               -- 追加

この定義により、Cソース上で、_stack、_stack_endのシンボルを参照することは可能です。

マッピングのイメージは、次のようになります。

__stackシンボルは、スタート・アップ・モジュールで、サイズを指定してあるのでCソースでは、次のように配列で定義してください。

extern unsigned long _stack[];


アセンブラで定義したラベルをC言語で使用する場合には、先頭のアンダーバー"_"を1つ削除した名前になります。
アセンブリ言語定義:__stack
C言語での参照:_stack 詳細については、ユーザーズ・マニュアル C言語編の章「プログラムの呼び出し」の「C言語関数とアセンブラ関数の呼び出し」を参照してください。

 

適用製品

V850用コンパイラパッケージ [CA850]
他にご質問がございましたら、リクエストを送信してください