Renesas Synergy™

FAQ 1008103 : Cソースで、あるセクションのアドレス値を使用するには?

 

回答

CA850では、.data や .sdata などのセクションの先頭と末尾を指すシンボル(予約シンボル)が用意されています。
命令規則は、

 

先頭シンボル :__sセクション名
末尾シンボル :__eセクション名


です。
たとえば、.sbss セクションの先頭シンボルは __ssbss、末尾シンボルは __esbss という名前になります。
予約シンボルの一覧については、ユーザーズ・マニュアル 操作編の章「リンカ」の 「予約シンボル」を参照してください。


これらのシンボルを使用することにより、セクションの先頭アドレスと末尾アドレスを取得することができますが、C言語レベルでは、これらのシンボル名を使用して直接参照することはできません。
これらのシンボル値を取得するには、この値を格納するグローバル変数を作成し、 スタート・アップ・モジュールなどのアセンブラ・ソースにて、変数にシンボル値を格納します。
その変数をCソースにて参照するということによって実現することができます。
これは __gp_DATA などのシンボルについても同じです。

たとえば、.data セクションの先頭アドレスと末尾アドレスを取得する方法は、 次のようになります。

 

(アセンブラ・ソース内で)
--------------------------
  .comm	_data_top, 4, 4
  .comm	_data_end, 4, 4

  .extern __sdata, 4
  .extern __edata, 4

  mov	#__sdata, r12
  st.w	r12, $_data_top
  mov	#__edata, r13
  st.w	r13, $_data_end
--------------------------

(Cソース内で)
-------------------------------
  extern int data_top; /* data_topとdata_endを */
  extern int data_end; /* extern宣言する */

  void
  func1(void)
  {
      int top, end;

      top = data_top;
      end = data_end;
          ・
          ・
          ・
  }
-------------------------------

2つのグローバル変数分のメモリが確保されることになってしまうため、効率は悪いですが、 現在の仕様では、この方法がC言語レベルで参照するための最もよい方法であります。
特定のセクションのみを、C言語レベルで初期化するような場合、この方法を用いてみてください。

 

 

適用製品

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