58 #define LIB_MEM_MODULE
97 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
101 #ifndef LIB_MEM_CFG_HEAP_BASE_ADDR
113 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
115 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
163 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
169 pmem_pool->SegPrevPtr = (MEM_POOL *) 0;
170 pmem_pool->SegNextPtr = (MEM_POOL *) 0;
171 pmem_pool->PoolPrevPtr = (MEM_POOL *) 0;
172 pmem_pool->PoolNextPtr = (MEM_POOL *) 0;
173 pmem_pool->PoolAddrStart = (
void *) 0;
174 pmem_pool->PoolAddrEnd = (
void *) 0;
175 pmem_pool->PoolPtrs = (
void **) 0;
180 #ifdef LIB_MEM_CFG_HEAP_BASE_ADDR
181 pmem_pool->SegAddr = (
void *) LIB_MEM_CFG_HEAP_BASE_ADDR;
182 pmem_pool->SegAddrNextAvail = (
void *) LIB_MEM_CFG_HEAP_BASE_ADDR;
184 pmem_pool->SegAddr = (
void *)&
Mem_Heap[0];
185 pmem_pool->SegAddrNextAvail = (
void *)&
Mem_Heap[0];
279 if (pmem == (
void *)0) {
285 for (i = 0; i <
sizeof(
CPU_ALIGN); i++) {
294 if (mem_align_modulo != 0) {
295 i = mem_align_modulo;
296 while ((size_rem > 0) &&
298 *pmem_08++ = data_val;
306 *pmem_align++ = data_align;
311 while (size_rem > 0) {
312 *pmem_08++ = data_val;
355 #if (LIB_MEM_CFG_OPTIMIZE_ASM_EN != DEF_ENABLED)
374 if (pdest == (
void *)0) {
377 if (psrc == (
void *)0) {
390 mem_aligned = (mem_align_modulo_dest == mem_align_modulo_src) ?
DEF_YES :
DEF_NO;
394 if (mem_align_modulo_dest != 0) {
395 i = mem_align_modulo_dest;
396 while ((size_rem > 0) &&
398 *pmem_08_dest++ = *pmem_08_src++;
404 pmem_align_dest = (
CPU_ALIGN *)pmem_08_dest;
405 pmem_align_src = (
CPU_ALIGN *)pmem_08_src;
407 *pmem_align_dest++ = *pmem_align_src++;
415 while (size_rem > 0) {
416 *pmem_08_dest++ = *pmem_08_src++;
485 if (p1_mem == (
void *)0) {
488 if (p2_mem == (
void *)0) {
502 mem_aligned = (mem_align_modulo_1 == mem_align_modulo_2) ?
DEF_YES :
DEF_NO;
506 if (mem_align_modulo_1 != 0) {
507 i = mem_align_modulo_1;
513 if (*p1_mem_08 != *p2_mem_08) {
529 if (*p1_mem_align != *p2_mem_align) {
544 if (*p1_mem_08 != *p2_mem_08) {
591 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
597 MEM_POOL *pmem_pool_heap;
610 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
625 pmem_addr = pmem_pool_heap->SegAddrNextAvail;
626 size_rem = pmem_pool_heap->SegSizeRem;
631 if (size_req > size_rem) {
635 *poctets_reqd = size_req - size_rem;
641 if (pmem_blk == (
void *)0) {
645 *poctets_reqd = size_req;
682 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
688 if (pmem_pool == (MEM_POOL *)0) {
695 pmem_pool->SegPrevPtr = (MEM_POOL *)0;
696 pmem_pool->SegNextPtr = (MEM_POOL *)0;
697 pmem_pool->PoolPrevPtr = (MEM_POOL *)0;
698 pmem_pool->PoolNextPtr = (MEM_POOL *)0;
699 pmem_pool->PoolAddrStart = (
void *)0;
700 pmem_pool->PoolAddrEnd = (
void *)0;
701 pmem_pool->PoolPtrs = (
void **)0;
707 pmem_pool->SegAddr = (
void *)0;
708 pmem_pool->SegAddrNextAvail = (
void *)0;
867 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
869 void *pmem_base_addr,
877 MEM_POOL *pmem_pool_heap;
878 MEM_POOL *pmem_pool_prev;
879 MEM_POOL *pmem_pool_next;
880 MEM_POOL *pmem_pool_blk;
913 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
914 if (pmem_base_addr != (
void *)0) {
950 if (pmem_base_addr == (
void *)0) {
951 pmem_pool_blk = pmem_pool_heap;
952 pmem_pool_prev = pmem_pool_heap;
953 pmem_pool_next = pmem_pool_heap;
957 pmem_addr_ptrs = (
CPU_INT08U *)pmem_pool_heap->SegAddrNextAvail;
963 pmem_addr_pool = pmem_addr_ptrs + size_tot_ptrs;
969 size_tot = size_tot_ptrs + size_tot_pool;
970 size_rem = pmem_pool_heap->SegSizeRem;
972 if (size_tot > size_rem) {
976 *poctets_reqd = size_tot - size_rem;
984 pmem_base_addr_start = (
CPU_INT08U *)pmem_base_addr;
985 pmem_base_addr_end = (
CPU_INT08U *)pmem_base_addr + mem_size - 1;
987 pmem_pool_blk = (MEM_POOL *)0;
988 pmem_pool_prev = (MEM_POOL *)0;
991 while (pmem_pool_next != (MEM_POOL *)0) {
993 if ((pmem_base_addr == pmem_pool_next->SegAddr) &&
994 (mem_size == pmem_pool_next->SegSizeTot)) {
996 pmem_pool_blk = pmem_pool_next;
997 pmem_pool_prev = pmem_pool_next;
1001 pmem_seg_addr_start = (
CPU_INT08U *)pmem_pool_next->SegAddr;
1002 pmem_seg_addr_end = (
CPU_INT08U *)pmem_pool_next->SegAddr + pmem_pool_next->SegSizeTot - 1;
1005 if (pmem_base_addr_end < pmem_seg_addr_start) {
1009 }
else if (((pmem_base_addr_start <= pmem_seg_addr_start) &&
1010 (pmem_base_addr_end >= pmem_seg_addr_start)) ||
1011 ((pmem_base_addr_start >= pmem_seg_addr_start) &&
1012 (pmem_base_addr_end <= pmem_seg_addr_end )) ||
1013 ((pmem_base_addr_start <= pmem_seg_addr_end ) &&
1014 (pmem_base_addr_end >= pmem_seg_addr_end ))) {
1021 pmem_pool_prev = pmem_pool_next;
1022 pmem_pool_next = pmem_pool_next->SegNextPtr;
1025 if (pmem_pool_blk == (MEM_POOL *)0) {
1026 pmem_pool_blk = pmem_pool;
1027 pmem_pool->SegAddr = pmem_base_addr;
1028 pmem_pool->SegAddrNextAvail = pmem_base_addr;
1029 pmem_pool->SegSizeTot = mem_size;
1030 pmem_pool->SegSizeRem = mem_size;
1036 pmem_addr_ptrs = (
CPU_INT08U *)pmem_pool_heap->SegAddrNextAvail;
1041 size_rem = pmem_pool_heap->SegSizeRem;
1043 if (size_tot_ptrs > size_rem) {
1047 *poctets_reqd = size_tot_ptrs - size_rem;
1053 pmem_addr_pool = (
CPU_INT08U *)pmem_pool_blk->SegAddrNextAvail;
1058 size_rem = pmem_pool_blk->SegSizeRem;
1060 if (size_tot_pool > size_rem) {
1064 *poctets_reqd = size_tot_pool - size_rem;
1072 size_pool_ptrs = blk_nbr *
sizeof(
void *);
1077 if (ppool_ptr == (
void **)0) {
1078 size_rem = pmem_pool_heap->SegSizeRem;
1082 if (pmem_base_addr == (
void *)0) {
1083 if (size_tot > size_rem) {
1084 *poctets_reqd = size_tot - size_rem;
1086 *poctets_reqd = size_tot;
1089 if (size_pool_ptrs > size_rem) {
1090 *poctets_reqd = size_pool_ptrs - size_rem;
1092 *poctets_reqd = size_pool_ptrs;
1099 for (i = 0; i < blk_nbr; i++) {
1101 if (pmem_blk == (
void *)0) {
1102 pmem_addr_pool = (
CPU_INT08U *)pmem_pool_blk->SegAddrNextAvail;
1103 size_rem = (
CPU_SIZE_T )pmem_pool_blk->SegSizeRem;
1107 blk_rem = blk_nbr - i;
1112 if (size_tot > size_rem) {
1113 *poctets_reqd = size_tot - size_rem;
1115 *poctets_reqd = size_tot;
1120 ppool_ptr[i] = pmem_blk;
1126 if (pmem_pool_prev == pmem_pool_next) {
1128 pmem_pool_next = pmem_pool_blk->PoolNextPtr;
1129 pmem_pool->PoolPrevPtr = pmem_pool_blk;
1130 pmem_pool->PoolNextPtr = pmem_pool_next;
1131 pmem_pool_blk->PoolNextPtr = pmem_pool;
1132 if (pmem_pool_next != (MEM_POOL *)0) {
1133 pmem_pool_next->PoolPrevPtr = pmem_pool;
1138 pmem_pool->SegPrevPtr = pmem_pool_prev;
1139 pmem_pool->SegNextPtr = pmem_pool_next;
1141 if (pmem_pool_prev != (MEM_POOL *)0) {
1142 pmem_pool_prev->SegNextPtr = pmem_pool;
1147 if (pmem_pool_next != (MEM_POOL *)0) {
1148 pmem_pool_next->SegPrevPtr = pmem_pool;
1155 pmem_pool->PoolAddrStart = (
void *) pmem_addr_pool;
1156 pmem_pool->PoolAddrEnd = (
void *)(pmem_addr_pool + size_tot_pool - 1);
1157 pmem_pool->PoolPtrs = (
void **) ppool_ptr;
1158 pmem_pool->PoolSize = (
CPU_SIZE_T ) size_tot_pool;
1159 pmem_pool->BlkAlign = (
CPU_SIZE_T ) blk_align;
1203 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
1212 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1213 if (pmem_pool == (MEM_POOL *)0) {
1221 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1228 if (size > pmem_pool->BlkSize) {
1235 if (pmem_pool->BlkIx < 1) {
1241 if (pmem_pool->BlkIx > pmem_pool->BlkNbr) {
1249 pmem_blk = pmem_pool->PoolPtrs[pmem_pool->BlkIx];
1292 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
1297 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1304 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1305 if (pmem_pool == (MEM_POOL *)0) {
1310 if (pmem_blk == (
void *)0) {
1318 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1326 if (pmem_pool->BlkIx >= pmem_pool->BlkNbr) {
1332 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1334 if (addr_valid !=
DEF_OK) {
1340 for (i = 0; i < pmem_pool->BlkIx; i++) {
1341 if (pmem_blk == pmem_pool->PoolPtrs[i]) {
1350 pmem_pool->PoolPtrs[pmem_pool->BlkIx] = pmem_blk;
1391 #if ((LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED) && \
1392 (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED))
1397 void *ppool_addr_start;
1398 void *ppool_addr_end;
1409 ppool_addr_start = pmem_pool->PoolAddrStart;
1410 ppool_addr_end = pmem_pool->PoolAddrEnd;
1412 if ((pmem_blk < ppool_addr_start) ||
1413 (pmem_blk > ppool_addr_end)) {
1419 if (align_offset != 0) {
1420 mem_align_offset = blk_align - align_offset;
1422 mem_align_offset = 0;
1425 blk_size = pmem_pool->BlkSize;
1426 align_offset = blk_size % blk_align;
1427 if (align_offset != 0) {
1428 blk_align_offset = blk_align - align_offset;
1430 blk_align_offset = 0;
1435 mem_align = (
CPU_SIZE_T )( blk_size + blk_align_offset);
1437 addr_valid = ((mem_diff % mem_align) == 0) ?
DEF_YES :
DEF_NO;
1439 return (addr_valid);
1542 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
1554 align_offset = (
CPU_ADDR)pmem_addr % blk_align;
1555 if (align_offset != 0) {
1556 mem_align_offset = blk_align - align_offset;
1558 mem_align_offset = 0;
1561 align_offset = blk_size % blk_align;
1562 if (align_offset != 0) {
1563 blk_align_offset = blk_align - align_offset;
1565 blk_align_offset = 0;
1568 size_tot = mem_align_offset + ((blk_size + blk_align_offset) * (blk_nbr - 1)) + blk_size;
1605 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
1619 pmem_addr = (
CPU_INT08U *)pmem_pool->SegAddrNextAvail;
1623 if (mem_align != 0) {
1624 align_offset = align - mem_align;
1629 size_tot = align_offset + size;
1630 size_rem = pmem_pool->SegSizeRem;
1632 if (size_tot > size_rem) {
1637 pmem_addr += align_offset;
1639 pmem_pool->SegAddrNextAvail = pmem_addr + size;
1640 pmem_pool->SegSizeRem -= size_tot;
1644 return ((
void *)pmem_addr);