Как mallo c узнает, где находится первый доступный блок во встроенных системах? - PullRequest
0 голосов
/ 16 июня 2020

Я читал, что malloc имеет несколько реализаций, зависящих от платформы.

Как это работает во встроенном устройстве при программировании на «голом железе»?
Предположим, у нас есть микроконтроллер с 256 КБ FLA SH памяти и 64 КБ ОЗУ.

Как узнать, сколько оперативной памяти доступно моей программе?

1 Ответ

2 голосов
/ 17 июня 2020

Для систем с «голым железом» в сценарии компоновщика выделен специальный сегмент c, часто называемый .heap. Не существует такой вещи, как разделение памяти между процессами, а это означает, что куча должна иметь фиксированный максимальный размер и, следовательно, в целом бесполезна. malloc ничего не знает о том, сколько оперативной памяти использует ваша программа, поскольку в поле зрения нет настольной ОС.

Ваша оперативная память разделена на .stack, .data, .bss и .heap, каждый со своим фиксированным максимальным размером. Подробнее об этих сегментах здесь: https://electronics.stackexchange.com/a/237759/6102. В типичном приложении MCU без операционной системы большая часть ОЗУ будет зарезервирована для .data и .bss. У вас будет от 128 байт до нескольких килобайт, зарезервированных для стека. Как правило, у вас вообще не будет кучи, но если вы это сделаете, она будет сидеть и занимать фиксированное количество x kb, независимо от того, сколько из них вы фактически используете.

malloc само по себе может действительно могут быть реализованы по-разному. Либо вы включаете «заголовок» вместе с каждым выделенным сегментом, в заголовке указывается выделенный размер и, возможно, адрес следующего доступного свободного сегмента. Или вы можете реализовать его как справочную таблицу, где каждый элемент является указателем на первый элемент и размер.

Ничего из этого не имеет особого значения, поскольку вы не должны использовать распределение кучи во встроенных системах . Основная причина в том, что не имеет никакого смысла . Вам не нужно произвольное поведение, вам нужно поведение deteministi c. Вы хотите выделить x объема памяти для наихудшего случая, и если бы куча должна была использоваться, она должна была бы быть как минимум такой же большой, поэтому вы не получите ничего, кроме раздувания, от использования кучи. Затем появляются все обычные проблемы с накладными расходами на выделение памяти, фрагментацией и утечками.

Для приложений с открытым железом / RTOS сделайте себе одолжение и удалите .heap из сценария компоновщика, а затем забудьте, что вы когда-либо слышали о malloc. MCU - это не P C.

...