Atridies 0 3 июля, 2013 Опубликовано 3 июля, 2013 · Жалоба Здравствуйте! Пишу проект на STM32F100 и тут начала вылазить ошибка о нехватке ОЗУ. Большие объемы памяти занимают буферы периферии: uart-ов и spi. Но их сумма, плюс cstack, heap - занимает не более 4 кБайт. У меня же - 8 кБайт ОЗУ забито под завязку. Знаю, что IAR может генерировать map-файл, но в нем тоже не все есть. Т.е. на IAR-е для msp430 у меня был map-файл, в котором указывалось все на свете. А на IAR-для ARM - при всех включенных галочках - в map-файле нет некоторых переменных (хотя я их использую и компилятор не должен был их выбросить). Более того, сумма всех переменных, расположенных в ОЗУ (если считать по map-файлу) - едва дотягивает до 5 кБайт (с учетом cstack и heap). Как и где посмотреть - куда испольвалась ОЗУ ? Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ut1wpr 0 3 июля, 2013 Опубликовано 3 июля, 2013 (изменено) · Жалоба Если уже начались сообщения, наверное, самое время подумать о смене камня. Или усечении функционала. Если ни то ни другое не будет заказчиком воспринято с энтузиазмом - пора подумать об увольнении. :) Изменено 3 июля, 2013 пользователем IgorKossak избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 3 июля, 2013 Опубликовано 3 июля, 2013 · Жалоба Собирая проект тулчейном GCC я обнаружил сильное поедание оперативной памяти массивом impure_data array. Обнаружить это удалось сначала утилитой size, потом тщательным изучением map файла. Может и у Вас что-нибудь аналогичное? Не могу поверить, что у IAR нельзя в map файле найти нужную информацию. Может Вы не все "галочки" в настройках проставили? И ещё конфигурацию посмотрите, сколько у Вас ОЗУ выделено. Когда идеи закончатся - map файл в студию (вложением архива). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Atridies 0 4 июля, 2013 Опубликовано 4 июля, 2013 · Жалоба Может и у меня что-то подобное. Но я не использую динамическое распределение памяти. Линковщику всё указано верно: 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-ами и пр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 4 июля, 2013 Опубликовано 4 июля, 2013 · Жалоба Правильно ли я понимаю, что cstack - это стек (т.е. туда пишутся регистры, при вызове функций, текущий адрес при вызовах функций и пр. - т.е. это стек микроконтроллера ? А heap - это та область, где хранятся локальные переменные, где выделяется память malloc-ами и пр. Локальные переменные тоже хранятся в стеке, а heap нужен только для динамического распределения памяти malloc-ами и функциями, вызывающими malloc-и. Попробуйте обойтись без heap или уменьшите его до пары десятков байт. А вот что касается пропусков, то либо Вы что-то не так поняли, либо там задействовано какое-то жуткое выравнивание, точно сказать не могу. Надо map файл смотреть или его обработку в excel. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Atridies 0 14 июля, 2013 Опубликовано 14 июля, 2013 · Жалоба Локальные переменные тоже хранятся в стеке, а heap нужен только для динамического распределения памяти malloc-ами и функциями, вызывающими malloc-и. Попробуйте обойтись без heap или уменьшите его до пары десятков байт. А вот что касается пропусков, то либо Вы что-то не так поняли, либо там задействовано какое-то жуткое выравнивание, точно сказать не могу. Надо map файл смотреть или его обработку в excel. Спасибо за помощь - я выяснил в чем дело: в map-файле не отображаются переменные, обозначенные как static. Почему правда - неясно, ну и фиг с ним. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться