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

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

ただいまの
回答率

90.37%

  • C

    4225questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 2,031

tunaingot

score 3

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

こんにちは。

スタック・サイズを指定するケースは少なくないと思います。
VC++も最大スタック・サイズの指定があります。

一般にスタックは連続したアドレス空間を必要とします。MMU搭載システムでもアドレス空間の空きは必要ですし、組み込み系マイコンの場合、MMUが搭載されていないケースも少なくなく、そのようなシステムではスタック用に連続した物理メモリが必要です。

そのため、MMU搭載システムでは最大スタック・サイズ、非MMU搭載システムではスタック・サイズの指定は事実上必須です。(指定しない場合はデフォルト値が決められていると思います。)

スタック領域を超えた場合に何が起こるのか、システムにより異なります。MMUが搭載されていないような組み込みマイコンの場合は、スタック領域を越えてメモリへ書き込みが発生し、メモリ破壊になるケースが多いと思います。これは致命的なバグとなります。

そのため、非MMU搭載システムでは、実際に使用するスタックのサイズを見積もり、それに少し余裕をもってスタック領域を確保します。複雑なプログラムの場合、なかなかたいへんです。
極小規模なマイコン(RAMが数100Bytesみたいな)では、全てのコール・シーケンスを辿ってスタック・サイズを見積もってました。8bitマイコンでC言語を使うようなケースでは無理でしたので、スタック領域を特定の値で埋めておいて、一通りの機能を実行後に消費したスタック量を確認してました。後者は完全に行うことは無理なので、再帰呼び出しは不可とする、割り込みは別スタックへ切り替える等の工夫を行ってました。そして、若干の余裕を確保してスタック・サイズを定めるということを行います。
つまり、非MMU搭載システムでは、スタック・サイズを指定できないとメモリ破壊バグを回避する術がないと思います。

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

静的メモリはデータ領域(リンカにて割り当てられる)、動的メモリはmalloc等でヒープから確保します。
スタック上に確保するメモリはローカル変数やバラメータ、戻り番地等です。動的か静的かで分類すると動的メモリに当たるでしょう。
「指定したスタックサイズを超えたとき」は、動的メモリがスタック・サイズを超えているということです。その時、致命的な不具合が顕在化することが多いです。
恐怖のスタックオーバーフローです。


【余談ですが】
有名なQAサイトのStack Overflowはその究極の恐怖に対処したいぞ、のような意味を込めているかも?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/18 16:10

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

    キャンセル

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/18 15:44

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

    キャンセル

  • 2016/06/18 22:05

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/18 15:41

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

    キャンセル

0

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

リンクされる、ライブラリが勝手に使う部分はどう考えますか?
対象環境が、動的クラス、動的オブジェクトを使用可能な機能を含んでいる場合は、
どう考えます?
Cで、自前ライブラリ、標準ライブラリ含めて、全て手の内にあり、正しく動いているのであれば、
>基本的に、静的に確保したメモリ、動作中に動的に確保されるメモリが 
>スタック領域に行かなければいいだけのことではないのでしょうか? 
>仮に、指定したスタックサイズを超えたとき、静的、動的メモリがスタック 
>サイズに達していなければ問題ないと思っているのですが、違うのでしょうか? 
は、起きないかもしれませんが、
マイコン用の、C / C++ では、極つまらない、プログラムミスにより、容易にメモリ破壊が可能です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/18 15:42

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

    キャンセル

同じタグがついた質問を見る

  • C

    4225questions

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