EEL pack02のメモリに関して

Former Member
Former Member

環境はCS+ for CC V8.01.00 [03 Dec 2018]  / CC-RL V1.08.00   /R5F100AE  /EEL pack02使用です。

セルフRAMリスト(R20UT2943JJ0302)を参照してFEF00H-FF07FHを空けてmapファイルは下記の状態です。

.monitor2   0000fe00 0000ffff 200 1
.dataR        000ff080 000ff160 e1 2
.bss           000ff162 000ffe05 ca4 2
.sdataR      000ffe20 000ffe20 0 2
.sbss          000ffe20 000ffe20 0 2
EEL_SDAT  000ffe20 000ffe20 1 2
FDL_SDAT  000ffe22 000ffe23 2 2

このときに関数の引数や関数内の変数がFF020HなどFEF00H-FF07FHの中に配置されることがあります。

EEL_ERR_INTERNALやRefreshの失敗などが起こっていて、これが原因だと思っています。

map上だと未使用に見えるのですが、セクション指定が足りないなどあるのでしょうか?

  • 空けるべき FEF00H-FF07FH を明示的に確保していないのでスタックに使われてるんでは?
  • わわいです
    ローカル変数や関数の引数はスタック上に確保されます
    スタックポインタの値を確認してみてください
  • Former Member
    Former Member
    fujita nozomuさん わわいさん
    回答ありがとうございます。
    SPを確認したら0xf070になっていて思いっきりかぶっていました。
    FEF00H-FF07FHをスタックで使わないようにするには、スタックの禁止領域など設定可能なのでしょうか?

    または、FEF00H-FF07FHを確保するには適当にセクションを作れば良いのでしょうか?
    その際はセクションの大きさなどはどのようにすれば指定可能でしょうか?
  • わわいです
    スタックは設定値から下方のアドレスに伸びて消費しますんで、スタックを0xfef00より小さいアドレスに設定すればいいです
    また、0xff07f以降に十分なRAM領域があるなら、その領域にスタックを設定することもできます
    このとき、他のセクションを侵食しないようスタックの消費量とともに検討の必要があります

    スタックのアドレスの設定法はお使いのツールチェイン(コンパイラ)のマニュアルに書いてあると思うので読んでみてください。

    #まあ、究極的にはインラインアセンブラで設定してやればいいんですが
  • Former Member
    Former Member
    わわいさん
    ありがとうございます。
    cstart.asmの MOVW SP,#LOWW(__STACK_ADDR_START)で
    任意にアドレスに設定してSPがそのアドレスに対応するのが確認できました。
    __STACK_ADDR_STARTと__STACK_ADDR_ENDのアドレスはユーザが
    直接指定できるものではないという理解です。
    また、__STACK_ADDR_START~__STACK_ADDR_ENDに関しては
    スタックの初期化を行う際のみ必要で初期化を行わなければサイズは特に関係ないという理解です。
  • わわいです
    RL78はあんまし使ったことないんでハズしてるところがあるかもですが、、
    スタックのエリアというのはサイズ制限ってのはできません。最初に設定すれば、使った分だけ消費します
    また、__STACK_ADDR_STARTと__STACK_ADDR_ENDですが、ツールチェインのマニュアルになんか記述はないでしょうか。普通はスタックのエリアをどっかで指定するかスタックセクションを定義して、その値が入るとかなんとかなってたと思います

    ややこしければ、そういう機能?は使わないで、自分でcstart.asmを修正して好きな値を設定すればいいです。
    注意すべきは、スタックポインタに設定する値はある程度制限があるのでCPUのマニュアルで確認することですね
    #4バイトアライメントにする必要があるとかなんとか
  • designさん、こんにちは。NoMaYと申します。

    以下の画面コピーのようにしてRAM領域を予約することが出来ると思います。ただし、それだけではリンク時に「W0561100:Cannot find "eel_reserved_n" specified in option "start"」ワーニングが出てしまいますので、どれかのCソースに以下の記述を追加してみて下さい。(変数サイズの -2 は(サイズ0とはいえ)sbss領域がレジスタ領域と重なってしまってリンクエラーになるのを回避する為です。)

    #pragma section bss eel_reserved
    uint8_t eel_reserverd[256-32-2];
    #pragma section



    なお、セクション名の最後に "_n" が付いているのはヘルプ記載の以下の理由によるものです。



    また、ヘルプでは、スタック領域の割付方法はリンクを辿ると以下のように説明されていますね。


  • Former Member
    Former Member
    わわいさん NoMaYさん
    回答ありがとうございます。
    スタックサイズを確認して開始位置を検討したいと思います。
    ご提示頂いた内容で任意サイズのRAMが確保できました。
    このときメモリ上ではeel_reserverdという表示になりますが、
    中身は0ではなくなっているのでEELで使用する内容になっているのかな?という感じでした。
  • designさん、こんにちは。NoMaYです。

    > 中身は0ではなくなっている
    それは不定値が見えているだけかも知れません。というのは、セクション種別としてはbssとしたのですが、このような非標準のbss種別のセクションは、標準のスタートアップルーチンではケアされない(スタートアップルーチンでは0クリアしない)からです。(同様に、非標準のdata種別のセクションも標準のスタートアップルーチンではケアされず、変数初期値のROM→RAMへのコピーが行われないです。ちなみに、IARコンパイラでは、このようなセクションは noinit という種別になるようで、このネーミングの意図が理解出来た瞬間、ナルホド、と思ったことがありました。)

  • Former Member
    Former Member in reply to NoMaY
    NoMaYさん
    確認したところ不定値になっていたようです。
    eel_reserverdを0で初期化して、EELinitを実行すると一部が
    0から書き換わるのが確認できたのでここが実際に使っているデータのようでした。

    意図通りの動作になりました。皆さん回答いただきありがとうございます。