Мне дали плату на базе 8051 со встроенной операционной системой. Я использую SDCC для создания приложений над ОС. И malloc недоступен, поэтому мне приходится выделять память статически. Это почему? Разве malloc не должен находиться в динамической библиотеке внутри компилятора?
Почему и когда malloc() не будет доступен в C?
Ответы (3)
TL;DR:
Почему и когда malloc() не будет доступен в C?
Единственное, что можно сказать в целом, это то, что malloc()
будет предоставляться каждой соответствующей реализацией C, размещенной на хосте, но есть и другие виды, в том числе другой соответствующий вид.
Разве malloc не должен находиться в динамической библиотеке внутри компилятора?
Не совсем. malloc()
является частью стандартной библиотеки C, поэтому она предоставляется каждой соответствующей размещенной реализацией C. Реализация C включает систему для перевода исходного кода C в исполняемые программы, а также механизм и среду для запуска полученных программ. Первый обычно вращается вокруг компилятора. Последний включает в себя столько стандартной библиотеки C, сколько предоставляет реализация, и эта часть находится там, где находится malloc
, если она доступна. Таким образом, нет, malloc
технически не является частью компилятора.
Я уверен, что это не различие, которое вы хотели указать, но оно имеет отношение к ответу. Обратите внимание: я сказал, что malloc
обеспечивается реализациями hosted. Это то, с чем вы обычно сталкиваетесь в операционных системах общего назначения. Они создают программы, которые стандартно запускаются через хост-ОС, и предоставляют все возможности стандартной библиотеки C в связке с ОС. Но есть и автономные реализации. Одно из ключевых отличий заключается в том, что автономные реализации освобождаются от предоставления большей части стандартной библиотеки, включая malloc()
.
Обычно вы найдете автономные реализации, используемые для встроенных систем, таких как ваша. Они также используются для ядер ОС, загрузчиков и других подобных программ, а не работают непосредственно на «голом железе». То, что ваши программы работают поверх ОС, делает вашу среду чем-то вроде Cadillac среди встраиваемых систем, но не гарантирует, что реализация C является размещенной. Поскольку он не предоставляет malloc
, он не может быть соответствующей размещенной реализацией, но может быть соответствующей автономной реализацией. Он должен документально подтвердить, за что он себя выдает. Если он автономный, но предоставляет другие стандартные библиотечные функции, вы можете считать это роскошью.
malloc()
будет доступен для программ в среде выполнения. Период. Не существует ни одной библиотечной функции, для предоставления которой стандарт C требует автономных реализаций, даже malloc()
, и стандарт вообще не предъявляет никаких требований к несоответствующим реализациям. Нет никакой замены для чтения документации по вашей реализации, по крайней мере, достаточной, чтобы проверить, утверждает ли она, что она соответствует требованиям, размещенным на хостинге.
- person John Bollinger; 12.09.2018
Некоторые рекомендации для систем, критически важных с точки зрения безопасности, не допускают динамического выделения памяти.
Например, в руководстве MISRA C:2004 есть следующее правило:
20.4 — Динамическое выделение памяти кучи не должно использоваться.
Один из способов следовать этому правилу: не привносить и не внедрять в систему malloc()
и другие функции динамического выделения памяти.
Такие системы обычно представляют собой встроенные системы, где потребности в памяти хорошо известны/ограничены во время или до времени компиляции. Таким образом, можно безболезненно избежать динамического выделения памяти.
С библиотеками C, включенными в ваш проект, вы можете использовать такие функции, как malloc, printf и т. д. Поймите, что 8051 — это устройство печати с малым объемом памяти, порядка нескольких КБ. Следовательно, включение библиотек C увеличит размер выходного файла .hex, и вам не хватит памяти.
malloc
является частью стандартной библиотеки, а не частью компилятора. Поэтому ваша плата должна предоставлять библиотеку, реализующую malloc. - person Paul Ogilvie   schedule 12.09.2018malloc
иfree
для управления этим куском. - person Paul Ogilvie   schedule 12.09.2018