プロが教えるわが家の防犯対策術!

スタック領域について教えて下さい。

[動作環境]
 開発環境:ルネサス HEW Version 4.08
 マイコン:ルネサス H8/1653
 コンパイラ:H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ V7.00


HEWにて新規作成しますと、セクション定義にスタック領域(S)のアドレスと
stacksct.h 内に スタック領域のサイズ #pragma stacksize 0x200
が自動で生成されると思います。
しかし、入手したH8/1653用のサンプルには #pragma stacksize のような
サイズ指定がありませんでした。


[サンプル]
(1)セクション定義やスタック領域のサイズ指定が無い
(2)サブコマンドファイル(xxxx.sub)内でアドレスは設定されているが
サイズの設定が無い。

-- サブコマンドファイル(xxxx.sub)--
START CStart/00000000;
START P,C,D/00000400;
START B,R/00FF2000;
START S/00FFC000;


[質問]
 質問1
  (1)のスタック領域はどこに配置されるのでしょうか?

 質問2
  (2)のスタック領域は 00FFC000 を基準にどう確保
  されるのでしょうか? (a)の方向へ確保?(b)の方向へ確保?
  
      00F00000 (a)
        ↑
      00FFC000 (設定アドレス)
        ↓
      00FFFFFF (b)
     

 質問3
  (1)、(2)共にスタック領域と同時にヒープ領域も指定がありません。
  これらは指定しなくても問題ないものなのでしょうか?
  また、熟練者の方は指定しないものなのでしょうか?

よろしくおねがいします。

A 回答 (4件)

すみません、「前置デクリメント」でした。

    • good
    • 0
この回答へのお礼

TaketsuruOishiさん
No2.と合わせてお礼させ頂きます。回答ありがとうございます。
参考URLまで教えて頂き感謝します。
アドレスの低いほう(小さい方)へ向かうと思っていたのですが、
#pragma stacksize というのがあったので混乱していました。
ようやく意味が理解できました。
本当にありがとうございました。

お礼日時:2011/03/02 19:42

No.1 です。


大きな間違いをしていたようで、失礼しました。

この場合だと、stakcsize の指定は、RAM の最大値 - スタックサイズ > データ領域の最大値 の関係を満たす必要から、一応、「スタック領域とデータ領域が重なっている」ということの確認の役には立ちます。

あえて「一応」と書いたのは、何かのバグでスタック領域を超えてデータを壊しても、システム的にそれを止めるような昨日はないからです。
    • good
    • 0
この回答へのお礼

AsanoNagiさん
No1.と合わせてお礼させ頂きます。回答ありがとうございます。
スタックサイズは目安的なものなのですね。
なぜサイズを指定していないのか不思議で仕方がありませんでした。
本当にありがとうございました。

お礼日時:2011/03/02 19:42

一つだけ、



スタック(CPUのSPという意味でね)は通常、アドレスの低いほう(小さい方)に向かいます。
しかも、スタックを減じてから、PUSHされます。
参考URLのデータシート「CPU」→「Instruction Set」→「Table2.4 Data Transfar Instruction」を見てください。
PUSHの横に、Rn→@-SP と書かれているでしょう。これは通常@(-SP)と解釈し、前置インクリメント動作を示します。

参考URL:http://pdf1.alldatasheet.jp/datasheet-pdf/view/2 …
    • good
    • 0

一度、ハードウエア側のデータシートも確認されるといいかなと思います。



実際には、明示的なスタック領域というのはありません。
スタックの先頭は、必要に応じて、「スタックポインタ」に設定されます。
小規模システムなら、初期化時点で、SP(だったか?)に設定されることになります。

スタックポインタが指すアドレスが、スタックの先頭で、スタックにデータがプッシュされると、
・スタックポインタが指すアドレス(=スタックの先頭)にデータが保存されて、
・スタックポインタがインクリメントされます(=次にデータを置くアドレスを指す)

ですから、まず、「スタックはスタックポインタのデータからアドレスが増える方」にむけて確保されることになります。

さて、多くのマイコンでは、RAM のサイズ違いがシリーズ化されています。
H8 の場合、増えたRAM はアドレスが増える方向に付け加えられます。
なので、スタックサイズがわかれば、初期化時のスタックポインタは、「RAM の最終アドレス - スタックサイズ + 1」になります。スタックサイズの指定は、これを簡易的にやるという位の意味しかありません。

ヒープは、使わなければ設定する必要はありません。
CやC++を使う場合、スタックを使わないという選択肢はまずあり得ませんが、ヒープはようするに、malloc() や new を使わなければ、不要なものです。

なので、そもそもヒープを使っていないという可能性はあります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!