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

 
 
> Где посмотреть распределение RAM в проекте?, RAM заканчивается, хотя по расчетам - не должно.
Atridies
сообщение Jul 3 2013, 14:00
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



Здравствуйте!

Пишу проект на STM32F100 и тут начала вылазить ошибка о нехватке ОЗУ. Большие объемы памяти занимают буферы периферии: uart-ов и spi. Но их сумма, плюс cstack, heap - занимает не более 4 кБайт. У меня же - 8 кБайт ОЗУ забито под завязку.

Знаю, что IAR может генерировать map-файл, но в нем тоже не все есть. Т.е. на IAR-е для msp430 у меня был map-файл, в котором указывалось все на свете. А на IAR-для ARM - при всех включенных галочках - в map-файле нет некоторых переменных (хотя я их использую и компилятор не должен был их выбросить).

Более того, сумма всех переменных, расположенных в ОЗУ (если считать по map-файлу) - едва дотягивает до 5 кБайт (с учетом cstack и heap).

Как и где посмотреть - куда испольвалась ОЗУ ?
Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Atridies
сообщение Jul 4 2013, 16:03
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



Может и у меня что-то подобное. Но я не использую динамическое распределение памяти.

Линковщику всё указано верно:
Код
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x400;
/**** End of ICF editor section. ###ICF###*/


Посмотрел еще раз map-файл. Там действительно всё есть, просто сортировано по имени переменных - что ОЧЕНЬ неудобно в данном случае.
Загнал эту часть в excel и увидел пропуски по 100 и больше байт.

И ещё. На cstack и heap - линковщик отвел по 1 Кбайту. Для моей программы - очевидно много. Хочу подрезать.
Правильно ли я понимаю, что cstack - это стек (т.е. туда пишутся регистры, при вызове функций, текущий адрес при вызовах функций и пр. - т.е. это стек микроконтроллера ? А heap - это та область, где хранятся локальные переменные, где выделяется память malloc-ами и пр.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 4 2013, 18:50
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Atridies @ Jul 4 2013, 19:03) *
Правильно ли я понимаю, что cstack - это стек (т.е. туда пишутся регистры, при вызове функций, текущий адрес при вызовах функций и пр. - т.е. это стек микроконтроллера ? А heap - это та область, где хранятся локальные переменные, где выделяется память malloc-ами и пр.

Локальные переменные тоже хранятся в стеке, а heap нужен только для динамического распределения памяти malloc-ами и функциями, вызывающими malloc-и. Попробуйте обойтись без heap или уменьшите его до пары десятков байт.
А вот что касается пропусков, то либо Вы что-то не так поняли, либо там задействовано какое-то жуткое выравнивание, точно сказать не могу. Надо map файл смотреть или его обработку в excel.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:54
Рейтинг@Mail.ru


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