Распределение памяти под uCOS-III
Я разрабатываю C-библиотеку для использования под uCOS-III. Процессором является ARM Cortex M4 SAM4C. В библиотеке я хочу использовать сторонний продукт X, чье имя здесь не имеет значения. Исходный код для X полностью доступен и компилируется без проблем.
Внутри X выполняется много выделений памяти, используя calloc() и free(). Проблема в том, что простое использование malloc не рекомендуется для встроенных систем из-за фрагментации памяти. Документация для uCOS-III явно рекомендует не использовать malloc - вместо этого OSMemCreate/OSMemGet/OSMemPut должен использоваться для выделения и освобождения фрагментов памяти из статически выделенного блока памяти.
Вопрос 1:
Каков общий совет, чтобы обойти "стандартную реализацию" malloc? Я бы предпочел своего рода malloc, где у меня есть доступ к фиксированному пулу памяти (например, выделенному для специальной задачи)
Вопрос 2:
Как правильно использовать OSMemCreate()? Сначала я должен инициализировать раздел памяти с определенным размером блока. Объем запрашиваемой памяти составляет от 4 до 800 байтов. Я могу получить блоки по запросу, но с фиксированным размером. Если размер блока =4, я не могу выделить 16 байтов, так как блоки не являются смежными в памяти. Если размер блока =800 и мне нужно только 4 байта, большая часть блока останется неиспользованной, и у меня очень скоро закончатся блоки.
Так что я не знаю, как решить мою первоначальную проблему с помощью OSMemCreate...
Кто-нибудь может дать мне совет, как мне поступить?
Большое спасибо, Майкл
1 ответ
1) Не связывайтесь со стандартной библиотечной версией malloc/free. Вместо этого создайте свою собственную реализацию malloc / free, которая служит оболочкой для OSMemGet/OSMemPut.
2) Вы можете создать более одного раздела памяти с помощью OSMemCreate. Создайте небольшие, средние и большие разделы, которые содержат размеры блоков, которые настроены для вашего приложения, чтобы уменьшить потери.
Если вы хотите, чтобы malloc получал блок соответствующего размера из ваших различных разделов памяти, вам придется придумать какое-то волшебство, чтобы free вернул блок в соответствующий раздел памяти. (Возможно, malloc выделяет дополнительное слово, сохраняет указатель на раздел памяти в первом слове, а затем возвращает адрес после слова, в котором хранится указатель. Затем free знает, как получить указатель на раздел памяти из предыдущего слова.)
Альтернативой использованию malloc / free является перезапись этого кода для использования статически размещенных переменных или прямой вызов OSMemGet/OSMemPut.