Static Vs Dynamic Memory Allocation
Introduction
FreeRTOS versions prior to V9.0.0 allocate the memory used by the RTOS objects
listed below from the special FreeRTOS heap.
FreeRTOS V9.0.0 and onwards gives the application writer the ability to instead provide
the memory themselves, allowing the following objects to optionally be created without
any memory being allocated dynamically:
- Tasks
- Software Timers
- Queues
- Event Groups
- Binary Semaphores
- Counting Semaphores
- Recursive Semaphores
- Mutexes
Whether it is preferable to use static or dynamic memory allocation is dependent
on the application, and the preference of the application writer. Both methods
have pros and cons, and both methods can be used within the same RTOS application.
The simple Win32 example
located in the FreeRTOS/Source/WIN32-MSVC-Static-Allocation-Only
directory of the main FreeRTOS download demonstrates how a FreeRTOS application
can be created without including any of the FreeRTOS heap
implementations in a project.
Creating an RTOS Object Using Dynamically Allocated RAM
Creating RTOS objects dynamically has the benefit of greater simplicity, and the
potential to minimise the application's maximum RAM usage:
-
Fewer function parameters are required when an object is created.
-
The memory allocation occurs automatically, within the RTOS API
functions.
-
The application writer does not need to concern themselves with allocating
memory themselves.
-
The RAM used by an RTOS object can be re-used if the object is deleted,
potentially reducing the application's maximum RAM footprint.
-
RTOS API functions are provided to return information on heap usage,
allowing the heap size to be optimised.
-
The memory allocation scheme used can be chosen to best suite the application,
be that heap_1.c for simplicity and determinism often necessary for
safety critical applications, heap_4.c for fragmentation protection, heap_5.c
to split the heap across multiple RAM regions, or an allocation scheme
provided by the application writer themselves.
The following API functions, which are available if
configSUPPORT_DYNAMIC_ALLOCATION is
set to 1 or left undefined, create RTOS objects using dynamically allocated RAM:
Creating an RTOS Object Using Statically Allocated RAM
Creating RTOS objects using statically allocated RAM has the benefit of providing
the application writer with more control:
-
RTOS objects can be placed at specific memory locations.
-
The maximum RAM footprint can be determined at link time, rather than
run time.
-
The application writer does not need to concern themselves with graceful
handling of memory allocation failures.
-
It allows the RTOS to be used in applications that simply don't allow
any dynamic memory allocation (although FreeRTOS includes allocation
schemes that can overcome most objections).
The following API functions, which are available if
configSUPPORT_STATIC_ALLOCATION is
set to 1, allow RTOS objects to be created using memory
provided by the application writer. To provide memory the application writer
simply needs to declare a variable of the appropriate object type, then pass the address of the variable into
the RTOS API function. The StaticAllocation.c
standard demo/test task is provided to demonstrate how the functions are used:
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|