calloc malloc realloc и дефрагментация SRAMa

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
zebrox
Встал на лапы
Сообщения: 117
Зарегистрирован: Вс апр 12, 2009 22:40:37

calloc malloc realloc и дефрагментация SRAMa

Сообщение zebrox »

классическая проблама, можно ли ее решить в мк?
место в сраме как бы есть, по моим подсчетам, а выделить участок для массива не получается, т.к. нет достачного непрерывного участка памяти.
как можно "сжать" все используемые переменные в начало срама?
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6319
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение Jack_A »

zebrox писал(а):классическая проблама, можно ли ее решить в мк?
место в сраме как бы есть, по моим подсчетам, а выделить участок для массива не получается, т.к. нет достачного непрерывного участка памяти.
как можно "сжать" все используемые переменные в начало срама?
Поскольку адреса переменных забиты уже в программной флеши, то - никак.
А вообще-то это хорошая иллюстрация к спору об "ЯВУ - ассемблер". Человек, пишущий на ЯВУ, пытается применить приемы, используемые в компах фон-Неймановской архитектуры, для МК Гарвардской архитектуры.
Мое ретроградское мнение : использоание ЯВУ в МК рационально только для больших проектов на больших камнях ( типа Мега128 ), в противном случае это просто блажь.
А откуда могут появиться в МК неиспользуемые переменные ? Что, динамически подгружаемые оверлеи - отработал, и теперь эти ресурсы не нужны ? Верится с трудом. На этапе компиляции их нужно убивать на корню.

Если уж такие гигантские объемы информации крутятся, придется прикрутить внешнюю SRAM.
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение Satyr »

Причем тут ява ?
атмега128 - большой камень ? -)))))))))))))
Решение известно давно - виртуальная страничная память. Только в МК ее поддержки не бывает.
Гигабайтные объемы памяти во внешней SRAM - это ты почку продашь, чтоб столько SRAMа купить. SDRAM - правильное решение.

Что тут можно посоветовать - только самому анализировать каждую задачу и изобретать такую схему, при которой фрагментация минимизируется.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение Satyr »

Да, есличо - сдрам копейки стоит.
Контроллеры ее поддерживающие тоже совсем не экзотика и стоят доступно.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение urry »

Что-то мне подсказывает, что вопрос задан о пике - непрерывный участок памяти...
Если говорить о 18 пике, то можно переписать файл линкера.
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение Kavka »

Jack_A: Какие адреса во ФЛЭШе? Тему прочитайте - динамическое выделение/освобождение (и т.п.) участка памяти в ОЗУ! Проблема была актуальна для некоторых задач на персоналках во времена ДОСа. И чем меньше ОЗУ тем проблема может быть сильнее выражена.

Satyr: ЯВА - язык высокого уровня. И, думается мне, что это практически всё что выше макро ассемблера.

zebrox: Если не увеличивать объём ОЗУ... Первое что приходит в голову это, как уже было сказано, модифицировать алгоритм работы с памятью, чтобы фрагментация не мешала. На мой взгляд, этот вариант должен быть по-проще чем следующий. Второе, это управлять памятью самому, и в нужный момент реорганизовывать память. Это далеко не простое решение, в смысле или надо писать свой менеджер памяти в самой программе, или лезть во внутренность avr-libc.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение a_skr »

может, я что-то не понимаю, но, скажите мне, ЗАЧЕМ в МК динамически выделять память??? а потом освобождать? и опять выделять? почему нельзя статически объявить нужное кол-во памяти?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18652
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение ARV »

a_skr писал(а):может, я что-то не понимаю, но, скажите мне, ЗАЧЕМ в МК динамически выделять память??? а потом освобождать? и опять выделять? почему нельзя статически объявить нужное кол-во памяти?
а как можно статически выделять память, если заранее не известно, какого объема она потребуется?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение a_skr »

ARV писал(а):
a_skr писал(а):может, я что-то не понимаю, но, скажите мне, ЗАЧЕМ в МК динамически выделять память??? а потом освобождать? и опять выделять? почему нельзя статически объявить нужное кол-во памяти?
а как можно статически выделять память, если заранее не известно, какого объема она потребуется?
а как можно рассчитывать, что памяти хватит, если неизвестен предполагаемый максимальный объем? если известен максимальный - что мешает его объявить?
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение Satyr »

i.MX233 интересная чтука. присмотритесь -)
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6319
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение Jack_A »

Satyr писал(а):Причем тут ява ?
Ни Ява, ни Панония, ни ИЖ с коляской тут не при чем. Я сказал ЯВУ - язык высокого уровня.
Kavka писал(а): Jack_A: Какие адреса во ФЛЭШе?
Когда мы пишем :
.DSEG
.org 0x68
Alfa: .byte 1

а потом :
.CSEG
sts Alfa,r16

то при компиляции получим приблизительно такое

000035 9300 0068 sts Alfa,r16

