Top Page [◀◀] 2 3 4 5 6 7 8 9 ... [▶▶] Last Page
__directmap UINT xxx = ADDR;
のように、direcmapでアドレスを指定して変数確保する実装をしています。
スタック領域は、アドレスを特に指定しているわけではないので、gapの最大領域に設定される設定になってます。
上記directmapで指定している変数のADDRをリンカが考慮してスタック領域を決めているのか否かがよく分かりません。ADDRの値によって、振る舞いが変わるような印象です。
①ADDR:0xFFC00のとき、
NUM FFE20H _@STBEG NUM FF98CH _@STEND
②ADDR:0xFFCE0のとき、
③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 わわい:
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: