
スタック領域について教えて下さい。
[動作環境]
開発環境:ルネサス 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)共にスタック領域と同時にヒープ領域も指定がありません。
これらは指定しなくても問題ないものなのでしょうか?
また、熟練者の方は指定しないものなのでしょうか?
よろしくおねがいします。

No.4
- 回答日時:
No.1 です。
大きな間違いをしていたようで、失礼しました。
この場合だと、stakcsize の指定は、RAM の最大値 - スタックサイズ > データ領域の最大値 の関係を満たす必要から、一応、「スタック領域とデータ領域が重なっている」ということの確認の役には立ちます。
あえて「一応」と書いたのは、何かのバグでスタック領域を超えてデータを壊しても、システム的にそれを止めるような昨日はないからです。
AsanoNagiさん
No1.と合わせてお礼させ頂きます。回答ありがとうございます。
スタックサイズは目安的なものなのですね。
なぜサイズを指定していないのか不思議で仕方がありませんでした。
本当にありがとうございました。
No.2
- 回答日時:
一つだけ、
スタック(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 …

No.1
- 回答日時:
一度、ハードウエア側のデータシートも確認されるといいかなと思います。
実際には、明示的なスタック領域というのはありません。
スタックの先頭は、必要に応じて、「スタックポインタ」に設定されます。
小規模システムなら、初期化時点で、SP(だったか?)に設定されることになります。
スタックポインタが指すアドレスが、スタックの先頭で、スタックにデータがプッシュされると、
・スタックポインタが指すアドレス(=スタックの先頭)にデータが保存されて、
・スタックポインタがインクリメントされます(=次にデータを置くアドレスを指す)
ですから、まず、「スタックはスタックポインタのデータからアドレスが増える方」にむけて確保されることになります。
さて、多くのマイコンでは、RAM のサイズ違いがシリーズ化されています。
H8 の場合、増えたRAM はアドレスが増える方向に付け加えられます。
なので、スタックサイズがわかれば、初期化時のスタックポインタは、「RAM の最終アドレス - スタックサイズ + 1」になります。スタックサイズの指定は、これを簡易的にやるという位の意味しかありません。
ヒープは、使わなければ設定する必要はありません。
CやC++を使う場合、スタックを使わないという選択肢はまずあり得ませんが、ヒープはようするに、malloc() や new を使わなければ、不要なものです。
なので、そもそもヒープを使っていないという可能性はあります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Replace関数について教えて...
-
CSSが全く分かりません、お助け...
-
CPUが16bitでも32bitOSでコンパ...
-
最初に聞かれたこと
-
c言語の問題の説明、各所ごとに
-
Cのオブジェクトファイルの逆ア...
-
C言語 関数、変数の宣言について
-
C言語について。
-
C言語でファクト関数を使わずに...
-
プログラミング 素数か素数では...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
int16_t の _t は何?
-
DLLファイルの逆コンパイラにつ...
-
visual studio 2022でのC#プロ...
-
プログラミングc++を全く分か...
-
DNCL(共テ用プログラミング言語...
-
C言語 配列と関数の練習問題
-
gccを行ってもexeファイルが生...
-
C言語 列挙型(enum型)変数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
printf / sprintf のスタック消...
-
最大スタックサイズを大きくす...
-
ゆゆにゃ。
-
Ethernetヘッダの取得 NDIS
-
gccでスタックサイズを変更する...
-
Visual C++ 2008 オーバーフロ...
-
H8マイコン スタック領域に...
-
ポーランド記法(前置記法)のア...
-
Cプログラミングの関数電卓のア...
-
WINAPについて
-
pthreadのスタックサイズ設定取...
-
_CRTIMPの意味は?
-
逆ポーランド記法
-
エラー?メッセージ
-
再帰処理を非再帰処理に書き換...
-
スタック領域変更
-
スタックのpush/pop動作について
-
VC++でプログラムから現在のス...
-
CASLIIについて
おすすめ情報