дык 0068 - это и есть адрес переменной Alfa, который намертво до следующей перешивки засажен во флеш-память программ. Вот такие вот адреса во флеши. И динамически их не поменяешь никак. И, как принято говорить, прежде чем возмущаться, неплохо бы исходный вопрос почитать, не говоря уже об даташитах.
Хотя пишущие исключительно на ЯВУ до таких низких истин не опускаются. Черную работу делает компилятор, а мы воспарим.
Последний раз редактировалось Jack_A Ср июн 01, 2011 22:53:37, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18652
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение ARV »

a_skr писал(а):а как можно рассчитывать, что памяти хватит, если неизвестен предполагаемый максимальный объем? если известен максимальный - что мешает его объявить?
с заранее объявленным куском памяти как работать? в одном месте программы надо 5 разных переменных, а в другом - один массив пятерного размера, в третьем - вообще только одна переменная, а в четвертом - куча строк... если все это делать в одном "глобальном" массиве байтов при помощи всяких указателей и т.п. выкрутасов - это и получится менеджер динамической памяти, только написанный кривыми ручками :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение a_skr »

ARV писал(а):
a_skr писал(а):а как можно рассчитывать, что памяти хватит, если неизвестен предполагаемый максимальный объем? если известен максимальный - что мешает его объявить?
с заранее объявленным куском памяти как работать? в одном месте программы надо 5 разных переменных, а в другом - один массив пятерного размера, в третьем - вообще только одна переменная, а в четвертом - куча строк... если все это делать в одном "глобальном" массиве байтов при помощи всяких указателей и т.п. выкрутасов - это и получится менеджер динамической памяти, только написанный кривыми ручками :)
в общем, Вы все и подтвердили. правильно распределенные на этапе программирования указатели разных структур данных на смещения в объявленном куске памяти все решает, не так ли? :)) вопрос: Вы ВООБЩЕ используете *alloc* в проектах на AVR? пс. с кривыми ручками тут делать нечего, и это не менеджер, тем более, "динамической" памяти, - это правильное распределение памяти и правильное планирование программы, дабы не использовать одновременно 1 большой массив и 5 маленьких в одной и той-же области памяти. если ручки кривые - выбирать памяти побольше, как было сказано выше, но использование в МК *alloc* многократно в процессе выполнения мне кажется абсурдом, извините... :))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18652
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение ARV »

a_skr писал(а): использование в МК *alloc* многократно в процессе выполнения мне кажется абсурдом, извините... :))
не всегда, не всегда... :) но в общем и целом ваш подход я приемлю. только вот "грамотное совмещение в одном куске" вряд ли прибавит читабельности коду... такой стиль я не одобряю :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение a_skr »

ARV писал(а):
a_skr писал(а): использование в МК *alloc* многократно в процессе выполнения мне кажется абсурдом, извините... :))
не всегда, не всегда... :) но в общем и целом ваш подход я приемлю. только вот "грамотное совмещение в одном куске" вряд ли прибавит читабельности коду... такой стиль я не одобряю :)
приятно, что в общем согласились. :)) но все-же, Вы используете динамическое выделение памяти в своих проектах? естественно, многократное выделение/освобождение, т.к., если однократно, то можно объявить это статически. и еще п.с. сколько кода добавляется для обслуживания всего этого? :)
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: calloc malloc realloc и дефрагментация SRAMa

Сообщение Goldsmith »

zebrox писал(а):как можно "сжать" все используемые переменные в начало срама?
Никак. Чтобы безопасно переместить объект в куче, нужно перестроить все указатели на этот объект в новое положение. С обычными указателями C это выполнить не удастся, поскольку мы не знаем, сколько указателей на этот объект в данный момент существует.

Можно, конечно, реализовать "умные" указатели на C++, но такая реализация съест больше ресурсов, чем сэкономит. А вообще полноценный "сборщик мусора", подобный тем, которые имеются в исполняющих системах Java и .NET, - весьма тонкая и сложная система, никак не для нескольких килобайт ОЗУ.
zebrox писал(а):классическая проблама, можно ли ее решить в мк?
Есть простое решение, естественно, довольно ограниченное в силу простоты. Я подсмотрел его в исполняющей системе очень упрощенной реализации Pascal для PDP-11. В ней деаллокатора не было вовсе. Взамен имелись два примитива для работы с кучей - Mark и Release.

Вызовом Mark помечалась верхушка кучи в текущий момент. Затем все динамически создаваемые через new объекты размещались на верхушке кучи. Вызов Release возвращал верхушку кучи обратно в точку, помеченную последним вызовом Mark, тем самым уничтожая разом все динамические объекты, созданные между Mark и Release. "Блоки" Mark/Release могли быть вложенными.

Типовая практика использования этих примитивов такова: программный модуль, имеющий потребность в динамической памяти, помечает начало кучи, затем производит манипуляции с данными и перед завершением возвращает кучу в исходное состояние. Собственно, это мало отличается от привычного способа работы с динамическими объектами, поэтому особо ограничивать программиста не должно. Зато гарантируется полное отсутствие фрагментации кучи.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»