How to manage memory

ChibiOS RT and NIL are static kernels so you don't need to manage memory at all if your application doesn't really require it. This doesn't mean that the OS is unable to manage memory but just that memory management is an optional part of the whole.

The OS offers three distinct ways to manage memory, each one with its weaknesses and strengths:

  • Core Memory Allocator.
  • Heap Allocators.
  • Memory Pools Allocators.

The three mechanisms are able to coexist and are well integrated, for example the heap allocator uses the core memory manager in order to get more memory blocks, memory pools can optionally do the same thing. Please refer to the kernel reference manual for more details.

Subsystems comparison

This is a small comparison table regarding the three subsystems, C-runtime and static objects are thrown in there for comparison:

Subsystem Free Capable Constant Time Thread Safe From ISR Notes
Static Objects N/A N/A yes yes Preferred solution for safety applications.
Core Memory Manager no yes yes yes Fast and safe but unable to free allocated memory.
Heap Allocator yes no yes no Unsafe because fragmentation and not constant time, cannot be used from IRQ handlers.
Memory Pools yes yes yes yes Fast and safe but it can handle fixed size objects only, you may have multiple memory pools however.
C-Runtime yes no no no Unsafe because fragmentation, not constant time, cannot be used from IRQ handlers and not thread safe.

When designing a system it is recommended to proceed as follow:

  • Use static objects and initializers whenever possible.
  • Where dynamic allocation is required without having to free the allocated memory then use the Core Memory Manager allocation API.
  • Where dynamic allocation is required evaluate if one or more memory pools can be used.
  • If all the above points do not satisfy your requirements then use the heap allocator.
  • Consider the C-runtime allocator only for legacy code.