Lauterbach TRACE32では、アプリケーションの実行中にスタックが消費するメモリ量をどのように測定するのですか?スタックが消費するメモリ量を測定する方法は?
私はPowerPC CPU上でAUTOSAR OSを使用しています。
Lauterbach TRACE32では、アプリケーションの実行中にスタックが消費するメモリ量をどのように測定するのですか?スタックが消費するメモリ量を測定する方法は?
私はPowerPC CPU上でAUTOSAR OSを使用しています。
のタスクのスタックが消費するメモリを知りたい場合は、最も簡単な方法はウィンドウTASK.STacK.view
を参照することです。 は、他のターゲットOS用のAUTOSARのためのTASK.ORTI
またはTASK.CONFIG
で、
TASK.STacK.view
を取得するには、以下を確認してください。Data.Set
コマンドを使用して、マジックパターンでタスクのスタックを初期化します。TASK.STacK.PATtern
というコマンドでデバッガに魔法の初期化パターンを宣言している可能性があります。場合あなたはPRACTICEスクリプトを経由してこれを確認する必要がベアメタルアプリケーションのスタックによって消費されるメモリを知りたいのです。
ここでの基本的な考え方は、固定パターン(アプリケーションが起動する前)でスタックを初期化し、後でスタックのどの割合が初期化パターンを含まないかを確認することです。
あなたは次の3つのステップで行うことができます。
第一、このようなあなたのELFをロードした後に魔法のパターンを使用してスタックを初期化する(またはアプリケーションの起動コードでこれを行う):
GLOBAL &lowAddr &highAddr &magicPattern
&lowAddr=ADDRESS.OFFSET(__stack_start) // assign here the upper border of the addressrange occupied by your stack
&highAddr=ADDRESS.OFFSET(__stack_end)-1 // assign here the lower border of the addressrange occupied by your stack
&magicPattern=0xCCCCCCCC // any 32-bit you like which appears unlikely on the used part of the stack
Data.Set &lowAddr--&highAddr %Long &magicPattern // initialize the stack
第二に、このようなスタックの使用状況を確認するためのスクリプト(stackcheck.cmm)を作成します。
PRIVATE &lowAddr &highAddr &pattern &addr
ENTRY &lowAddr &highAddr &pattern
IF ("&lowAddr"=="")||("&highAddr"=="")||("&pattern "=="")
(
PRINT %ERROR "At least one of the 3 required parameters is missing"
ENDDO
)
VAR.NEWGLOBAL int \stacksize=0
VAR.NEWGLOBAL int \stackusage=0
&addr=&lowAddr
WHILE (Data.LONG(D:&addr)==&pattern)&&(&addr<&highAddr)
&addr=&addr+4
Var.Set %SPaces \stacksize = (&highAddr - &lowAddr) + 1
Var.Set %SPaces \stackusage = (&highAddr - &addr) + 1
Var.View \stacksize \stackusage (100*\stackusage)/\stacksize // Show result
ENDDO
(追加を検索する方法を最適化する場合がありますスタックのRESS-範囲)
最後に、このような現在のスタック使用量を検出するためのスクリプトを呼び出す:。
DO stackcheck.cmm &lowAddr &highAddr &magicPattern
あなたはかなり多くの場合、スタックの使用状況を確認したい場合は、MENU.AddTool
にを使用する場合がありますTRACE32のツールバーにこれ用のボタンを作成します。
'B ::&highAddr = ADDRESS.OFFSET(__ stack_end)-1'行に' symbol not found'エラーが表示されています。 – sergej
Sergeyでは、スタックが占有する上位アドレスを&highAddrに割り当てる必要があります。このアドレスは通常、アプリケーションリンカースクリプト内のシンボルに割り当てられます。私の例では、このアドレスを指す__stack_endというデバッグシンボルがありました。スタックのELFセクションが "&highAddr = ADDRESS.OFFSET(sYmbol.SECEND(.stack))'と '&lowAddr = ADDRESS.OFFSET(sYmbol.SECADDRESS(.stack) )) ')。したがって、&lowAddrと&highAddrを初期化する2つの行は、アプリケーションのスタックの境界に自分で設定する必要があります。 – Holger
ありがとうHolger、私は '__SP_INIT'という名前のシンボルを持っています。リンカファイルには、スタックの開始アドレス+サイズ(64K)として定義されています。それは '&highAddr'ですか? – sergej
ターゲットでオペレーティングシステムを使用していますか?どのCPUアーキテクチャを使用していますか? – Holger
@Holger私は、主コアでAUTOSARを実行し、スレーブコアではRTOSを使用しないで、マルチコアPowerPC SoCを使用しています。 – sergej