С помощью Lauterbach TRACE32, как измерять объем памяти, потребляемый стекю при запуске приложения?Как измерить объем памяти, потребляемый стеком?
Я использую AUTOSAR OS на процессоре PowerPC.
С помощью Lauterbach TRACE32, как измерять объем памяти, потребляемый стекю при запуске приложения?Как измерить объем памяти, потребляемый стеком?
Я использую AUTOSAR OS на процессоре PowerPC.
Если вам нужна память, потребляемая пакетами задач Я думаю, что самый простой способ - обратиться к окну TASK.STacK.view
. Убедитесь, что следующее, чтобы TASK.STacK.view
работать
TASK.ORTI
для AUTOSAR или TASK.CONFIG
для любой другой целевой ОС.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.
Я получаю ошибку 'symbol not found' в строке' B :: & highAddr = ADDRESS.OFFSET (__ stack_end) -1'. – sergej
Sergey, вам нужно назначить и highAddr верхний адрес, занятый вашим стеком. Этот адрес обычно присваивается символу в сценарии компоновщика приложений. В моем примере у меня был отладочный символ __stack_end, который указывает на этот адрес. Если у вас есть раздел ELF под названием «.stack» для вашего стека, то строки будут «& highAddr = ADDRESS.OFFSET (sYmbol.SECEND (.stack))» и «& lowAddr = ADDRESS.OFFSET (sYmbol.SECADDRESS (.stack))) '.Таким образом, инициализация двух строк и lowAddr и & highAddr должны быть установлены самими границами стека приложения. – Holger
Спасибо Holger, у меня есть символ с именем '__SP_INIT', в файле компоновщика он определяется как некоторый начальный адрес + размер стека (64K). Это '& highAddr'? – sergej
Вы используете операционную систему на своей цели? Какую архитектуру процессора вы используете? – Holger
@Holger Я использую многоядерный PowerPC SoC, с AUTOSAR, работающим на основном ядре, и без RTOS на ведомом ядре. – sergej