Я пишу C для платы MPC 555 и потребности выяснить, как выделить динамическую память, не используя malloc.
Я думаю, что закрыть розетку - это правильно, несмотря на то, что это может сработать, если вы этого не сделаете.
Сокет, который не удалось подключить, может находиться не в ТОЧНО том же состоянии, что и совершенно новый - что может вызвать проблемы позже. Я бы предпочел избежать возможности и просто сделать новую. Там чище.
Сокеты TCP содержат состояние LOT, некоторые из которых специфичны для реализации и отрабатываются из сети.
-121--3302908- malloc ()
и связанные с ним функции являются единственной игрой в городе. Вы можете, конечно, катать свою собственную систему управления памятью любым способом.
Обычно malloc ()
реализуется в Unix с помощью sbrk ()
или mmap ()
. (Если вы используете последнее, вы хотите использовать флаг MAP _ ANON
.)
Если вы нацелены на Windows, может помочь VirtureAlloc
. (Более или менее функционально эквивалентно анонимному mmap ()
.)
Update: Не знал, что вы работаете не под полной ОС, у меня как-то сложилось впечатление, что это может быть домашнее задание, выполняющееся поверх системы Unix или что-то такое...
Если вы выполняете встроенную работу и у вас нет malloc ()
, я думаю, что вы должны найти некоторый диапазон памяти, на который можно писать, и написать свой собственный malloc ()
. Или возьмите чужой.
В основном стандартный, который все заимствуют, был написан Даг Леа в SUNY Oswego . Например, malloc glibc основан на этом. См. разделы malloc.c , malloc.h .
Если ваша среда выполнения не поддерживает malloc, вы можете найти malloc с открытым исходным кодом и настроить его для управления куском памяти самостоятельно.
malloc()
- это абстракция, которая используется для того, чтобы программы на C могли выделять память без необходимости понимать детали того, как память выделяется операционной системой. Если вы не можете использовать malloc, то у вас нет другого выбора, кроме как использовать любые средства для выделения памяти, предоставляемые вашей операционной системой.
Если у вас нет операционной системы, то вы должны иметь полный контроль над распределением памяти. В этот момент для простых систем самым простым решением будет просто сделать все статическим и/или глобальным, для более сложных систем вы захотите зарезервировать некоторую часть памяти для распределителя кучи, а затем написать (или позаимствовать) некоторый код, использующий эту память для реализации malloc.
Напишите свой собственный. Предварительно выделите большой кусок статической оперативной памяти, затем напишите несколько функций для захвата и освобождения ее кусков. Это дух того, что делает malloc()
, за исключением того, что он просит ОС выделять и деаллоцировать страницы памяти динамически.
Существует множество способов отслеживания того, что выделено, а что нет (растровые изображения, используемые/свободные связные списки, двоичные деревья и т.д.). Вы сможете найти множество ссылок с помощью нескольких вариантов поиска в Google.
Вы должны объяснить, почему вы не можете использовать malloc ()
, поскольку могут быть разные решения по разным причинам, и есть несколько причин, по которым это может быть запрещено или недоступно на небольших / встроенных системах:
malloc ()
- я думаю, что большинство современных наборов инструментов для встраиваемых систем действительно предоставляют способ связывания в реализации malloc ()
, но, возможно, вы по какой-то причине используете тот, который не работает. В этом случае использование malloc публичного домена Дуга Ли может быть хорошим выбором, но он может оказаться слишком большим для вашей системы (я не очень хорошо знаком с MPC 555). В этом случае может быть подойдет очень простая, настраиваемая функция malloc ()
. Писать это не так уж сложно, но убедитесь, что вы выполняете модульное тестирование, потому что также легко ошибиться в деталях.Например, у меня есть набор очень маленьких подпрограмм, которые используют стратегию распределения мертвой памяти с использованием блоков в свободном списке (распределитель может быть настроен во время компиляции для первого, наилучшего или последнего соответствия). Я даю ему массив символов при инициализации, и последующие вызовы выделения будут разделять свободные блоки по мере необходимости. Он далеко не такой сложный, как malloc ()
Лиа, но чертовски мал, поэтому для простого использования он подойдет. Возможно, вас заинтересует: liballoc
Это простая и легко реализуемая замена malloc / free / calloc / realloc, которая работает .
Если вы заранее знаете или можете определить доступные области памяти на вашем устройстве, вы также можете использовать их libbmmm для управления этими большими блоками памяти и обеспечения резервного хранилища для liballoc. Они лицензированы BSD и бесплатны.
Если есть проблемы с выделением динамической памяти из кучи, вы можете попробовать выделить память из стека с помощью alloca (). Применяются обычные предостережения:
Напишите свой. Поскольку ваш распределитель, вероятно, будет специализирован для нескольких типов объектов, я рекомендую схему Quick Fit , разработанную Биллом Вульфом и Чарльзом Вайнстоком. (Мне не удалось найти бесплатную копию этой статьи, но многие люди имеют доступ к цифровой библиотеке ACM.) Статья короткая, легко читаемая и хорошо подходит для решения вашей проблемы.
Если вам понадобится более общий распределитель, лучшее руководство, которое я нашел по теме программирования на машинах с фиксированной памятью, - это книга Дональда Кнута Искусство компьютерного программирования , том 1. Если Если вам нужны примеры, вы можете найти хорошие в эпической книге Дона об исходном коде TeX TeX: The Program .
Наконец, учебник для студентов Брайанта и О'Халларона довольно дорогой, но в нем подробно описывается реализация malloc
.
Ответ действительно зависит от того, почему вам может потребоваться динамическое выделение памяти. Что делает система, которая должна выделять память, но не может использовать статический буфер? Ответ на этот вопрос будет определять ваши требования к управлению памятью. Отсюда вы можете определить, какую структуру данных вы хотите использовать для управления своей памятью.
Например, мой друг написал что-то вроде видеоигры, которая отображала v ideo в строках развертки на экран. Эта команда определила, что память будет выделена для каждой строки сканирования, но было определенное ограничение на количество байтов, которое могло быть для каждой данной сцены. После рендеринга каждой строки сканирования все временные объекты, выделенные во время рендеринга, были освобождены.
Чтобы избежать утечки памяти и из соображений производительности (это было в 90-х годах, и тогда компьютеры были медленнее), они использовали следующий подход: они заранее выделили буфер, который был достаточно большим, чтобы удовлетворить все распределения для строка развертки в соответствии с параметрами сцены, которые определяют максимальный необходимый размер. В начале каждой строки развертки глобальный указатель устанавливался на начало строки развертки. Когда каждый объект был выделен из этого буфера, было возвращено значение глобального указателя, и указатель был продвинут на следующую позицию, выровненную по машинному слову, после выделенного количества байтов. (Это выравнивание было включено в исходный расчет размера буфера, и в 90-х годах было четыре байта, но теперь должно быть 16 байтов на некоторых машинах.) В конце каждой строки сканирования глобальный указатель сбрасывался в начало буфер.
В «отладочных» сборках было два буфера сканирования, которые были защищены с помощью защиты виртуальной памяти во время чередования строк сканирования. Этот метод обнаруживает устаревшие указатели, используемые от одной строки развертки к другой.
Буфер памяти строк развертки можно назвать «пулом» или «ареной» в зависимости от того, кого вы спросите. Важная деталь заключается в том, что это очень простая структура данных, которая управляет памятью для определенной задачи. Это не общий менеджер памяти (или, точнее, «реализация свободного хранилища»), такой как malloc
, который может быть тем, о чем вы просите.
Вашему приложению может потребоваться другая структура данных для отслеживания вашего бесплатного хранилища.Какое у вас приложение?
malloc ()
и связанные с ним функции - единственная игра в городе. Конечно, вы можете развернуть свою собственную систему управления памятью любым способом.
Вы можете попробовать Менеджер встроенной памяти Ральфа Хемпеля .
FreeRTOS содержит 3 примера реализации распределения памяти (включая malloc ()
) для достижения различных оптимизаций и вариантов использования, подходящих для небольших встроенных систем (AVR, ARM и т. Д.). См. руководство FreeRTOS для получения дополнительной информации.
Я не вижу порта для MPC555, но адаптировать код под свои нужды не составит труда.