Memory areas provide your application with dynamic allocation of fixed-sized memory blocks. Memory areas should be used in preference to the standard C library malloc and free functions if the calling task cannot block or if memory allocation is done by an ISR.

You allocate a memory area by declaring it as a C variable:


Before using a memory area, you must initialize it using ctl_memory_area_init:

unsigned mem[20];
ctl_memory_area_init(&m1, mem, 2, 10);

This example uses a 20-element array for the memory area's working storage. The array is split into 10 blocks, each block being two words in size.

To allocate a block from a memory area, use ctl_memory_area_allocate. If the memory block cannot be allocated, zero is returned.

unsigned *block = ctl_memory_area_allocate(&m1);
if (block)
    // Block has been allocated.
    // No block has been allocated.

When you have finished with a memory block, use ctl_memory_area_free to return it to the memory area from which it was allocated so it can be reused:

ctl_memory_area_free(&m1, block);

You can associate an event flag with the block available state of a memory queue to wait for a memory block to become available:

CTL_MEMORY_AREA_t m0, m1, m2;
ctl_memory_area_setup_events(&m0, &e, 1<<0);
ctl_memory_area_setup_events(&m1, &e, 1<<1);
ctl_memory_area_setup_events(&m2, &e, 1<<2);
switch (ctl_events_wait(CTL_EVENT_WAIT_ANY_EVENTS,
                        &e, (1<<0)|(1<<1)|(1<<2),
                        0, 0))
  case 1<<0:
    x = ctl_memory_area_allocate(&m0, …
  case 1<<1:
    x = ctl_memory_area_allocate(&m1, …
  case 1<<2:
    x = ctl_memory_area_allocate(&m2, …

This example sets up and waits for the block-available events of memory areas m0, m1, and m2. When the wait completes, it attempts to allocate memory from the appropriate memory area. Note that you should not use a with-auto-clear event wait type when waiting on events associated with a memory area.