Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Динамическое выделение памяти во внешней RAM))
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Taran87
Всем Форумчаном добрый день. Есть АРМ контроллер LPC2478 и внешняя DRAM 32 мбайт памяти, работаю в среде IAR. Столкнулся с проблемой выделением памяти под данные во внешней RAM стандартными C функциями malloc() и т.п.? Конечно в IARе существует возможность работы только с внешней RAM, но отказываться от внутренней не хочется. Существуют ли возможности совмещать два диапазона адресации (тоесть когда необходимо один диапазон адресного пространство, затем другой)) ?.. За ранее благодарен.. smile3046.gif
zöner
может проще написать свой менеджер дин.памяти ?
вот статейка на эту тему:
http://www.ibm.com/developerworks/aix/tuto...ager/index.html
jcxz
Цитата(Taran87 @ Apr 30 2012, 17:10) *
Столкнулся с проблемой выделением памяти под данные во внешней RAM стандартными C функциями malloc() и т.п.? Конечно в IARе существует возможность работы только с внешней RAM, но отказываться от внутренней не хочется. Существуют ли возможности совмещать два диапазона адресации (тоесть когда необходимо один диапазон адресного пространство, затем другой)) ?.. За ранее благодарен.. smile3046.gif

Что-то не очень понятно - с какой именно памятью у вас проблемы?
В какой именно памяти находится куча можно посмотреть по вашему файлу настройки компоновщика (*.cmd).
Ищите там в какую область комппонуется секция ".stack". Естественно она может быть только в одной из областей - или внешней RAM или внутренней RAM.
А зачем она вобще нужна эта куча??? Я в своих эмбеддед-проектах всегда обхожусь без неё.
AlexandrY
Цитата(jcxz @ May 1 2012, 12:13) *
Естественно она может быть только в одной из областей - или внешней RAM или внутренней RAM.


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

Выделяем для heap область захватывающую и внутреннюю и внешнюю RAM. Потом последовательно захватываем размер внутренней RAM и размер равный размеру промежутка между внутренней и внешней RAM.
Потом освобождаем размер внутренней RAM. (не забываем делать поправки на служебные записи в heap)
И все! Универсальный heap готов.
aaarrr
Цитата(AlexandrY @ May 1 2012, 16:08) *
Выделяем для heap область захватывающую и внутреннюю и внешнюю RAM. Потом последовательно захватываем размер внутренней RAM и размер равный размеру промежутка между внутренней и внешней RAM.
Потом освобождаем размер внутренней RAM. (не забываем делать поправки на служебные записи в heap)
И все! Универсальный heap готов.

Хорошая инструкция, как делать не надо. Ничего, что стандартная библиотека - это все же черный ящик, а "поправки на служебные записи" могут меняться вместе с версией компилятора?
jcxz
Цитата(aaarrr @ May 1 2012, 18:40) *
а "поправки на служебные записи" могут меняться вместе с версией компилятора?

...а также к примеру - направление распределения памяти - от головы или от хвоста. И ещё чёрт знает чего.
Если уж так нужна куча и там и там, то делайте свой менеджер.
borman11
Я использую самописный менеджер памяти. Статей по его реализации в инете полно. К тому же, его можно заточить под тип задач, которые используются в данном проекте. Можно гибко сконфигурировать используемую память. Можно добавить модуль статистики использования памяти: максимальное/текущее использование памяти, фрагментация, ... Это очень удобно при отладке.
jcxz
По-моему: для устройств, работающих годами не выключаясь и не перегружаясь, кучу, в обычном понимании слова (хоть самописную хоть стандартную) лучше не использовать.
Из-за фрагментации.
Ну разве что в очень простых программах.
Если нужно динамическое выделение памяти, то лучше использовать "кучу" на основе блоков фиксированного размера.
При необходимости можно огранизовать несколько таких куч с разными размерами блоков.
Это позволит избежать фрагментации. Но конечно не спасёт от утечек памяти, вследствие багов в ПО.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.