2014-09-13 2 views
3

У меня была ошибка, которую я сейчас исправил, но которую мне нужно объяснить в отчете.Первое использование malloc устанавливает кучу?

Я работаю над встроенным устройством, на котором работает FreeRTOS, который выполняет собственное управление памятью кучи. У FreeRTOS есть своя версия malloc(), pvPortMalloc(), о которой я не знал и использовал ее, исправил проблемы с памятью, которые у меня были.

Мой вопрос относится к размеру переполнения памяти, вызванному malloc(), размер данных был всего 8 байтов, однако размер переполнения был значительным, килобайт, если не больше. Я предполагаю, что первое и единственное использование malloc в этом приложении, создавшее вторую кучу в конкуренции с кучей FreeRTOS, размером не менее нескольких килобайт - это размер.

Может кто-нибудь подтвердить это или дать лучшее объяснение. Указатели на более подробную информацию или ссылки получили высокую оценку.

+0

В приведенной ниже ссылке сравниваются различные подходы к управлению памятью в FreeRTOS. Некоторые известные проблемы о malloc обсуждаются. Это может помочь вам http://www.freertos.org/a00111.html – Claudix

+0

Та, ​​это был мой источник для выяснения того, как исправить мою ошибку, но это не объясняет поведение, которое я наблюдал , –

+0

«Я предполагаю, что первое и единственное использование malloc в этом приложении» Какое приложение? Отправьте код. В противном случае вопрос слишком широк и приведет лишь к спекуляции. – Lundin

ответ

3

Это общая черта многих реализаций malloc для запроса большего объема памяти из системы, чем требуется для одного запроса. Например, glibc's ptmalloc имеет следующее:

#define MINIMUM_MORECORE_SIZE (64 * 1024) 

Это служит нижней границей от объема памяти (в байтах) потребовать от ОС (через sbrk()) за один раз. Таким образом, вы ожидаете увидеть один крошечный результат распределения в 64 КБ «используется».

Одной из причин, по которым нужно делать такие вещи, является сокращение системных вызовов; другим может быть сокращение фрагментации.

+0

Хорошо, это то, чего я ожидал. Похоже, что это pvPortMalloc от FreeRTOS делает это, а также объясняет поведение, которое я вижу. Является ли эта версия malloc, используемой в C89? –

+1

Все хорошие Джона, как только я знал, что искать, найти код glibc был относительно прямым, и у меня есть нашел файл, который вы предоставили. Большое спасибо за ваш указатель :-) –

Смежные вопросы