Как интерпретировать вывод размера avr32?

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

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

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

Обновление 1:

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

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

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

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

В этом случае: 61440 - 12904 = 48536 байт свободного места в ОЗУ.

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


person sergej    schedule 28.05.2013    source источник


Ответы (5)


(В вашем вопросе есть несоответствие в двух выводах. Номер bss сильно отличается.)

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

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

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

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

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

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

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

Итак, отвечая на ваш вопрос, не существует оперативной памяти, которая гарантированно останется свободной.

person uncleO    schedule 29.05.2013
comment
Спасибо за Ваш ответ. Я дважды проверил. Оба вывода были сгенерированы с одним и тем же файлом .elf. - person sergej; 29.05.2013

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

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

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

person unwind    schedule 28.05.2013
comment
Спасибо за Ваш ответ. Я добавил к моему вопросу вывод без флага -A. Почему значения bss такие разные? - person sergej; 29.05.2013

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

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

Также см. комментарий unwind.

person dbrank0    schedule 28.05.2013

Эти значения представляют собой разделы языка ассемблера скомпилированного кода C. Подробнее см. в документах. Эта статья также полезна.

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

person isaach1000    schedule 28.05.2013

Можешь попробовать

avr-nm --print-size --radix d --demangle x.elf

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

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

person Beryllium    schedule 28.05.2013