2

ファームウェアのマップ ファイルのスタック使用量に関する詳細の意味がよくわかりません。マップファイルにこれがあります:

*******************************************************************************
*** STACK USAGE
***

  Call Graph Root Category  Max Use  Total Use
  ------------------------  -------  ---------
  interrupt                      48        112
  Program entry                 704        704
  Uncalled function             424     25 424

「最大使用量」と「合計使用量」の意味を理解するのを手伝ってくれる人はいますか? スタックの実際のサイズは? 48+704+424 または 112+704+25424 ですか? スタックには呼び出されていない関数のデータが含まれていますか? IAR ヘルプで検索しましたが、明確ではありません。

前もって感謝します

4

1 に答える 1

2

「Max Use」列は、行のカテゴリ内の任意の 1 つの関数の最大使用量を示します。最初の行の interrupts では、割り込みとしてフラグが立てられた関数の最大スタック深度は 48 バイトであると言っています。関数ポインターによって参照される可能性がある、またはタスク エントリ関数として使用される可能性がある、呼び出されていない関数の中で、最も深いスタックの深さは 424 バイトです。最後に、プログラム エントリ (つまり、リセットから始まるメイン スタックの使用) の最大深度は 704 バイトです。

「総使用量」列は、各カテゴリのすべてのアイテムのスタック使用量を合計しています。したがって、割り込みの場合、これはすべての割り込みスタック使用量の合計であり、割り込みがネストできるため、Cortex-M3 で役立ちます。この値は、すべての割り込みが発生してネストされた場合に割り込みスタックで見られると予想される関数呼び出しからの最大の深さを示しており、コアがスタックするレジスタを差し引いています。呼び出されていない関数の場合、呼び出されていない関数が入れ子になり、すべてが同時にスタックすることは想定されていないため、この数はあまり役に立ちません。最後に、プログラム エントリは 1 つしかないため、すべての (1 つの) プログラム エントリ ポイントの合計使用量は 704 バイトです。

使用するスタック サイズを決定しようとしている場合、この概要はそれほど役に立ちません。呼び出されていない関数が大量に使用されているため、IAR が解決できない重要な間接呼び出し (関数ポインターまたはジャンプ テーブルを介した)、または多数の RTOS タスクがあります。間接呼び出しの場合、どの関数を呼び出すことができるかを示す IAR プラグマがあり、これによりスタック分析がより正確になります。RTOS タスクの場合、マップ ファイルをさらに下に見て、個々のタスク エントリ関数に必要なスタック サイズを確認する必要があります。

スタックが割り当てられているサイズを確認するだけの場合は、マップ ファイルの他の部分でCSTACK定義を確認すると、サイズが一覧表示されます。

于 2015-07-10T15:20:27.477 に答える