Перевод может содержать ошибки. Читайте первоисточник: 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 динамически хорошо тем, что оно проще и позволяет минимизировать необходимый приложению объём ОЗУ:
Для возможности использования функций API с динамическим выделением памяти необходимо в файле FreeRTOSConfig.h установить константу configSUPPORT_DYNAMIC_ALLOCATION в 1, либо оставить её не определённой. В этом случае создание объектов ОС с динамическим выделением ОЗУ осуществляется функциями:
Создание объектов ОС с использованием статически выделенной памяти предоставляет разработчику больше возможностей для контроля:
Для включения в проект функций API создания объектов в памяти, предоставляемой разработчиком приложения, необходимо в файле FreeRTOSConfig.h установить константу configSUPPORT_STATIC_ALLOCATION в 1. Чтобы предоставить память разработчик приложения должен просто объявить переменную с типом, подходящим для создаваемого объекта, и передать указатель на эту переменную в функцию API. Стандартное демонстрационное приложение StaticAllocation.c показывает, как могут быть использованы эти функции: