MemoryPool
MemoryPool class hierarchy
You can use the MemoryPool class to define and manage fixed-size memory pools. You can allocate memory blocks of fixed size from the pool using the alloc
or calloc
method, which returns a pointer to the block of memory or NULL if there is no space available in the pool. It's the user's responsibility to initialize the objects placed in blocks. The calloc
function sets the block of memory to zeros before returning the pointer of the block to the caller.
MemoryPool class reference
Public Member Functions | |
MemoryPool () | |
Create and Initialize a memory pool. More... | |
~MemoryPool () | |
Destroy a memory pool. More... | |
T * | alloc () |
Allocate a memory block from a memory pool, without blocking. More... | |
T * | try_alloc () |
Allocate a memory block from a memory pool, without blocking. More... | |
T * | alloc_for (uint32_t millisec) |
Allocate a memory block from a memory pool, optionally blocking. More... | |
T * | try_alloc_for (Kernel::Clock::duration_u32 rel_time) |
Allocate a memory block from a memory pool, optionally blocking. More... | |
T * | alloc_until (uint64_t millisec) |
Allocate a memory block from a memory pool, blocking. More... | |
T * | try_alloc_until (Kernel::Clock::time_point abs_time) |
Allocate a memory block from a memory pool, blocking. More... | |
T * | calloc () |
Allocate a memory block from a memory pool, without blocking, and set memory block to zero. More... | |
T * | try_calloc () |
Allocate a memory block from a memory pool, without blocking, and set memory block to zero. More... | |
T * | calloc_for (uint32_t millisec) |
Allocate a memory block from a memory pool, optionally blocking, and set memory block to zero. More... | |
T * | try_calloc_for (Kernel::Clock::duration_u32 rel_time) |
Allocate a memory block from a memory pool, optionally blocking, and set memory block to zero. More... | |
T * | calloc_until (uint64_t millisec) |
Allocate a memory block from a memory pool, blocking, and set memory block to zero. More... | |
T * | try_calloc_until (Kernel::Clock::time_point abs_time) |
Allocate a memory block from a memory pool, blocking, and set memory block to zero. More... | |
osStatus | free (T *block) |
Free a memory block. More... |
MemoryPool example
MemoryPool<message_t, 16> mpool;
message_t *message = mpool.alloc();
mpool.free(message);
Queue and MemoryPool example
This example shows Queue and MemoryPool managing measurements.
/*
* Copyright (c) 2006-2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
#include "mbed.h"
typedef struct {
float voltage; /* AD result of measured voltage */
float current; /* AD result of measured current */
uint32_t counter; /* A counter value */
} message_t;
MemoryPool<message_t, 16> mpool;
Queue<message_t, 16> queue;
Thread thread;
/* Send Thread */
void send_thread(void)
{
uint32_t i = 0;
while (true) {
i++; // fake data update
message_t *message = mpool.alloc();
message->voltage = (i * 0.1) * 33;
message->current = (i * 0.1) * 11;
message->counter = i;
queue.put(message);
ThisThread::sleep_for(1000);
}
}
int main(void)
{
thread.start(callback(send_thread));
while (true) {
osEvent evt = queue.get();
if (evt.status == osEventMessage) {
message_t *message = (message_t *)evt.value.p;
printf("\nVoltage: %.2f V\n\r", message->voltage);
printf("Current: %.2f A\n\r", message->current);
printf("Number of cycles: %u\n\r", message->counter);
mpool.free(message);
}
}
}
Related content
- Queue API reference.