2016-11-28 10 views
1

С помощью Lauterbach TRACE32, как измерять объем памяти, потребляемый стекю при запуске приложения?Как измерить объем памяти, потребляемый стеком?

Я использую AUTOSAR OS на процессоре PowerPC.

+0

Вы используете операционную систему на своей цели? Какую архитектуру процессора вы используете? – Holger

+0

@Holger Я использую многоядерный PowerPC SoC, с AUTOSAR, работающим на основном ядре, и без RTOS на ведомом ядре. – sergej

ответ

3

Если вам нужна память, потребляемая пакетами задач Я думаю, что самый простой способ - обратиться к окну TASK.STacK.view. Убедитесь, что следующее, чтобы TASK.STacK.view работать

  • Set-вверх по осведомленности отладчики OS (после загрузки вашего ELF), с TASK.ORTI для AUTOSAR или TASK.CONFIG для любой другой целевой ОС.
  • Инициализация стеков вашей задачи магическим шаблоном, который может быть выполнен в стартовом коде вашей ОС или с помощью команды TRACE32 Data.Set.
  • Возможно объявить шаблон магии инициализации отладчику с командой TASK.STacK.PATtern, если не обнаружено осознанием ОС.

В случае, если вы хотите знать, память, потребляемую стопкой чистого металла приложения вы должны проверить это с помощью ПРАКТИКИ сценария.

Основная идея здесь состоит в том, чтобы инициализировать стек с фиксированным шаблоном (до запуска приложения), а затем проверить, какой процент стека больше не содержит шаблон инициализации.

Вы можете сделать это в три этапа:

первой инициализации стека с магическим рисунком после загрузки вашего 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 

(Вы могли бы хотеть, чтобы оптимизировать способ поиска с помощью оных . ССГ-диапазон в стеке)

Наконец вызова скрипта для определения текущего использования стека, как это:

DO stackcheck.cmm &lowAddr &highAddr &magicPattern 

Если вы хотите проверить, стека, использование довольно часто вы можете использовать MENU.AddTool для создайте для этого кнопку в панели инструментов TRACE32.

+0

Я получаю ошибку 'symbol not found' в строке' B :: & highAddr = ADDRESS.OFFSET (__ stack_end) -1'. – sergej

+0

Sergey, вам нужно назначить и highAddr верхний адрес, занятый вашим стеком. Этот адрес обычно присваивается символу в сценарии компоновщика приложений. В моем примере у меня был отладочный символ __stack_end, который указывает на этот адрес. Если у вас есть раздел ELF под названием «.stack» для вашего стека, то строки будут «& highAddr = ADDRESS.OFFSET (sYmbol.SECEND (.stack))» и «& lowAddr = ADDRESS.OFFSET (sYmbol.SECADDRESS (.stack))) '.Таким образом, инициализация двух строк и lowAddr и & highAddr должны быть установлены самими границами стека приложения. – Holger

+0

Спасибо Holger, у меня есть символ с именем '__SP_INIT', в файле компоновщика он определяется как некоторый начальный адрес + размер стека (64K). Это '& highAddr'? – sergej