Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

directmapとスタック領域の関係について

__directmap UINT xxx = ADDR;

のように、direcmapでアドレスを指定して変数確保する実装をしています。

スタック領域は、アドレスを特に指定しているわけではないので、gapの最大領域に設定される設定になってます。

上記directmapで指定している変数のADDRをリンカが考慮してスタック領域を決めているのか否かがよく分かりません。ADDRの値によって、振る舞いが変わるような印象です。

①ADDR:0xFFC00のとき、

    NUM FFE20H _@STBEG
    NUM FF98CH _@STEND

②ADDR:0xFFCE0のとき、

    NUM FFE20H _@STBEG
    NUM FF98CH _@STEND

③ADDR:0xFFD00のとき、

   NUM FFD00H _@STBEG
   NUM FF98CH _@STEND

④ADDR:0xFFE00のとき、

    NUM FFE00H _@STBEG
    NUM FF98CH _@STEND

 

結果を見る限りですが、

・③と④を比較すると、ADDRの値を考慮して、スタック領域が決められれているようです。

・①や②を見ると、ADDRがスタックの範囲内に設定されているので、ADDRの値が考慮されてないようです。

・②と③を比較すると、②の方がADDRの値が小さいのに、スタック開始位置は③の方が大きくなってます。

マイコン:rl78 / 環境:78KOR 

 

どのように、スタック領域が計算されているのか教えていただけないでしょうか。

よろしくお願いします。

  • わわいです
    スタックの値がどうなるかは、ソースのどこかに設定があるはずです。
    コンパイラ/ツールチェインのマニュアルにその設定法が書いてあるので読んでみましょう

    んで、変数のアドレスの直接指定ですが、コンパイラやリンカは、そのアドレスの関しては全く関知しません。たとえスタックエリアとかぶろーが、他のセクションを破壊しようがコードに書いた言いなりに設定してくれます。
    なので、そのアドレスに関しては、あなたが十分考慮して破綻しないように決める必要があります
  • In reply to わわい:

    わわいさん、ありがとうございます。
    >変数のアドレスの直接指定ですが、コンパイラやリンカは、そのアドレスの関しては全く関知しません。
    ①と②で、スタック領域とかぶってしまうのは分かりました。
    ただ、最初のポストに書いたように、③と④の結果を見ると、関知しているように思えます。
    ②と③を比較すると、②の方がADDRの値が小さいのに、スタック開始位置は③の方が大きくなってしまうのも、メカニズムが説明できないように思えます。

    スタックの値がどうなるかというのはスタックの領域がどうなるかということでしょうか?
    STBEGとSTENDは、gapの一番大きな範囲で設定されるのは、マニュアルに記載されてるので、分かってます。
    directmapを使う場合は、スタック領域を自分で設定しないといけないのは理解しました。
    私が得た結果のメカニズムが知りたいです。

    よろしくお願いします。
  • In reply to aoppy:

    わわいです。
    繰り返しになりますが、それを知りたいなら、お使いのコンパイラ/ツールチェインのマニュアルを読んでください。
    そこに書いていないというのであれば、そいつのメーカに問い合わせましょう
  • aoppyさん、こんにちは。NoMaYと申します。

    コンパイラはCA78K0Rですね。ちょっと調べてみようかと思います。(ちなみに、私はルネサスのサポート要員では無くて、単にかふぇルネのユーザです。なので、仕組みを推測出来ても、本当のところまでは分からないですが、、、あと、推測出来ないかも知れません、、、)

  • aoppyさん、こんにちは。NoMaYです。

    調べてみたところ、ヘルプの記載(以下の画面コピー)から__directmapは以下の仕様/制限であることが分かりました。従って、aoppyさんの投稿の変数xxxに対して、③④ではCA78K0Rが自動的に領域を確保していたが、①②ではプロジェクトで自力で領域を確保しなければ領域は確保されていないので、スタック領域があのように設定されていた、ということです。

    (A) 指定可能なアドレス指定範囲と指定アドレスに対する領域確保用モジュールがリンクされる領域確保範囲が異なり、CA78K0Rが自動的に領域を確保するのは 0xffd00~0xffeff の範囲のみである。

    (B) 上記の領域確保範囲外のアドレス指定を行った場合、変数領域は確保されないので、ディレクティブ・ファイルを記述するか、領域確保用モジュールを別途作成する必要がある。

    以下、私が試したプロジェクトのファイル一式です。(CS+ for CA,CX+CA78K0Rのプロジェクトです。)

    check_directmap_directive_20190711.zip

    以下、ヘルプの画面コピーです。(赤枠/赤文字は私によるものです。)


  • In reply to NoMaY:

    NoMaYさん
    わざわざ調べていただいてありがとうございました。
    原因が分かりました。
    大変助かりました。

    わわいさん
    重ねてありがとうございました。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page