質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

6541閲覧

組込みマイコンのソフトでスタックサイズを指定する意味

tunaingot

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2016/06/18 03:45

マイコンの開発環境で、プロジェクトを作るときに「スタックサイズ」を
指定(設定?)するものがありました。

これってどういう意味があるのでしょう??
基本的に、静的に確保したメモリ、動作中に動的に確保されるメモリが
スタック領域に行かなければいいだけのことではないのでしょうか?

仮に、指定したスタックサイズを超えたとき、静的、動的メモリがスタック
サイズに達していなければ問題ないと思っているのですが、違うのでしょう
か?

ご存知の方がいらっしゃいましたら、ご教示いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tunaingot

2016/06/18 07:10

コメントありがとうございます。 やはり、スタックが予想以上に大きくなることを知るすべがない...ということのようです。 とても参考になりました。
guest

0

ベストアンサー

マイコンボードで実際にソフトを動かす前に、開発環境(エミュレータ)を使って動作確認をすると実機ではできないようなデバックが出来ます。実機で起きている不具合の原因を、エミュレータを使って調査するなどのシチュエーションが有り得ます。この点ご承知でしたら失礼します。

質問内容の中で記載されています静的・動的メモリとスタックの関係については、質問者殿の解釈で全く問題無いです。スタックサイズを指定するのはその条件が破られたことを検出することが目的です。

バグやハードの想定外動作によりスタックオーバーフローやスタック領域の浸食が起きている場合、エミュレータにスタックのサイズ情報が有ればそれらを検知し、エラー情報として出力することが出来ます。また、コンパイルの際にも静的メモリ領域は計算出来るので、全メモリサイズとスタックサイズの情報が有ればメモリ不足をコンパイルの時点で発見することが出来ます。

投稿2016/06/18 04:25

BlueMoon

総合スコア1339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tunaingot

2016/06/18 06:44

コメントありがとうございます。 さらに調べていったところ、やはりおっしゃるように指定したスタックサイズを超えたことを検出する目的でした。 とても参考になりました。
BlueMoon

2016/06/18 13:05

ニュアンス的な書きかたになってしまいましたが、お役に立てたようであれば何よりです。
guest

0

マイコンの開発環境と書かれても、色々ありますので、
他の方が、追試可能な様に、
掲示可能であれば、具体的な開発環境を掲示してみてください。
MPLAB x.xx / AVR Studio Ver xx など、アバウトでも構いません。
コンパイラサポートで、何かサポがあるかもしれませんし、
当該チップにスタックチェックの機能があるのかもしれませんし、
チップや、コンパイラ、開発環境を調べてみないと、判らないですよね?

リンクされる、ライブラリが勝手に使う部分はどう考えますか?
対象環境が、動的クラス、動的オブジェクトを使用可能な機能を含んでいる場合は、
どう考えます?
Cで、自前ライブラリ、標準ライブラリ含めて、全て手の内にあり、正しく動いているのであれば、

基本的に、静的に確保したメモリ、動作中に動的に確保されるメモリが
スタック領域に行かなければいいだけのことではないのでしょうか?
仮に、指定したスタックサイズを超えたとき、静的、動的メモリがスタック
サイズに達していなければ問題ないと思っているのですが、違うのでしょうか?

は、起きないかもしれませんが、
マイコン用の、C / C++ では、極つまらない、プログラムミスにより、容易にメモリ破壊が可能です。

投稿2016/06/18 04:24

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tunaingot

2016/06/18 06:42

コメントありがとうございます。 参考になりました。
guest

0

知らないことを、思い込みでこうに違いないと考えてはいけません。
ちゃんと調べるべきです。
初期に確保されるから、少ないほうがよかったり、
処理次第である程度確保する必要があったりする場合があるのかなと想像はしますが、
あなたのそのシステムでの実際がどうであるのかは、私にはわかりません。
例えばスタックサイズが固定のシステムで実際は意味のない指定になってるのかもしれませんよ。

投稿2016/06/18 04:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tunaingot

2016/06/18 06:41

コメントありがとうございます。 参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問