Memory Management
An application can allocate and free dynamic memory using any ANSI C compiler’s malloc()
and free()
functions, respectively. However, using malloc()
and free()
in an embedded real-time system may be dangerous. Eventually, it might not be possible to obtain a single contiguous memory area due to fragmentation. Fragmentation is the development of a large number of separate free areas (i.e., the total free memory is fragmented into small, non-contiguous pieces). Execution time of malloc()
and free()
is generally nondeterministic given the algorithms used to locate a contiguous block of free memory large enough to satisfy a malloc()
request.
µC/OS-III provides an alternative to malloc()
and free()
by allowing an application to obtain fixed-sized memory blocks from a partition made from a contiguous memory area, as illustrated in the figure below. All memory blocks are the same size, and the partition contains an integral number of blocks. Allocation and deallocation of these memory blocks is performed in constant time and is deterministic. The partition itself is typically allocated statically (as an array), but can also be allocated by using malloc()
as long as it is never freed.
As indicated in the figure below, more than one memory partition may exist in an application and each one may have a different number of memory blocks and be a different size. An application can obtain memory blocks of different sizes based upon requirements. However, a specific memory block must always be returned to the partition that it came from. This type of memory management is not subject to fragmentation except that it is possible to run out of memory blocks. It is up to the application to decide how many partitions to have and how large each memory block should be within each partition.