組み込みシステムのスタートアップコード(main()関数にジャンプする前に初期スタックポインターをロードするコード)を書いています。アプリケーションが使用するスタックのバイト数(またはそれ以上)を指定する必要があります。 、控えめな見積もり)。
gccコンパイラに-fstack-usageオプションと-fcallgraph-infoオプションが追加され、正確な「最大スタック使用量」を静的に計算するために使用できると言われました。(Botcazou、Comar、およびHainqueによる「GCCを使用したコンパイル時スタック要件分析」 )。
Nigel Jonesは、組み込みシステムでは再帰は本当に悪い考えだと言っています("Computing your stack size" 2009)ので、このコードで相互再帰関数を作成しないように注意しました。
また、割り込みハンドラーのいずれも、最後の割り込みからの復帰命令まで割り込みを再度有効にしないようにしているので、割り込みハンドラーの再入を心配する必要はありません。
再帰または再入可能な割り込みハンドラーがなければ、スタックの最大使用量を静的に決定できるはずです。(そして、最大スタック使用量を決定する方法への答えのほとんどは?適用しないでください)。私の理解では、私(または、できれば、実行可能ファイルを再構築するたびに自動的に実行されるPC上のコードの一部)は、優先度の高い割り込みによって中断されていない場合に、各割り込みハンドラーの最大スタック深度を最初に見つけます。 main()関数が中断されていないときのスタックの深さ。次に、それらをすべて合計して、合計(最悪の場合)の最大スタック深度を見つけます。これは(私の組み込みシステムでは)main()バックグラウンドタスクが最低優先度の割り込みによって中断されたときに最大の深さになり、次に低い優先順位の割り込みによって中断されたときにその割り込みが最大の深さにあるときに発生します割り込みなど。
LM3S1968ARMCortex-M3のコードをコンパイルするためにgcc4.6.0でYAGARTOを使用しています。
では、gccで-fstack-usageオプションと-fcallgraph-infoオプションを使用して、最大スタック深度を計算するにはどうすればよいですか?または、最大スタック使用量を決定するためのより良いアプローチはありますか?
(Keilコンパイラを対象としたほぼ同じ質問については、組み込みシステムで最大スタック使用量を決定する方法を参照してください。)