Распределение и освобождение в ОСРВ Micriμm μC/OS-III

Мы используем ОСРВ µC/OS-III от Micrium с RX62N от Renesas.

Мы построили систему, в которой мы должны динамически распределять и освобождать данные. Мы обнаружили, что функции malloc() и free() плохо работают с RTOS. Однако в RTOS для этого есть специальная функция; функцию Mem_HeapAlloc(). Эта функция выделяет часть памяти из 'кучи' ОСРВ. Проблема в том, что у него нет свободной функции, вероятно, потому, что все идет в пул кучи.

В ОСРВ тоже можно сделать пул. Проблема этого пула в том, что все содержащиеся в нем блоки должны быть одинакового размера. Так как мы выделяем и освобождаем разные размеры, это не очень хорошее решение для нас.

Мы нашли документ, в котором описаны функции памяти RTOS ЗДЕСЬ Глава 4 описывает функции.

Кто-нибудь знает, как мы могли бы решить эту проблему?

Некоторые решения, которые у нас уже были

  • Сделайте все размеры блоков такими же, как у самого большого выделения. У нас много накладных расходов, так как наименьшее и самое большое выделение сильно различаются.
  • Не делайте free. Это не решение, будет утечка памяти.

Надеюсь, кто-нибудь может нам помочь. Если что-то не понятно, спрашивайте

заранее спасибо


person Hendrik    schedule 23.05.2012    source источник


Ответы (1)


  • you can allocate your objects in multiples of block sizes.

У вас все равно будет некоторая внутренняя фрагментация, из-за которой вы не сможете полностью использовать доступное пространство.

Вы по-прежнему будете иметь следующие преимущества, используя пулы памяти

  • Пулы памяти позволяют выделять память с постоянным временем выполнения (без фрагментации). Освобождение памяти для тысяч объектов в пуле — это всего лишь одна операция, а не одна за другой, если для выделения памяти для каждого объекта используется malloc.

  • Пулы памяти могут быть сгруппированы в иерархические древовидные структуры, что подходит для специальных структур программирования, таких как циклы и рекурсии.

  • В пулах блочной памяти фиксированного размера нет необходимости хранить метаданные выделения для каждого выделения, описывающие такие характеристики, как размер выделенного блока. Это обеспечивает существенную экономию места, особенно для небольших помещений.

person ravi    schedule 23.05.2012
comment
Мы выделяем место для структур, поэтому выделение должно быть продолжено. - person Hendrik; 23.05.2012
comment
Я предполагаю, что это будет обязанность диспетчера кучи, который вы используете для разделения распределения вашей структуры на несколько объектов. - person ravi; 23.05.2012
comment
На самом деле мы не используем диспетчер кучи, пространство просто предоставляется функциями RTOS, и они не требуют никакого администрирования. - person Hendrik; 23.05.2012