You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.9 KiB
97 lines
2.9 KiB
//----------------------------------------------------------------
|
|
// Statically-allocated memory manager
|
|
//
|
|
// by Eli Bendersky (eliben@gmail.com)
|
|
//
|
|
// This code is in the public domain.
|
|
//----------------------------------------------------------------
|
|
#ifndef MEMMGR_H
|
|
#define MEMMGR_H
|
|
|
|
//
|
|
// Memory manager: dynamically allocates memory from
|
|
// a fixed pool that is allocated statically at link-time.
|
|
//
|
|
// Usage: after calling memmgr_init() in your
|
|
// initialization routine, just use memmgr_alloc() instead
|
|
// of malloc() and memmgr_free() instead of free().
|
|
// Naturally, you can use the preprocessor to define
|
|
// malloc() and free() as aliases to memmgr_alloc() and
|
|
// memmgr_free(). This way the manager will be a drop-in
|
|
// replacement for the standard C library allocators, and can
|
|
// be useful for debugging memory allocation problems and
|
|
// leaks.
|
|
//
|
|
// Preprocessor flags you can define to customize the
|
|
// memory manager:
|
|
//
|
|
// DEBUG_MEMMGR_FATAL
|
|
// Allow printing out a message when allocations fail
|
|
//
|
|
// DEBUG_MEMMGR_SUPPORT_STATS
|
|
// Allow printing out of stats in function
|
|
// memmgr_print_stats When this is disabled,
|
|
// memmgr_print_stats does nothing.
|
|
//
|
|
// Note that in production code on an embedded system
|
|
// you'll probably want to keep those undefined, because
|
|
// they cause printf to be called.
|
|
//
|
|
// POOL_SIZE
|
|
// Size of the pool for new allocations. This is
|
|
// effectively the heap size of the application, and can
|
|
// be changed in accordance with the available memory
|
|
// resources.
|
|
//
|
|
// MIN_POOL_ALLOC_QUANTAS
|
|
// Internally, the memory manager allocates memory in
|
|
// quantas roughly the size of two ulong objects. To
|
|
// minimize pool fragmentation in case of multiple allocations
|
|
// and deallocations, it is advisable to not allocate
|
|
// blocks that are too small.
|
|
// This flag sets the minimal ammount of quantas for
|
|
// an allocation. If the size of a ulong is 4 and you
|
|
// set this flag to 16, the minimal size of an allocation
|
|
// will be 4 * 2 * 16 = 128 bytes
|
|
// If you have a lot of small allocations, keep this value
|
|
// low to conserve memory. If you have mostly large
|
|
// allocations, it is best to make it higher, to avoid
|
|
// fragmentation.
|
|
//
|
|
// Notes:
|
|
// 1. This memory manager is *not thread safe*. Use it only
|
|
// for single thread/task applications.
|
|
//
|
|
|
|
#define DEBUG_MEMMGR_SUPPORT_STATS 1
|
|
|
|
#define POOL_SIZE 8 * 1024
|
|
#define MIN_POOL_ALLOC_QUANTAS 16
|
|
|
|
|
|
typedef unsigned char byte;
|
|
typedef unsigned long ulong;
|
|
|
|
|
|
|
|
// Initialize the memory manager. This function should be called
|
|
// only once in the beginning of the program.
|
|
//
|
|
void memmgr_init();
|
|
|
|
// 'malloc' clone
|
|
//
|
|
void* memmgr_alloc(ulong nbytes);
|
|
|
|
// 'free' clone
|
|
//
|
|
void memmgr_free(void* ap);
|
|
|
|
// Prints statistics about the current state of the memory
|
|
// manager
|
|
//
|
|
void memmgr_print_stats();
|
|
|
|
|
|
#endif // MEMMGR_H
|