MEMPOOL
Description
Manages an already allocated memory region at a specified address by assigning blocks of a requested size. Once assigned, blocks are static and cannot be released or freed. This approach has the following advantages:
- The managed memory region is divided according to a fixed sequence of block requests. The resulting memory map is deterministic, and the user documentation can precisely describe its arrangement. 
- No dynamic memory allocation implies no memory fragmentation and no need to handle the complexity of sudden out of memory conditions. 
- There might be several memory pools residing on different memory types (a given SRAM bank, external SDRAM, etc.), each one serving a different purpose. 
The managed memory region address, each block assigned from it and their sizes align to a 64-bit boundary.
Design and development status
Feature-complete.
Changelog
| Version | Date* | Author | Comment | 
|---|---|---|---|
| 1.0.0 | 2022.9.7 | sgermino | Initial release. | 
* Date format is Year.Month.Day.
API reference
- 
MEMPOOL_BLOCKSIZE_REMAINS
- Request a block with the remaining mempool capacity. 
- 
struct MEMPOOL
- The user should treat this as an opaque structure. No member should be directly accessed or modified. 
- 
void MEMPOOL_Init(struct MEMPOOL *const M, const uintptr_t BaseAddr, const uint32_t Size)
- Initializes a - MEMPOOLinstance.- Parameters
- BaseAddr – Memory region start address. The address must be aligned to a 64-bit boundary; this condition is asserted. 
- Size – Memory region size, in octets. Must be a multiple of eight; this condition is asserted. 
 
 
- 
void *MEMPOOL_Block(struct MEMPOOL *const M, const uint32_t ReqSize, const char *const Description)
- Reserves and returns a memory block. The user must confirm there is enough space for a block allocation of the requested size; this condition is asserted. See - MEMPOOL_Available().- Parameters
- ReqSize – Requested size or - MEMPOOL_BLOCKSIZE_REMAINSto ask for all space left. The returned memory block size is round up to the next multiple of eight.
- Description – Unique block name, purpose, or - NULL. The block will keep a copy of this pointer; it won’t duplicate the original string contents. The user must guarantee that the string pointer passed will not change its memory allocation to avoid a dangling pointer.
 
- Returns
- Pointer to the new memory block address. The address is 64-bit aligned. 
 
- 
uint32_t MEMPOOL_BlockSize(void *const Block)
- Returns a memory block size. - Parameters
- Block – A valid memory block pointer as returned by - MEMPOOL_Block(); this condition is asserted.
 
- Returns
- Memory block size, in octets.