51

組み込み/メモリに制約のあるシステムの最適なスタックサイズを決定するために利用できる方法は何ですか? 大きすぎると、別の場所で使用できるメモリが浪費されます。ただし、小さすぎる場合は、この Web サイトの名前が付けられます...

Jack Ganssle はThe Art of Designing Embedded Systemsで次のように述べています。誰でもそれよりうまくできますか?

より具体的な例が要求されました。では、オペレーティング システムなしでIAR Embedded Workbenchツールチェーンを使用して、2 kB の RAM を搭載したMSP430 MCUをターゲットとする C プログラムはどうでしょうか? この IDE は、JTAG デバッガーの使用中にスタックの内容と使用状況を表示できます。

4

5 に答える 5

34

最も深いスタックの使用状況を判断する最も一般的な方法は、スタック メモリを既知の異常な値で初期化し、定期的に (または大規模なテスト実行の最後に) そのパターンがどこで停止するかを確認することです。

これはまさに、IAR IDE が使用されるスタックの量を決定する方法です。

于 2008-12-23T16:21:54.783 に答える
23

質問に static-analysis のタグを付けましたが、これは static-analysis で解決するのが難しい問題です。スタックの使用量は、特に再帰または alloca を使用している場合、プログラムのランタイム プロファイルに依存します。これが組み込みプラットフォームであることを考えると、 pstopなどを実行して、アプリケーションが使用しているスタックの量を確認することも難しいと思います。

興味深いアプローチは、現在のスタック フレームのアドレスを使用して、使用されているスタックの量を判断することです。これを行うには、関数の引数またはローカル変数のアドレスを取得します。メイン関数と、最も多くのスタックを使用していると思われる関数に対してこれを行います。違いは、アプリケーションが必要とするスタックの量を教えてくれます。以下に例を示します (通常の高から低へのスタックの成長を想定しています)。

char *stack_top, stack_bottom;

int
main(int argc, char *argv[])
{
    stack_top = (char *)&argc;
    // ...
    printf("Stack usage: %d\n", stack_top - stack_bottom);
}

void
deeply_nested_function(void)
{
    int a;
    stack_bottom = (char *)&a;
    // ...
}

コンパイラでカスタム関数のプロローグを指定できる場合 (多くの場合、グラフベースのプログラム プロファイリングを可能にするために指定します)、すべての関数がそのような測定コードを呼び出すように調整することもできます。次に、測定関数は次のようになります

void
stack_measurement_function(void)
{
    int a;
    stack_bottom = min(stack_bottom, (char *)&a);
    // ...
}

これらのチャートを生成するために、私が説明したものと同様のアプローチを使用しました。

于 2008-12-23T16:13:35.237 に答える
5

優れたソース コード静的分析ツールを使用すると、アプリケーションのコール グラフを作成できます。それと、コンパイラによって生成されるローカル/テンポラリの量の見積もりを考えると、スタック要求の控えめな見積もりを簡単に計算できます。

「優れた」分析ツールとは、関連するすべてのコンパイル ユニットを読み取ることができ、直接的な関数呼び出しを決定でき、コンパイル ユニット内の間接的なポインターを決定でき、システム全体にわたって控えめな分析ポイントを計算でき、ポイントツー分析を考慮してコールグラフを構築します。これにより、多くのツールが不要になるため、「実行時にスタックを埋めて何が起こるかを確認する」などのアドホックな方法が見られます。また、コンパイラがスタックに配置するスタック要求の見積もりも必要です。すべてのタイプのストレージ要求の大きさを知るだけで、これの多くを概算できます。これは、一般に、組み込みシステムの C プログラムではかなり簡単に判断できます。最後に、アプリケーションに再帰呼び出しがないことを信じる必要があります。

DMS Software Reengineering Toolkit は、C プログラムのこれらの要件をすべて満たしています。http://www.semanticdesigns.com/Products/DMS/DMSToolkit.htmlを参照してください。 コール グラフをクロールし、さまざまなサイズの見積もりを使用して、スタックの需要を計算するように構成する必要があります。

迅速な回答が必要な場合は、スタック フィル トリックを使用します。ソースコードを変更するたびに再計算できる答えが必要な場合は、静的分析アプローチが必要です。

于 2009-07-14T04:41:08.853 に答える
-11
  • 再帰または再帰アルゴリズムを使用しないでください。(正規表現ライブラリに注意してください)
  • 配列を使用しないでください。常に malloc() を使用してください。
  • alloca() を使用しないでください。一部のコンパイラでは、この関数にバグがあります。

次に、コードの一部をで調べて、スタック使用率が最も高い場所を探します (配列がないと言ったことを思い出してください)。

  • コード自体の疑わしい 高点でのスタック使用量を確認し、デバッガー インターフェイスにログを記録します。
  • スタックの推定使用量に基づいて上限を設定し、その上限を設定します。たとえば、サーバー接続を制限します。
于 2011-12-27T22:58:00.207 に答える