2016-11-28 20 views
1

Lauterbach TRACE32では、アプリケーションの実行中にスタックが消費するメモリ量をどのように測定するのですか?スタックが消費するメモリ量を測定する方法は?

私はPowerPC CPU上でAUTOSAR OSを使用しています。

+0

ターゲットでオペレーティングシステムを使用していますか?どのCPUアーキテクチャを使用していますか? – Holger

+0

@Holger私は、主コアでAUTOSARを実行し、スレーブコアではRTOSを使用しないで、マルチコアPowerPC SoCを使用しています。 – sergej

答えて

3

のタスクのスタックが消費するメモリを知りたい場合は、最も簡単な方法はウィンドウTASK.STacK.viewを参照することです。 は、他のターゲットOS用のAUTOSARのためのTASK.ORTIまたはTASK.CONFIGで、

  • セットアップ(あなたのELFをロードした後)デバッガのOSの意識を作業TASK.STacK.viewを取得するには、以下を確認してください。
  • OSのスタートコードやTRACE32 Data.Setコマンドを使用して、マジックパターンでタスクのスタックを初期化します。
  • OS認識で検出されない場合は、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のツールバーにこれ用のボタンを作成します。

+0

'B ::&highAddr = ADDRESS.OFFSET(__ stack_end)-1'行に' symbol not found'エラーが表示されています。 – sergej

+0

Sergeyでは、スタックが占有する上位アドレスを&highAddrに割り当てる必要があります。このアドレスは通常、アプリケーションリンカースクリプト内のシンボルに割り当てられます。私の例では、このアドレスを指す__stack_endというデバッグシンボルがありました。スタックのELFセクションが "&highAddr = ADDRESS.OFFSET(sYmbol.SECEND(.stack))'と '&lowAddr = ADDRESS.OFFSET(sYmbol.SECADDRESS(.stack) )) ')。したがって、&lowAddrと&highAddrを初期化する2つの行は、アプリケーションのスタックの境界に自分で設定する必要があります。 – Holger

+0

ありがとうHolger、私は '__SP_INIT'という名前のシンボルを持っています。リンカファイルには、スタックの開始アドレス+サイズ(64K)として定義されています。それは '&highAddr'ですか? – sergej

関連する問題