- ベストアンサー
H8マイコン スタック領域について
- H8マイコンのスタック領域について教えてください。
- スタック領域の配置やサイズ指定について質問があります。
- スタック領域とヒープ領域の指定についても教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
すみません、「前置デクリメント」でした。
その他の回答 (3)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
No.1 です。 大きな間違いをしていたようで、失礼しました。 この場合だと、stakcsize の指定は、RAM の最大値 - スタックサイズ > データ領域の最大値 の関係を満たす必要から、一応、「スタック領域とデータ領域が重なっている」ということの確認の役には立ちます。 あえて「一応」と書いたのは、何かのバグでスタック領域を超えてデータを壊しても、システム的にそれを止めるような昨日はないからです。
お礼
AsanoNagiさん No1.と合わせてお礼させ頂きます。回答ありがとうございます。 スタックサイズは目安的なものなのですね。 なぜサイズを指定していないのか不思議で仕方がありませんでした。 本当にありがとうございました。
- TaketsuruOishi
- ベストアンサー率43% (16/37)
一つだけ、 スタック(CPUのSPという意味でね)は通常、アドレスの低いほう(小さい方)に向かいます。 しかも、スタックを減じてから、PUSHされます。 参考URLのデータシート「CPU」→「Instruction Set」→「Table2.4 Data Transfar Instruction」を見てください。 PUSHの横に、Rn→@-SP と書かれているでしょう。これは通常@(-SP)と解釈し、前置インクリメント動作を示します。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
一度、ハードウエア側のデータシートも確認されるといいかなと思います。 実際には、明示的なスタック領域というのはありません。 スタックの先頭は、必要に応じて、「スタックポインタ」に設定されます。 小規模システムなら、初期化時点で、SP(だったか?)に設定されることになります。 スタックポインタが指すアドレスが、スタックの先頭で、スタックにデータがプッシュされると、 ・スタックポインタが指すアドレス(=スタックの先頭)にデータが保存されて、 ・スタックポインタがインクリメントされます(=次にデータを置くアドレスを指す) ですから、まず、「スタックはスタックポインタのデータからアドレスが増える方」にむけて確保されることになります。 さて、多くのマイコンでは、RAM のサイズ違いがシリーズ化されています。 H8 の場合、増えたRAM はアドレスが増える方向に付け加えられます。 なので、スタックサイズがわかれば、初期化時のスタックポインタは、「RAM の最終アドレス - スタックサイズ + 1」になります。スタックサイズの指定は、これを簡易的にやるという位の意味しかありません。 ヒープは、使わなければ設定する必要はありません。 CやC++を使う場合、スタックを使わないという選択肢はまずあり得ませんが、ヒープはようするに、malloc() や new を使わなければ、不要なものです。 なので、そもそもヒープを使っていないという可能性はあります。
お礼
TaketsuruOishiさん No2.と合わせてお礼させ頂きます。回答ありがとうございます。 参考URLまで教えて頂き感謝します。 アドレスの低いほう(小さい方)へ向かうと思っていたのですが、 #pragma stacksize というのがあったので混乱していました。 ようやく意味が理解できました。 本当にありがとうございました。