Перейти к содержанию
    

Динамическое выделение памяти во внешней RAM))

Всем Форумчаном добрый день. Есть АРМ контроллер LPC2478 и внешняя DRAM 32 мбайт памяти, работаю в среде IAR. Столкнулся с проблемой выделением памяти под данные во внешней RAM стандартными C функциями malloc() и т.п.? Конечно в IARе существует возможность работы только с внешней RAM, но отказываться от внутренней не хочется. Существуют ли возможности совмещать два диапазона адресации (тоесть когда необходимо один диапазон адресного пространство, затем другой)) ?.. За ранее благодарен.. :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может проще написать свой менеджер дин.памяти ?

вот статейка на эту тему:

http://www.ibm.com/developerworks/aix/tuto...ager/index.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулся с проблемой выделением памяти под данные во внешней RAM стандартными C функциями malloc() и т.п.? Конечно в IARе существует возможность работы только с внешней RAM, но отказываться от внутренней не хочется. Существуют ли возможности совмещать два диапазона адресации (тоесть когда необходимо один диапазон адресного пространство, затем другой)) ?.. За ранее благодарен.. :smile3046:

Что-то не очень понятно - с какой именно памятью у вас проблемы?

В какой именно памяти находится куча можно посмотреть по вашему файлу настройки компоновщика (*.cmd).

Ищите там в какую область комппонуется секция ".stack". Естественно она может быть только в одной из областей - или внешней RAM или внутренней RAM.

А зачем она вобще нужна эта куча??? Я в своих эмбеддед-проектах всегда обхожусь без неё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Естественно она может быть только в одной из областей - или внешней RAM или внутренней RAM.

 

А если подумать? :biggrin:

 

Выделяем для heap область захватывающую и внутреннюю и внешнюю RAM. Потом последовательно захватываем размер внутренней RAM и размер равный размеру промежутка между внутренней и внешней RAM.

Потом освобождаем размер внутренней RAM. (не забываем делать поправки на служебные записи в heap)

И все! Универсальный heap готов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выделяем для heap область захватывающую и внутреннюю и внешнюю RAM. Потом последовательно захватываем размер внутренней RAM и размер равный размеру промежутка между внутренней и внешней RAM.

Потом освобождаем размер внутренней RAM. (не забываем делать поправки на служебные записи в heap)

И все! Универсальный heap готов.

Хорошая инструкция, как делать не надо. Ничего, что стандартная библиотека - это все же черный ящик, а "поправки на служебные записи" могут меняться вместе с версией компилятора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а "поправки на служебные записи" могут меняться вместе с версией компилятора?

...а также к примеру - направление распределения памяти - от головы или от хвоста. И ещё чёрт знает чего.

Если уж так нужна куча и там и там, то делайте свой менеджер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я использую самописный менеджер памяти. Статей по его реализации в инете полно. К тому же, его можно заточить под тип задач, которые используются в данном проекте. Можно гибко сконфигурировать используемую память. Можно добавить модуль статистики использования памяти: максимальное/текущее использование памяти, фрагментация, ... Это очень удобно при отладке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Из-за фрагментации.

Ну разве что в очень простых программах.

Если нужно динамическое выделение памяти, то лучше использовать "кучу" на основе блоков фиксированного размера.

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

Это позволит избежать фрагментации. Но конечно не спасёт от утечек памяти, вследствие багов в ПО.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...