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

RL78/G10マイコン スタック領域の把握

質問失礼致します。

初歩的な質問で申し訳ございません。

 

現在RL78/G10マイコンでソフトウェア開発を行っております。

[10ピン、ROM容量:2KB、RAM容量:256byte]

 

スタック領域範囲の確認方法をご教示いただきたいです。

 

CPUリセット後に逆アセンブルからスタックポインタのイニシャライズは確認する事ができました。

[ MOVW            SP,#0FED4H]

しかしこのアドレスから何処までが(何Byte?)スタック領域として設けられているのか確認する方法がわからない状態です。

 

大変恐縮でございますが、

ご回答の程宜しくお願い致します。

  • チョコです。

    RL78のスタック領域は未使用のRAM領域の中で、連続した一番大きい領域に設定されているはずです。

    通常は、SPに設定された値-1(ここでは、0xFFED3)からその直前にある変数の直後のアドレスまでが、スタック領域として使用できます。

  • In reply to チョコ:

    チョコさん

    早速のご回答大変感謝致します。

    もう少し教えて下さい。
    例えば使用するRAMはCS+のビルドの際に表示されると思うのですが、
    実際に使用するRAMは60byteだったとすると、
    スタック領域は「0xFFED3 ~ 60byte目のアドレス+1」となるという事でしょうか?

    スタック領域は、予め領域を設定されるので、容量は不変だと認識していたのですが、
    (使用するRAM領域にかかわらずスタック領域はSP-1 から16byteの範囲、など)
    使用するRAM容量によってスタック領域も左右するという事でしょうか?

    初歩的な質問で申し訳ございません。
    ご回答宜しくお願い致します。
  • In reply to sktytr:

    チョコです。

    >スタック領域は「0xFFED3 ~ 60byte目のアドレス+1」となるという事でしょうか?

    その領域がスタックとして使用可能と言うだけです。

    >スタック領域は、予め領域を設定されるので、容量は不変だと認識していたのですが

    CC-RL78では、変数領域で使用される領域以外をできるだけ確保しようとしているだけです。

    CC-RL78のスタートアップ・ルーチン(cstart.asm)のスタックの設定部分を以下に示します。

    CC-RL V1.00の場合には、38~40行目でスタック領域を64バイト確保しています。

    実際のSPの設定は56~60行目で行われています。CC-RL V1.00の場合には、38~40行目で指定した_stacktopが設定されていますが、

    それ以降のバージョンでは内部的に求められた__STACK_ADDR_STARTが設定されています。これが、前回の最も大きな連続した領域に

    当たるものです。(最新のバージョンはV1.08です。V1.00は現在は使われていないので、38~40行目は無効になります。)

     

    >使用するRAM容量によってスタック領域も左右するという事でしょうか?

    スタックとして使用可能な領域が変化するのであって、実際のスタック領域が変化する訳ではありません。

    プログラムで使用する変数領域は当然優先的に確保するので、残りをスタックに使うのはごく普通かと思われますが。

     

    実際にスタックがどれだけ使われるかは、どこで割り込みがかかってくるか等プログラムの動作で変動します。

    それらを考慮して、デバイスを選択することになるかと思います。

     

     

     

     

     

     

  • In reply to チョコ:

    チョコさん

    返信頂きありがとうございます。
    あともう一点程ご教示頂けないでしょうか。


    >その領域がスタックとして使用可能と言うだけです。
    →やっと理解しました。ありがとうございます。


    >CC-RL78のスタートアップ・ルーチン(cstart.asm)のスタックの設定部分を以下に示します。
    →ビルド時にアセンブリファイルを生成するようCS+で設定しているのですが、
     上記のようなスタック領域を確保している事が確認できる「.asm」ファイルが生成されません。「cstart.asm」のようなファイルはどうすれば生成されるのでしょうか?


    >プログラムで使用する変数領域は当然優先的に確保するので、残りをスタックに使うのはごく普通かと思われますが。
    →初歩的な質問で申し訳ありません。仰る通りの考え方だと思います。


    以上、ご回答宜しくお願い致します。
  • In reply to sktytr:

    チョコです。

    >ビルド時にアセンブリファイルを生成するようCS+で設定しているのですが、

    cstart.asmはアセンブリファイルの生成とは無関係です。

    CS+CC-RLでアプリケーション(CC-RL)で新しいプロジェクトを作成すると、

    下に示すようなファイルが自動で生成されます。

    2つのasmファイル(cstart.asmとhdwinit.asm)、main.c及びiodefine.hが自動的に生成されています。

    この中できちんとした中身があるのは、cstart.asm(スタートアップ・ルーチン)とiodefine.h(内蔵周辺機能を制御するレジスタの定義ファイル)の2つです。

    残り2つは、1からプログラムを作成するときに使う位で、殆どの人が使っている「コード生成(設計ツール)」を使うと無意味です。

    単に新規のプロジェクトを作成した状態でのプロジェクトをzipファイルにしたものを添付しておきます。

    RL78G10_2K.zip

  • In reply to sktytr:

    チョコです。

    >上記のようなスタック領域を確保している事が確認できる「.asm」ファイルが生成されません。「cstart.asm」のようなファイルはどうすれば生成されるのでしょうか?

    もしかして、CS+CC-RLではなく、CS+CA78K0Rの環境を使ってはいないでしょうか?

    CA78K0Rの場合には、cstart.asmのようなソースではなく、アセンブルした結果のライブラリの形で組み込まれるので、標準ではプロジェクトツリーに出てきません。

    cstart.asmはCA78K0Rをインストールしたディレクトリで、下に示す画面イメージのところにあります。

     

    この場合にも、RAMの一番大きな連続した空き領域がスタック領域に設定されます。

    これからRL78を始めるのであれば、CA78K0Rはあまりお勧めできません。今のうちにCC-RL78にした方がいいと思います。

    (CC-RL78の方がコード効率はいいですよ。)

  • In reply to チョコ:

    チョコさん

    CS+CA78K0Rの環境を使っています。
    今後はCC-RL78にしていこうと思います。


    「cstart.asm」をご教示頂いたフォルダで見つける事ができました ↓↓


    ******************************************************************************
    ;-----------------------------------------------------------------------------
    ; setting the stack pointer
    ;
    ; _@STBEG is created by linker with -S option.
    ;-----------------------------------------------------------------------------
    MOVW SP,#LOWW _@STBEG ;SP <- stack begin address

    ;-----------------------------------------------------------------------------
    ; clear stack area
    ;
    ; _@STEND is created by linker with -S option.
    ;-----------------------------------------------------------------------------
    MOVW HL,#LOWW _@STEND ;HL <- stack end address
    CALL !!_stkinit
    ******************************************************************************


    >この場合にも、RAMの一番大きな連続した空き領域がスタック領域に設定されます。
    →現状RAM領域は、 0xFFDE0~0xFFDF5の22byteを使用しています。
     スタックポインタは、0xFFED4に設定されておりますので、
     空領域は、0xFFDF6~0xFFED3の222byteとなり、ここがスタック領域になるということでしょうか?

    ******************************************************************************
             BASE   SIZE
    * gap * FFDF6H 000DEH
    ******************************************************************************

    上記の様に、
    生成されたmapファイル内においても、
    222byte(0xDE)と見られる記述が見つかりました。


    ご回答宜しくお願い致します。
  • In reply to sktytr:

    チョコです。
    >空領域は、0xFFDF6~0xFFED3の222byteとなり、ここがスタック領域になるということでしょうか?
    はい、そのはずです。
    ちなみに、0xFFED4からRAMの最後の0xFFEDFまではコンパイラが作業用で使用するために確保していると思われます。
  • In reply to チョコ:

    マイコンで動的データを使うのを私は避けてます。よって、RL78の動的データの扱いもほとんど勉強してません。マニュアルやソースコードをチョット見ただけでは確信が持てないのですが、空領域をスタック領域とヒープ領域で分けることになるのではないでしょうか?
    SHではHEWでワークスペース作成時にヒープエリアを設定しておかないとprintfが動作しないのでRL78のライブラリーも動的データを使っていることも予想されます。

  • In reply to チョコ:

    チョコさん

    回答ありがとうございます。

    >0xFFED4からRAMの最後の0xFFEDFまでは、
    >コンパイラが作業用で使用するために確保していると思われます。

    → 0xFFED4~0xFFEDFは下記が確保されておりました。
      この箇所がコンパイラが作業用で使用するために確保している領域という事でしょうか?

    ********************************************************************
      SP      (0xFFED4)
      @SEGBC   
      @SEGDE
      @SEGHL
      @FPRS
      @RTARG1
      @RTARG2
      @RTARG3
      @RTARG4
      @FPRXS
      @FPRF1
      @FPRF2  (0xFFEDF)
    ********************************************************************

    宜しくお願い致します。
  • In reply to sktytr:

    チョコです。
    >この箇所がコンパイラが作業用で使用するために確保している領域という事でしょうか?
    はい、そうです。
    各シンボルの意味はマニュアルにあるかもしれませんが、そこまで踏み込む意味は無いかと思います。
  • In reply to チョコ:

    チョコさん

    初歩的な質問なのにもかかわらず、
    丁寧にご回答頂きありがとうございました。

    自分でも深く調べ、聞かずとも理解できるように
    今後は努力していこうと思います。

    ありがとうございました。

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