
スタック領域について教えて下さい。
[動作環境]
開発環境:ルネサス 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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- 日本語 「に」について 9 2022/10/25 16:32
- 戦争・テロ・デモ 日本防衛省の防衛力強化と日本正規軍隊の転換に対する質問です。 2 2022/12/20 21:34
- ドライブ・ストレージ HDDの未割り当て領域が認識されない 7 2022/11/27 18:51
- 戦争・テロ・デモ 日本海と竹島を日本の防衛範囲領域に管理してほしいと思います。防衛省は可能でしょうか。? 6 2023/01/06 07:43
- 物理学 示すように,真空中の直交座標系を考える。y平面に平行な つ領域Iと領域Iがあり,軸上の領域Iと領域I 1 2023/06/25 14:46
- C言語・C++・C# あまりわかりません。 複素数$c$を具体的に定めた複素写像写像$f_c(z)$に対して、原点を含む領 4 2022/10/25 09:17
- C言語・C++・C# 【CASLプログラム】 定数(80と55)を確保し、その和をGR1に、その差をGR2に求めるCASL 1 2022/12/16 01:17
- Visual Basic(VBA) ActiveReportのdetailをデータセットの自動バインドを使って帳票を出力しています。 1 2023/08/16 07:16
- ノートパソコン パソコンを、アップグレードした後に出来た、Cドライブの後に出来た、このドライブは? 3 2023/04/03 17:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cloneのスタック管理
-
WINDOWSなどのOSを構成している...
-
最大スタックサイズを大きくす...
-
パソコンでインターネット接続...
-
「下士官に告ぐ」って公の発表...
-
ソフトウェア開発技術者~タス...
-
プログラムの規模を表す単位「k...
-
コンパクションとガーベジコレ...
-
ステップ数について
-
ブロック長について
-
ubuntuで デイスク/deb/loopと...
-
hdmiはパラレル?シリアル?
-
AutoCAD LTの中古。
-
「ByRef引数の型が一致しません...
-
【QNAP NAS】LANポートについて...
-
ルータの負荷対策でL2スイッチ...
-
システム企画について
-
【電気】フリッカー回路ってな...
-
ライン数とステップ数の違いに...
-
固定電話機のパソコンとの連動
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
最大スタックサイズを大きくす...
-
gccでスタックサイズを変更する...
-
VB.netでDLLを読み込んで実行す...
-
printf / sprintf のスタック消...
-
スタックフレームの消滅
-
H8マイコン スタック領域に...
-
ハイパーカード
-
関数のプロローグとエピローグ...
-
スタック領域変更
-
再帰処理を非再帰処理に書き換...
-
WINAPについて
-
無償Borland5.51でスタックメモ...
-
_CRTIMPの意味は?
-
エラーメッセージが・・・
-
プログラミングについての質問...
-
OCXからのコールバックを繰り返...
-
スタックとキューの使い所
-
マス目上の移動のアルゴリズム
-
WINDOWSなどのOSを構成している...
-
エラー?メッセージ
おすすめ情報