2013-05-28 3 views
1

У меня есть программа C, работающая на микроконтроллере AVR32 (UC3C0512C). Выдача команды avr32-size -A PROGRAM.elf генерирует следующий вывод:Как интерпретировать выход avr32-размера?

PROGRAM.elf : 
section    size   addr 
.reset    8200 2147483648 
.rela.got    0 2147491848 
.text    99512 2147491848 
.exception    512 2147591680 
.rodata    5072 2147592192 
.dalign     4   4 
.data     7036   8 
.balign     4   7044 
.bss     5856   7048 
.heap    48536  12904 
.comment    48   0 
.debug_aranges  8672   0 
.debug_pubnames  14476   0 
.debug_info   311236   0 
.debug_abbrev  49205   0 
.debug_line   208324   0 
.debug_frame   23380   0 
.debug_str   43961   0 
.debug_loc   63619   0 
.debug_macinfo 94469328   0 
.stack    4096  61440 
.data_hram0   512 2684354560 
.debug_ranges   8368   0 
Total    95379957 

Может кто-нибудь объяснить, как интерпретировать эти значения? Как рассчитать использование flash и ram на основе этого списка?

Update 1:

Без -A флага, я получаю следующее:

text data  bss  dec  hex filename 
113296 7548 58496 179340 2bc8c PROGRAM.elf 

Update 2:

Я не использую динамическое распределение памяти, так согласно avr-libc user-manual, свободное пространство оперативной памяти должно быть просто: stackpointer минус __heap_start.

В этом случае: 61440 - 12904 = 48536 байт свободный объем оперативной памяти.

Может кто-нибудь подтвердить это?

ответ

2

(Существует несоответствие двух выходов в вашем вопросе. Число базовых станций, сильно отличается.)

Если вы не используете таНос, и не сосчитать стек, то да, ОЗУ использование - это данные плюс bss (плюс некоторый интервал выравнивания). Данные - это переменные, которые заданы в объявлении, а bss - это переменные, которые не являются. Среда выполнения C, вероятно, инициализирует их до 0, но это не обязательно.

Использование вспышки - это текст и данные. То есть вспышка будет включать в себя инструкции программы и время выполнения C, но также значения, которые необходимо скопировать в ОЗУ при запуске, чтобы инициализировать эти переменные. Эти данные обычно привязаны к концу инструкций программы.

Re: обновление 2

RAM имеет глобальные переменные, кучу, а затем стек в таком порядке.

Глобальные переменные могут быть инициализированы в программе или нет. Раздел .data хранится во флэш-памяти, а среда выполнения C копирует эти значения в начало ОЗУ, где соответствующие переменные живут до запуска вашего кода. В разделе .bss глобальных переменных требуется пространство в ОЗУ для хранения значений, но они не обязательно инициализируются. Среда выполнения C, которая поставляется с avr-gcc, фактически инициализирует их до 0. Точнее, вам не нужно хранить массив из 0s для копирования, как и в разделе .data.

Вы не используете кучу, но динамически выделенная память получается из адресов между heap_start и heap_end.

Но стек не ограничен. Да, указатель стека инициализируется при запуске, но он изменяется по мере запуска вашей программы и может хорошо перемещаться в кучу или даже в глобальные переменные (переполнение стека). Указатель стека перемещается всякий раз, когда вызывается функция, или используются локальные переменные внутри функции. Например, большой массив, объявленный внутри функции, будет находиться в стеке.

Итак, в ответ на ваш вопрос нет ОЗУ, гарантированно остающегося свободным.

+0

Спасибо за ваш ответ. Я дважды проверил. Оба выхода были сгенерированы с тем же файлом .elf. – sergej

1

Я думаю, вы должны удалить флаг -A (all), поскольку это дает вам список более низкого уровня, который вы показываете.

Выход по умолчанию проще разобрать и, как представляется, непосредственно указывать значения, которые вы используете.

Примечание: я не пробовал это, а не систему с установленным набором инструментов AVR.

+0

Спасибо за ваш ответ. Я добавил вывод без флага '-A' к моему вопросу. Почему значения bss отличаются друг от друга? – sergej

0

Эти значения являются разделами языка ассемблера скомпилированного кода C. Подробности см. На странице docs. Это полезно и для article.

Раздел под названием .text представляет собой раздел инструкции, то есть инструкции по сборке. Раздел .data представляет размер переменных (ints, массивы и т. Д.). Столбец size имеет значительную информацию и имеет размер каждого раздела в байтах. .stack и .heap представляют собой память, выделенную при подготовке к выполнению программы для настройки виртуальной памяти.

0

Я полагаю, что в вашем скрипте компоновщика у вас есть ОЗУ в 0 и Flash на 0x80000000, поэтому все вещи, которые нужно переместить в ОЗУ, находятся на адресах 0+ (.stack - последний на 61440 (с последующим 4k)). , Таким образом, вам понадобится немного больше, чем 64 КБ оперативной памяти. Все остальное, что у вас есть, - вспышка.

Это предусмотрено, что ваш сценарий компоновщика верен.

Также см. Комментарий пользователя unwind.

0

Вы можете попробовать

АРН-нм --print-размер --radix d --demangle x.elf

, чтобы получить размеры в десятичной системе счисления.

Затем вы можете скопировать & вставить в таблицу, фильтровать, сортировать по разделам и суммировать ее.