マイコンの開発環境で、プロジェクトを作るときに「スタックサイズ」を
指定(設定?)するものがありました。
これってどういう意味があるのでしょう??
基本的に、静的に確保したメモリ、動作中に動的に確保されるメモリが
スタック領域に行かなければいいだけのことではないのでしょうか?
仮に、指定したスタックサイズを超えたとき、静的、動的メモリがスタック
サイズに達していなければ問題ないと思っているのですが、違うのでしょう
か?
ご存知の方がいらっしゃいましたら、ご教示いただけると幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
こんにちは。
スタック・サイズを指定するケースは少なくないと思います。
VC++も最大スタック・サイズの指定があります。
一般にスタックは連続したアドレス空間を必要とします。MMU搭載システムでもアドレス空間の空きは必要ですし、組み込み系マイコンの場合、MMUが搭載されていないケースも少なくなく、そのようなシステムではスタック用に連続した物理メモリが必要です。
そのため、MMU搭載システムでは最大スタック・サイズ、非MMU搭載システムではスタック・サイズの指定は事実上必須です。(指定しない場合はデフォルト値が決められていると思います。)
スタック領域を超えた場合に何が起こるのか、システムにより異なります。MMUが搭載されていないような組み込みマイコンの場合は、スタック領域を越えてメモリへ書き込みが発生し、メモリ破壊になるケースが多いと思います。これは致命的なバグとなります。
そのため、非MMU搭載システムでは、実際に使用するスタックのサイズを見積もり、それに少し余裕をもってスタック領域を確保します。複雑なプログラムの場合、なかなかたいへんです。
極小規模なマイコン(RAMが数100Bytesみたいな)では、全てのコール・シーケンスを辿ってスタック・サイズを見積もってました。8bitマイコンでC言語を使うようなケースでは無理でしたので、スタック領域を特定の値で埋めておいて、一通りの機能を実行後に消費したスタック量を確認してました。後者は完全に行うことは無理なので、再帰呼び出しは不可とする、割り込みは別スタックへ切り替える等の工夫を行ってました。そして、若干の余裕を確保してスタック・サイズを定めるということを行います。
つまり、非MMU搭載システムでは、スタック・サイズを指定できないとメモリ破壊バグを回避する術がないと思います。
仮に、指定したスタックサイズを超えたとき、静的、動的メモリがスタック
サイズに達していなければ問題ないと思っているのですが、違うのでしょう
か?
静的メモリはデータ領域(リンカにて割り当てられる)、動的メモリはmalloc等でヒープから確保します。
スタック上に確保するメモリはローカル変数やバラメータ、戻り番地等です。動的か静的かで分類すると動的メモリに当たるでしょう。
「指定したスタックサイズを超えたとき」は、動的メモリがスタック・サイズを超えているということです。その時、致命的な不具合が顕在化することが多いです。
恐怖のスタックオーバーフローです。
【余談ですが】
有名なQAサイトのStack Overflowはその究極の恐怖に対処したいぞ、のような意味を込めているかも?
投稿2016/06/18 04:39
編集2016/06/18 04:41総合スコア23272
0
ベストアンサー
マイコンボードで実際にソフトを動かす前に、開発環境(エミュレータ)を使って動作確認をすると実機ではできないようなデバックが出来ます。実機で起きている不具合の原因を、エミュレータを使って調査するなどのシチュエーションが有り得ます。この点ご承知でしたら失礼します。
質問内容の中で記載されています静的・動的メモリとスタックの関係については、質問者殿の解釈で全く問題無いです。スタックサイズを指定するのはその条件が破られたことを検出することが目的です。
バグやハードの想定外動作によりスタックオーバーフローやスタック領域の浸食が起きている場合、エミュレータにスタックのサイズ情報が有ればそれらを検知し、エラー情報として出力することが出来ます。また、コンパイルの際にも静的メモリ領域は計算出来るので、全メモリサイズとスタックサイズの情報が有ればメモリ不足をコンパイルの時点で発見することが出来ます。
投稿2016/06/18 04:25
総合スコア1339
0
マイコンの開発環境と書かれても、色々ありますので、
他の方が、追試可能な様に、
掲示可能であれば、具体的な開発環境を掲示してみてください。
MPLAB x.xx / AVR Studio Ver xx など、アバウトでも構いません。
コンパイラサポートで、何かサポがあるかもしれませんし、
当該チップにスタックチェックの機能があるのかもしれませんし、
チップや、コンパイラ、開発環境を調べてみないと、判らないですよね?
’
リンクされる、ライブラリが勝手に使う部分はどう考えますか?
対象環境が、動的クラス、動的オブジェクトを使用可能な機能を含んでいる場合は、
どう考えます?
Cで、自前ライブラリ、標準ライブラリ含めて、全て手の内にあり、正しく動いているのであれば、
基本的に、静的に確保したメモリ、動作中に動的に確保されるメモリが
スタック領域に行かなければいいだけのことではないのでしょうか?
仮に、指定したスタックサイズを超えたとき、静的、動的メモリがスタック
サイズに達していなければ問題ないと思っているのですが、違うのでしょうか?
は、起きないかもしれませんが、
マイコン用の、C / C++ では、極つまらない、プログラムミスにより、容易にメモリ破壊が可能です。
投稿2016/06/18 04:24
総合スコア2028
0
知らないことを、思い込みでこうに違いないと考えてはいけません。
ちゃんと調べるべきです。
初期に確保されるから、少ないほうがよかったり、
処理次第である程度確保する必要があったりする場合があるのかなと想像はしますが、
あなたのそのシステムでの実際がどうであるのかは、私にはわかりません。
例えばスタックサイズが固定のシステムで実際は意味のない指定になってるのかもしれませんよ。
投稿2016/06/18 04:09
退会済みユーザー
総合スコア0
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/18 07:10