.mapファイル中の”Stack locally” と”Stack prev“は何ですか?
テクニカル・ノート 24702
アーキテクチャ:
8051
コンポーネント:
linker
更新日:
2018/08/08 5:24
はじめに
IAR XLINKリンカの静的オーバレイシステムマップ (-xo)リンカオプションが指定された場合、リストファイルには以下の情報が格納されます。
"Stack locally"には、その関数によって使用されるバイト数が示されます。"Stack prev"には、「子」関数(対象の関数から呼ばれる関数。何も呼び出さないリーフに至るすべての関数が子関数に含まれます)によって使用されるバイト数が示されます。
この値がどのように集計されるかを理解するには、レベルXのエントリが、その直近にリストされているレベルX+1以上のエントリだけから影響を受けることを理解することが重要です。これは、オペレーティングシステムのファイルシステムにおけるファイルとディレクトリに似ています。各レベルが1つのディレクトリに対応し、そのディレクトリには、他のディレクトリと、ディスク使用量に関するデータが格納されています。各ディレクトリは、自分自身とそのディレクトリに含まれているディレクトリだけから影響を受けます。
架空の例
Level Name
4 foo
6 bar
5 baz
5 frotz
4 qwerty
この例では、frotz、baz、barのスタック使用量がqwertyに格納されますが、fooより上位のレベルが存在しないため(qwertyはfooを呼び出しません)、fooのスタック使用量は格納されません。また、frotzは何も呼び出しません(frotzに呼び出されるエントリが存在する場合、それらはレベル6のエントリとしてfrotzの前にリスト出力されます)。barはレベル6であり、qwertyのツリー内に配置されていますが、barはbazに属するため、qwertyには影響しません。
実践的な例
Stack prev Stack locally
RSTACK CSTACK RSTACK CSTACK
4 getA 0 0 4 0
4 getB 0 0 4 0
4 getC 0 0 2 0
4 getD 0 0 2 0
4 getE 0 0 2 0
3 Foo2 4 0 2 17
2 Foo1 6 17 2 8
この例では、main(レベル1)によってFoo1(レベル2)が呼び出され、Foo1によってFoo2(レベル3)が呼び出され、Foo2によっていくつかのリーフ(レベル4)が呼び出されます。
リーフには、4バイトのRSTACKを使用するものもあれば、2バイトのRSTACKを使用するものもあります。これは、レベル3の"Stack prev"列に影響します。レベルXにおける"Stack prev"の値は、レベルX+1における"Stack prev" + "Stack locally"の最大値になります。
今回の例では、レベル3の合計値は、0+4、0+4、0+2、0+2、0+2となります。最大値は4であるため、レベル3における"Stack prev"の値は、RSTACKについては4、CSTACKについては0となります。
また今回の例では、レベル2の候補は1つしかないため、レベル2の合計値は4 + 2 = 6および0+17 = 17となります。
全ての製品名は、それぞれの所有者の商標または登録商標です。