реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Используемый объем SRAM
Haamu
сообщение Jul 7 2014, 06:41
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



В среде Atmel Studio во время компиляции в окне Output появляются такие строки:
Код
Program Memory Usage : 27224 bytes   2,6 % Full
Data Memory Usage : 17592 bytes   10,7  Full

Судя по цифрам, можно сделать вывод, что первая - это место, занимаемое программой во флеше контроллера, а вторая - это объем используемой SRAM.
Больше интересует вторая строка. На сколько это точные показания и как они определяются?

Второй вопрос. Программа для STM32, написанная в CoIDE (CooCox). Есть ли там возможность увидеть информацию об объеме используемой SRAM?

И третий вопрос. Всё та же CoIDE.
Код
Program Size:
      text       data        bss        dec        hex    filename
    198168       5028      42564     245760      3c000    Xxxxxxxx.elf

Помогите понять, что значат эти цыфры? Я так понимаю, что "dec" - это размер занятого флеша, а "hex" - то же самое, только в шестнадцатиричном формате. Могу предположить, что "text" - это количество команд в программе. Поправьте, в чем не прав и поясните, что есть "data" и "bss"?
Go to the top of the page
 
+Quote Post
Porty
сообщение Jul 7 2014, 07:54
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893



Цитата(Haamu @ Jul 7 2014, 10:41) *
Код
Program Size:
      text       data        bss        dec        hex    filename
    198168       5028      42564     245760      3c000    Xxxxxxxx.elf


text - размер сегмента с кодом, векторами прерываний и константами только на чтение (rodata, text, isr_vector)
data - размер сегмента с инициализированными переменными, НО инициализированными НЕ нулём.
bss - размер сегмента с не инициализированными переменными или инициализированными нулём.
стек включается либо в bss либо идёт отдельно в оставшейся памяти, надо смотреть скрипты линковки (*.ld). В Вашей среде раньше включался в bss.

А так же есть служебные метки (на границе секций) для компилятора и линковщика, а так же выравнивание секций по границе в 2-4 байта. В сумме это не более пары десятков байт.

Итог:
Занимаемое флеш = text + data + 10..50 байт
Занимаемое ОЗУ = data + bss + 10..50 байт
Go to the top of the page
 
+Quote Post
Haamu
сообщение Jul 7 2014, 09:02
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Контроллер у меня STM32F407VG. Вот описание выделенной памяти в том самом скрипте линковки:
Код
MEMORY
{
    rom (rx)  : ORIGIN = 0x08000000, LENGTH = 0x00100000
    ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000
    ram1 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x00010000
}

_eram = 0x20000000 + 0x00020000;

STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : 0x2000;   /* 8Kb */
HEAP_SIZE  = DEFINED(HEAP_SIZE)  ? HEAP_SIZE  : 0x8000; /*  32Kb */

Правильно ли я понимаю, что в этом случае под сегменты data + bss остается 0x00020000 - (0x2000 + 0x8000) = 0x16000 или 90112 байт памяти?

И еще один момент, учитывают значения data и bss память, выделяемую функциями calloc или malloc?

Сообщение отредактировал Haamu - Jul 7 2014, 09:08
Go to the top of the page
 
+Quote Post
Porty
сообщение Jul 7 2014, 10:14
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893



Цитата(Haamu @ Jul 7 2014, 13:02) *
Правильно ли я понимаю, что в этом случае под сегменты data + bss остается 0x00020000 - (0x2000 + 0x8000) = 0x16000 или 90112 байт памяти?

да

Цитата(Haamu @ Jul 7 2014, 13:02) *
И еще один момент, учитывают значения data и bss память, выделяемую функциями calloc или malloc?

нет, не учитывают, т.к. определяются во время работы программы а не во время компилирования.
Дин память выделяется из кучи, которая 32кб, у тебя же всё там написано:
Код
...
STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : 0x2000;   /* 8Kb */
HEAP_SIZE  = DEFINED(HEAP_SIZE)  ? HEAP_SIZE  : 0x8000; /*  32Kb */
Go to the top of the page
 
+Quote Post
Haamu
сообщение Jul 7 2014, 12:26
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Если bss - размер сегмента с не инициализированными переменными или инициализированными нулём, то поидее если я не меняю ничего в программе, должен оставаться постоянным. Так?
Я меняю размер кучи в скрипте линковки, и вижу странную зависимость - при увеличении размера кучи увеличивается значение bss после компиляции проекта. Что здесь не так?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 7 2014, 17:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Ну так и получается - растет неинициализируемый участок ОЗУ, часть которого выделена под кучу
Go to the top of the page
 
+Quote Post
Porty
сообщение Jul 7 2014, 19:22
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893



Цитата(Haamu @ Jul 7 2014, 16:26) *
Если bss - размер сегмента с не инициализированными переменными или инициализированными нулём, то поидее если я не меняю ничего в программе, должен оставаться постоянным. Так?
Я меняю размер кучи в скрипте линковки, и вижу странную зависимость - при увеличении размера кучи увеличивается значение bss после компиляции проекта. Что здесь не так?


Внимательно читай все *.ld файлы, ищи ГДЕ и КАК используется HEAP_SIZE т.к. в разных версиях кокоса по разному организована куча.
Можно только самому разобраться, потому что я не знаю и не имею всех версий среды и не знаю что за проект и что за настройки и скрипты в нём.
Да и если разобраться - пригодится и не раз. Можно считать что это лаба. И затрагивает она не только МК. Очень полезная лаба biggrin.gif
А так же ознакомься с форматом *.ld файлов, это не так сложно как может показаться.
Go to the top of the page
 
+Quote Post
Haamu
сообщение Jul 8 2014, 06:21
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Цитата(Porty @ Jul 7 2014, 23:22) *
Да и если разобраться - пригодится и не раз. Можно считать что это лаба. И затрагивает она не только МК. Очень полезная лаба biggrin.gif
А так же ознакомься с форматом *.ld файлов, это не так сложно как может показаться.

Согласен. В целом уже разобрался что да как. Спасибо за правильный вектор, куда смотреть.
Вся проблема у меня была в том, что не хватало размера кучи, для динамического выделения. Остался еще один вопрос. Если сильно увеличить размер кучи, до такой степени, что не хватит под статически выделяемую память, компилятор сообщит об этом?
Go to the top of the page
 
+Quote Post
Porty
сообщение Jul 8 2014, 08:11
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893



Цитата(Haamu @ Jul 8 2014, 10:21) *
Если сильно увеличить размер кучи, до такой степени, что не хватит под статически выделяемую память, компилятор сообщит об этом?


Компилятор делает код. Компилятору всё равно - он наделал код в объектные файлы и всё. Далее объектные файлы передаётся системой сборки в линковщик
Линковщик собирает объектники, связывает их, и размещает по регионам памяти делая elf файл из которого уже получается бинарник или что там надо.

В лд файлах указан размер озу, если в озу не влезет то линковщик выдаст типа этого (переполнение региона ram на X байт)
http://prntscr.com/40jh5a
в примере конфигурация для 4к озу.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016