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を使用した組み込みシステムで最大スタック使用量を決定する方法を参照してください。)