You are here

Static Vs Dynamic Memory Allocation

Перевод может содержать ошибки. Читайте первоисточник: Static Vs Dynamic Memory Allocation

Назад: [Более подробно...] Вверх: [Более подробно...] Вперёд: [Более подробно...]

 

Введение

Версии FreeRTOS до v9.0.0 могли выделять память для объектов из списка ниже только в специальной куче FreeRTOS. А начиная с версии v9.0.0 у разработчика приложения появилась возможность самостоятельно предоставлять память, позволяя при желании создавать эти объекты без динамического выделения памяти:

  • Задачи
  • Программные таймеры
  • Очереди
  • Группы событий (флаги)
  • Бинарные семафоры
  • Счётные семафоры
  • Рекурсивные семафоры
  • Мьютексы

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

Простой пример приложения, запускаемый под Win32, расположен в каталоге FreeRTOS/Source/WIN32-MSVC-Static-Allocation-Only дистрибутива FreeRTOS. В этом примере показано, как можно создать приложение FreeRTOS, не включив ни одной реализации кучи FreeRTOS в проект.

 

Создание объектов FreeRTOS с использованием динамически выделяемого ОЗУ

Динамическое создание объектов FreeRTOS динамически хорошо тем, что оно проще и позволяет минимизировать необходимый приложению объём ОЗУ:

  • При создании объекта в функцию нужно передавать меньше параметров.
  • Память выделяется автоматически, внутри вызовов функци API FreeRTOS.
  • Разработчику приложения не нужно самому заботиться о выделении памяти для объектов.
  • ОЗУ, используемое объектом ОС, может быть повторно использовано, если объект будет удалён, что потенциально уменьшает необходимый приложению объём ОЗУ.
  • В API FreeRTOS имеются функции, которые возвращают информацию об использовании кучи, что позволяет оптимизировать объём кучи.
  • Схема выделения памяти может быть выбрана в соответствие с требованиями приложения. Это может быть либо реализация heap_1.c, которая при своей простоте является детерминированной, что важно для приложений повышенной надёжности, либо heap_4.c, позволяющая снизить фрагментация свободного пространства в куче, либо heap_5.c, в которой куча может быть размещена в нескольких областях ОЗУ, либо некая специализированная реализация, которую предоставляет разработчик приложения.

Для возможности использования функций API с динамическим выделением памяти необходимо в файле FreeRTOSConfig.h установить константу configSUPPORT_DYNAMIC_ALLOCATION в 1, либо оставить её не определённой. В этом случае создание объектов ОС с динамическим выделением ОЗУ осуществляется функциями:

 

Создание объектов FreeRTOS с использованием статически выделенного ОЗУ

Создание объектов ОС с использованием статически выделенной памяти предоставляет разработчику больше возможностей для контроля:

  • Объекты ОС могут располагаются строго в отведённых для них местах в памяти.
  • Максимальные требования к объёму ОЗУ могут быть определены на этапе сборки проекта, а не во время выполнения.
  • Разработчику приложения не нужно самому заботиться о полноценной и изящной обработке ошибок при выделении памяти.
  • Это позволяет использовать FreeRTOS в приложениях, которые просто не допускают использование динамического выделения памяти (хотя во FreeRTOS включены схемы, которые позволяют преодолеть большинство возражений).

Для включения в проект функций API создания объектов в памяти, предоставляемой разработчиком приложения, необходимо в файле FreeRTOSConfig.h установить константу configSUPPORT_STATIC_ALLOCATION в 1. Чтобы предоставить память разработчик приложения должен просто объявить переменную с типом, подходящим для создаваемого объекта, и передать указатель на эту переменную в функцию API. Стандартное демонстрационное приложение StaticAllocation.c показывает, как могут быть использованы эти функции:

Hobby's category: