10

Keil コンパイラに「--callgraph」オプションを指定すると、正確な「最大スタック使用量」が静的に計算されます。

残念ながら、今日、「スタック情報のない関数」のリストとともに、「最大スタック使用量 = 284 バイト + 不明 (スタックサイズのない関数...)」というメッセージが表示されます。

Nigel Jones は、組み込みシステムでは再帰は本当に悪い考えだと言っています ( "Computing your stack size" 2009)。そのため、このコードで相互に再帰的な関数を作成しないように注意しました。

また、どの割り込みハンドラーも、割り込みからの最後の復帰命令まで割り込みを再度有効にしないようにしているので、再入可能な割り込みハンドラーについて心配する必要はありません。

再帰または再入可能な割り込みハンドラーがなければ、スタックの最大使用量を静的に決定できるはずです。(したがって、最大スタック使用量を決定する方法に対する回答のほとんどは 適用されません)。私の理解では、「--callgraph」オプションを処理するソフトウェアは、優先度の高い割り込みによって中断されていない場合は各割り込みハンドラーの最大スタック深度を最初に検出し、優先度が高い場合は main() 関数の最大スタック深度を検出します。中断されません。次に、それらをすべて加算して、合計 (最悪の場合) の最大スタック深度を見つけます。これは、main() バックグラウンド タスクが優先度の最も低い割り込みによって中断されたときにその最大深度にあり、その割り込みが次に優先度の低い割り込みによって中断されたときに最大深度にある場合などに発生します。

--callgraph を処理するソフトウェアが、「スタック情報のない関数」リストの小さなアセンブリ言語関数について混乱していると思われます。--callgraphのドキュメントは、使用するスタックの量を手動で計算する (または控えめに見積もる) 必要があることを暗示しているようです。それらは非常に短いため、単純にする必要があります。コードがスタックをどのように使用するかを記述します。」それらの 1 つは、main() にジャンプする前にスタックをゼロにリセットする初期スタートアップ コードです。したがって、実際には、これはゼロ スタックを消費します。もう 1 つは、電源を再投入するまで無限ループに閉じ込められる "Fault" 割り込みハンドラーです。

Keil uVision V4.20.03.0 を使用して、LM3S1968 ARM Cortex-M3 のコードをコンパイルしています。

では、「フレーム ディレクティブ」を使用して、「--callgraph」を処理するソフトウェアに、これらの関数が使用するスタックの量を伝えるにはどうすればよいでしょうか? または、最大スタック使用量を決定するためのより良い方法はありますか?

(gccコンパイラを対象としたほぼ同じ質問については、gccを使用した組み込みシステムで最大スタック使用量を決定する方法を参照してください。)

4

2 に答える 2

3

リンカオプションで--info=stackを使用します。マップファイルには、外部リンケージを持つすべての関数のスタック使用量が含まれます。

単一のタスク環境では、main()のスタック使用量により、必要な合計が得られます。各タスクに独自のスタックがあるRTXなどのRTOSを使用している場合は、すべてのタスクエントリポイントのスタック使用量を確認してから、タスクコンテキスト用にさらにいくつか(RTXの場合は64バイト)を追加する必要があります。ストレージ。

ここでは、Keilおよびより一般的に適用可能なこの手法およびその他の手法について説明します。

于 2011-06-17T20:43:47.627 に答える
3

ユタ大学の John Regehr は、http://www.embedded.com/design/prototyping-and-development/4025013/Say-no-to-stack-overflowで組み込みシステムのスタック使用量の測定について良い議論をしています。 ftp.embedded.com へのリンクは古くなっていることに注意してください。また、「割り込みを無効にせずに」が 1 回出現した場合は、最初または最後の単語を否定する必要があります。商用の世界では、Coverity には構成可能なスタック オーバーフロー チェッカーがあり、CodeWarrior の一部のバージョンには、半文書化された warn_stack_usage プラグマがあります。(私のバージョンのコンパイラ ドキュメントには記載されていませんが、MetroWerks の「Targeting Palm OS」ドキュメントには記載されています。)

于 2011-06-18T16:33:44.280 に答える