Чтобы сузить термин ОС - когда вы говорите «ОС», вы на самом деле имеете в виду «настольную ОС», такую как Windows или Unix, которая обрабатывает не только многозадачность, но и распределение памяти, файловую систему, драйверы и т. Д., Но естьтакже являются ОСРВ, которые ничего не делают, кроме обработки многозадачности - они не заботятся о динамическом распределении памяти.
Приложения, которые не используют «настольную ОС», такие как приложения микроконтроллеров, но длякакая-то запутанная причина все равно хочет использовать malloc
, выделив фиксированный объем оперативной памяти для кучи во время соединения.malloc
затем правит этой областью памяти и переходит к захвату памяти, как только пожелает.В этом случае malloc
реализуется и обрабатывается только библиотекой компилятора.
Это показывает, как бессмысленно использовать malloc
для таких приложений.Прежде всего, встраиваемые системы не запускают несколько программ и никогда не прекращают их выполнение, поэтому бессмысленно использовать free()
память - для кого вы ее освобождаете?Других программ для обмена оперативной памятью нет.Ваша программа имеет эксклюзивный доступ ко всей доступной оперативной памяти.
Таким образом, у вас есть эта фиксированная область в оперативной памяти, помеченная как куча и запрещенная для использования для всех, кроме malloc
, где вы также можете хранить статически распределенные переменные вместо этого.,Это буквально пустая трата пространства.Потому что, несмотря ни на что, ваша программа должна быть в состоянии справиться с наихудшим случаем пиковых значений использования ОЗУ.В этот момент у вас должно быть определенное количество доступной памяти, независимо от того, хранится ли оно статически, в стеке или в куче.
Это означает, что любая такая программа должна заранее выделить эту точную память, иначе она сломается - ей потребуется ровно столько ОЗУ, сколько необходимо в худшем случае.И поскольку вы должны поддерживать этот наихудший случай, вы не сможете использовать эту память для других целей каким-либо разумным способом.
Что касается хранения временных переменных, то здесь уже есть стек, который быстрее и безопаснее.Поэтому вам не нужно malloc
.
Это основная причина, почему выделение кучи никогда не используется в системах без ОС - это не имеет смысла.Я все время вижу сбитых с толку программистов, начинающих программировать на встраиваемых системах, и, прежде чем вы это знаете, они начинают использовать malloc
, потому что они «не знают, сколько памяти требуется во время компиляции».Но во встроенной системе вы всегда должны это знать - вам нужно достаточно, чтобы справиться с наихудшим сценарием.И поэтому вам нужно установить фиксированные максимальные пределы для всего.