Выделение и освобождение в микроконтроллерах µC/OS-III
Мы используем ОСРВ µC/OS-III от Micrium с RX62N от Renesas.
Мы создали систему, в которой мы должны динамически размещать и освобождать данные. Мы обнаружили, что функции malloc() и free() плохо работают с ОСРВ. Однако в ОСРВ имеется специальная функция для этого; функция Mem_HeapAlloc (). Эта функция выделяет некоторую память для "созданной " кучи ОСРВ. Проблема в том, что у него нет свободной функции, вероятно, потому что все идет в пул кучи.
В ОСРВ также возможно сделать пул. Проблема этого пула в том, что все содержащие блоки должны быть одинакового размера. Поскольку мы выделяем и освобождаем разные размеры, это не очень хорошее решение для нас.
Мы нашли документ, который описывает функции RTOS памяти ЗДЕСЬ Глава 4 описывает функции.
Кто-нибудь знает, как мы можем решить эту проблему?
Некоторые решения у нас уже были
- Сделайте все размеры блоков такими же, как самые большие. У нас много накладных расходов, поскольку самые маленькие и самые большие распределения сильно различаются.
- Не делай бесплатно. Это не решение, будет утечка памяти.
Надеюсь, кто-нибудь может нам помочь. Если что-то не понятно, пожалуйста, спросите меня
заранее спасибо
1 ответ
you can allocate your objects in multiples of block sizes.
У вас все еще будет некоторая внутренняя фрагментация, из-за которой вы не сможете полностью использовать доступное пространство.
Вы бы по-прежнему имели следующие преимущества при использовании пулов памяти
Пулы памяти позволяют распределять память с постоянным временем выполнения (без фрагментации). Освобождение памяти для тысяч объектов в пуле - это всего лишь одна операция, а не одна за другой, если для выделения памяти для каждого объекта используется malloc.
Пулы памяти могут быть сгруппированы в иерархические древовидные структуры, что подходит для специальных структур программирования, таких как циклы и рекурсии.
Пулы памяти блоков фиксированного размера не должны хранить метаданные выделения для каждого выделения, описывая такие характеристики, как размер выделенного блока. В особенности для небольших распределений это обеспечивает существенную экономию места.