123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- #include "memory_manager.h"
- #define MemoryMINIMUM_BLOCK_SIZE ((size_t)(pMemoryStructSize << 1))
- #define MemoryBITS_PER_BYTE ((size_t)8)
- #define BYTE_ALIGNMENT (uint8_t)8UL
- #define BYTE_ALIGNMENT_MASK (uint8_t)(BYTE_ALIGNMENT - 1)
- MemoryStruct SRAM0 = {
- .pMemory = (uint8_t *)0x24000000,
- AXISRAMSIZE,
- 0,
- 0,
- 0,
- 0,
- };
- MemoryStruct SRAM1 = {
-
- .pMemory = (uint8_t *)0x10000000,
- SRAM1SIZE,
- 0,
- 0,
- 0,
- 0,
- };
- MemoryStruct SRAM2 = {
-
- .pMemory = (uint8_t *)0x30020000,
- SRAM2SIZE,
- 0,
- 0,
- 0,
- 0,
- };
- MemoryStruct SDRAM = {
- .pMemory = (uint8_t *)0xC0400000,
- SDRAMSIZE,
- 0,
- 0,
- 0,
- 0,
- };
- static void pInsertBlockIntoFreeList(MemoryStruct *mem, BlockLink_t *pxBlockToInsert);
- static const size_t pMemoryStructSize = (sizeof(BlockLink_t) + ((size_t)(BYTE_ALIGNMENT - 1))) & ~((size_t)BYTE_ALIGNMENT_MASK);
- static size_t pBlockAllocatedBit = 0;
- void *pMemoryMalloc(MemoryStruct *mem, size_t xWantedSize)
- {
- BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
- void *pvReturn = NULL;
- __set_PRIMASK(1);
-
- if ((xWantedSize & pBlockAllocatedBit) == 0)
- {
- if (xWantedSize > 0)
- {
-
- xWantedSize += pMemoryStructSize;
-
- if ((xWantedSize & BYTE_ALIGNMENT_MASK) != 0x00)
- {
-
- xWantedSize += (BYTE_ALIGNMENT - (xWantedSize & BYTE_ALIGNMENT_MASK));
- }
- }
-
- if ((xWantedSize > 0) && (xWantedSize <= mem->Free))
- {
-
- pxPreviousBlock = &mem->pStart;
- pxBlock = mem->pStart.pxNextFreeBlock;
- while ((pxBlock->xBlockSize < xWantedSize) && (pxBlock->pxNextFreeBlock != NULL))
- {
- pxPreviousBlock = pxBlock;
- pxBlock = pxBlock->pxNextFreeBlock;
- }
-
- if (pxBlock != mem->pEnd)
- {
-
- pvReturn = (void *)(((uint8_t *)pxPreviousBlock->pxNextFreeBlock) + pMemoryStructSize);
-
- pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
-
- if ((pxBlock->xBlockSize - xWantedSize) > MemoryMINIMUM_BLOCK_SIZE)
- {
-
- pxNewBlockLink = (void *)(((uint8_t *)pxBlock) + xWantedSize);
-
- pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
-
- pxBlock->xBlockSize = xWantedSize;
-
- pInsertBlockIntoFreeList(mem, pxNewBlockLink);
- }
-
- mem->Free -= pxBlock->xBlockSize;
- if (mem->Free < mem->MinFree)
- {
-
- mem->MinFree = mem->Free;
- }
-
- pxBlock->xBlockSize |= pBlockAllocatedBit;
- pxBlock->pxNextFreeBlock = NULL;
- }
- }
- }
-
- return pvReturn;
- }
- void *pMemoryReMalloc(MemoryStruct *mem1, MemoryStruct *mem2, void *ptr, size_t size)
- {
- size_t *offset = NULL;
- offset = pMemoryMalloc(mem1, size);
- if (offset == NULL)
- {
- return NULL;
- }
- else
- {
- memcpy(offset, ptr, size);
- pMemoryFree(mem2, ptr);
- }
- return offset;
- }
- void pMemoryFree(MemoryStruct *mem, void *pv)
- {
- uint8_t *puc = (uint8_t *)pv;
- BlockLink_t *pxLink;
- if (pv == NULL)
- return;
-
- puc -= pMemoryStructSize;
-
- pxLink = (void *)puc;
-
- if ((pxLink->xBlockSize & pBlockAllocatedBit) != 0)
- {
- if (pxLink->pxNextFreeBlock == NULL)
- {
-
- pxLink->xBlockSize &= ~pBlockAllocatedBit;
- __set_PRIMASK(1);
-
- mem->Free += pxLink->xBlockSize;
- pInsertBlockIntoFreeList(mem, ((BlockLink_t *)pxLink));
- __set_PRIMASK(0);
- }
- }
- }
- size_t pMemoryGetFreeMemorySize(MemoryStruct *mem)
- {
- return mem->Free;
- }
- size_t pMemoryGetMinimumEverFreeMemorySize(MemoryStruct *mem)
- {
- return mem->MinFree;
- }
- void pMemoryInit(MemoryStruct *mem)
- {
- BlockLink_t *pxFirstFreeBlock;
- uint8_t *pucAlignedHeap;
- size_t uxAddress;
- size_t xTotalHeapSize = mem->size;
- memset((void *)mem->pMemory, 0, mem->size);
-
- uxAddress = (size_t)mem->pMemory;
-
- if ((uxAddress & BYTE_ALIGNMENT_MASK) != 0)
- {
- uxAddress += (BYTE_ALIGNMENT - 1);
- uxAddress &= ~((size_t)BYTE_ALIGNMENT_MASK);
- xTotalHeapSize -= uxAddress - (size_t)mem->pMemory;
- }
- pucAlignedHeap = (uint8_t *)uxAddress;
-
- mem->pStart.pxNextFreeBlock = (void *)pucAlignedHeap;
- mem->pStart.xBlockSize = (size_t)0;
-
- uxAddress = ((size_t)pucAlignedHeap) + xTotalHeapSize;
- uxAddress -= pMemoryStructSize;
- uxAddress &= ~((size_t)BYTE_ALIGNMENT_MASK);
- mem->pEnd = (void *)uxAddress;
- mem->pEnd->xBlockSize = 0;
- mem->pEnd->pxNextFreeBlock = NULL;
-
- pxFirstFreeBlock = (void *)pucAlignedHeap;
- pxFirstFreeBlock->xBlockSize = uxAddress - (size_t)pxFirstFreeBlock;
- pxFirstFreeBlock->pxNextFreeBlock = mem->pEnd;
-
- mem->Free = pxFirstFreeBlock->xBlockSize;
- mem->MinFree = pxFirstFreeBlock->xBlockSize;
-
- pBlockAllocatedBit = ((size_t)1) << ((sizeof(size_t) * MemoryBITS_PER_BYTE) - 1);
- }
- static void pInsertBlockIntoFreeList(MemoryStruct *mem, BlockLink_t *pxBlockToInsert)
- {
- BlockLink_t *pxIterator;
- uint8_t *puc;
-
- for (pxIterator = &mem->pStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock)
- {
- }
-
- puc = (uint8_t *)pxIterator;
- if ((puc + pxIterator->xBlockSize) == (uint8_t *)pxBlockToInsert)
- {
- pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
- pxBlockToInsert = pxIterator;
- }
-
- puc = (uint8_t *)pxBlockToInsert;
- if ((puc + pxBlockToInsert->xBlockSize) == (uint8_t *)pxIterator->pxNextFreeBlock)
- {
- if (pxIterator->pxNextFreeBlock != mem->pEnd)
- {
-
- pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
- pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
- }
- else
- {
- pxBlockToInsert->pxNextFreeBlock = mem->pEnd;
- }
- }
- else
- {
- pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
- }
-
- if (pxIterator != pxBlockToInsert)
- {
- pxIterator->pxNextFreeBlock = pxBlockToInsert;
- }
- }
|