56 #define LIB_MEM_MODULE
95 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
99 #ifndef LIB_MEM_CFG_HEAP_BASE_ADDR
111 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
113 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
161 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
167 pmem_pool->SegPrevPtr = (MEM_POOL *) 0;
168 pmem_pool->SegNextPtr = (MEM_POOL *) 0;
169 pmem_pool->PoolPrevPtr = (MEM_POOL *) 0;
170 pmem_pool->PoolNextPtr = (MEM_POOL *) 0;
171 pmem_pool->PoolAddrStart = (
void *) 0;
172 pmem_pool->PoolAddrEnd = (
void *) 0;
173 pmem_pool->PoolPtrs = (
void **) 0;
178 #ifdef LIB_MEM_CFG_HEAP_BASE_ADDR
182 pmem_pool->SegAddr = (
void *)&
Mem_Heap[0];
183 pmem_pool->SegAddrNextAvail = (
void *)&
Mem_Heap[0];
277 if (pmem == (
void *)0) {
283 for (i = 0u; i <
sizeof(
CPU_ALIGN); i++) {
292 if (mem_align_modulo != 0u) {
293 i = mem_align_modulo;
294 while ((size_rem > 0) &&
296 *pmem_08++ = data_val;
304 *pmem_align++ = data_align;
309 while (size_rem > 0) {
310 *pmem_08++ = data_val;
353 #if (LIB_MEM_CFG_OPTIMIZE_ASM_EN != DEF_ENABLED)
372 if (pdest == (
void *)0) {
375 if (psrc == (
void *)0) {
388 mem_aligned = (mem_align_modulo_dest == mem_align_modulo_src) ?
DEF_YES :
DEF_NO;
392 if (mem_align_modulo_dest != 0u) {
393 i = mem_align_modulo_dest;
394 while ((size_rem > 0) &&
396 *pmem_08_dest++ = *pmem_08_src++;
402 pmem_align_dest = (
CPU_ALIGN *)pmem_08_dest;
403 pmem_align_src = (
const CPU_ALIGN *)pmem_08_src;
405 *pmem_align_dest++ = *pmem_align_src++;
409 pmem_08_dest = (
CPU_INT08U *)pmem_align_dest;
410 pmem_08_src = (
const CPU_INT08U *)pmem_align_src;
413 while (size_rem > 0) {
414 *pmem_08_dest++ = *pmem_08_src++;
483 if (p1_mem == (
void *)0) {
486 if (p2_mem == (
void *)0) {
494 p1_mem_08 = (
const CPU_INT08U *)p1_mem + size;
495 p2_mem_08 = (
const CPU_INT08U *)p2_mem + size;
500 mem_aligned = (mem_align_modulo_1 == mem_align_modulo_2) ?
DEF_YES :
DEF_NO;
504 if (mem_align_modulo_1 != 0u) {
505 i = mem_align_modulo_1;
511 if (*p1_mem_08 != *p2_mem_08) {
527 if (*p1_mem_align != *p2_mem_align) {
542 if (*p1_mem_08 != *p2_mem_08) {
591 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
597 MEM_POOL *pmem_pool_heap;
606 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
614 poctets_reqd = (
CPU_SIZE_T *)&octets_reqd_unused;
615 (void)&octets_reqd_unused;
620 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
637 pmem_addr = pmem_pool_heap->SegAddrNextAvail;
638 size_rem = pmem_pool_heap->SegSizeRem;
643 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
646 *poctets_reqd = size;
652 if (size_req > size_rem) {
654 *poctets_reqd = size_req - size_rem;
660 if (pmem_blk == (
void *)0) {
662 *poctets_reqd = size_req;
706 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
711 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
718 if (pmem_pool == (MEM_POOL *)0) {
725 pmem_pool->SegPrevPtr = (MEM_POOL *)0;
726 pmem_pool->SegNextPtr = (MEM_POOL *)0;
727 pmem_pool->PoolPrevPtr = (MEM_POOL *)0;
728 pmem_pool->PoolNextPtr = (MEM_POOL *)0;
729 pmem_pool->PoolAddrStart = (
void *)0;
730 pmem_pool->PoolAddrEnd = (
void *)0;
731 pmem_pool->PoolPtrs = (
void **)0;
737 pmem_pool->SegAddr = (
void *)0;
738 pmem_pool->SegAddrNextAvail = (
void *)0;
900 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
902 void *pmem_base_addr,
910 MEM_POOL *pmem_pool_heap;
911 MEM_POOL *pmem_pool_prev;
912 MEM_POOL *pmem_pool_next;
913 MEM_POOL *pmem_pool_blk;
933 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
941 poctets_reqd = (
CPU_SIZE_T *)&octets_reqd_unused;
942 (void)&octets_reqd_unused;
955 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
956 if (pmem_base_addr != (
void *)0) {
995 if (pmem_base_addr == (
void *)0) {
996 pmem_pool_blk = pmem_pool_heap;
997 pmem_pool_prev = pmem_pool_heap;
998 pmem_pool_next = pmem_pool_heap;
1002 pmem_addr_ptrs = (
CPU_INT08U *)pmem_pool_heap->SegAddrNextAvail;
1007 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1008 if (size_tot_ptrs < 1) {
1015 pmem_addr_pool = pmem_addr_ptrs + size_tot_ptrs;
1020 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1021 if (size_tot_pool < 1) {
1028 size_tot = size_tot_ptrs + size_tot_pool;
1030 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1031 if ((size_tot < size_tot_ptrs) ||
1032 (size_tot < size_tot_pool)) {
1039 size_rem = pmem_pool_heap->SegSizeRem;
1040 if (size_tot > size_rem) {
1042 *poctets_reqd = size_tot - size_rem;
1050 pmem_base_addr_start = (
CPU_INT08U *)pmem_base_addr;
1051 pmem_base_addr_end = (
CPU_INT08U *)pmem_base_addr + mem_size - 1;
1053 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1054 if (pmem_base_addr_end < pmem_base_addr_start) {
1061 pmem_pool_blk = (MEM_POOL *)0;
1062 pmem_pool_prev = (MEM_POOL *)0;
1065 while (pmem_pool_next != (MEM_POOL *)0) {
1067 if ((pmem_base_addr == pmem_pool_next->SegAddr) &&
1068 (mem_size == pmem_pool_next->SegSizeTot)) {
1070 pmem_pool_blk = pmem_pool_next;
1071 pmem_pool_prev = pmem_pool_next;
1075 pmem_seg_addr_start = (
CPU_INT08U *)pmem_pool_next->SegAddr;
1076 pmem_seg_addr_end = (
CPU_INT08U *)pmem_pool_next->SegAddr + pmem_pool_next->SegSizeTot - 1;
1079 if (pmem_base_addr_end < pmem_seg_addr_start) {
1083 }
else if (((pmem_base_addr_start <= pmem_seg_addr_start) &&
1084 (pmem_base_addr_end >= pmem_seg_addr_start)) ||
1085 ((pmem_base_addr_start >= pmem_seg_addr_start) &&
1086 (pmem_base_addr_end <= pmem_seg_addr_end )) ||
1087 ((pmem_base_addr_start <= pmem_seg_addr_end ) &&
1088 (pmem_base_addr_end >= pmem_seg_addr_end ))) {
1095 pmem_pool_prev = pmem_pool_next;
1096 pmem_pool_next = pmem_pool_next->SegNextPtr;
1099 if (pmem_pool_blk == (MEM_POOL *)0) {
1100 pmem_pool_blk = pmem_pool;
1101 pmem_pool->SegAddr = pmem_base_addr;
1102 pmem_pool->SegAddrNextAvail = pmem_base_addr;
1103 pmem_pool->SegSizeTot = mem_size;
1104 pmem_pool->SegSizeRem = mem_size;
1110 pmem_addr_ptrs = (
CPU_INT08U *)pmem_pool_heap->SegAddrNextAvail;
1115 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1116 if (size_tot_ptrs < 1) {
1123 size_rem = pmem_pool_heap->SegSizeRem;
1124 if (size_tot_ptrs > size_rem) {
1126 *poctets_reqd = size_tot_ptrs - size_rem;
1132 pmem_addr_pool = (
CPU_INT08U *)pmem_pool_blk->SegAddrNextAvail;
1137 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1138 if (size_tot_pool < 1) {
1145 size_rem = pmem_pool_blk->SegSizeRem;
1146 if (size_tot_pool > size_rem) {
1148 *poctets_reqd = size_tot_pool - size_rem;
1157 size_pool_ptrs = blk_nbr *
sizeof(
void *);
1162 if (ppool_ptr == (
void **)0) {
1163 size_rem = pmem_pool_heap->SegSizeRem;
1166 if (pmem_base_addr == (
void *)0) {
1167 if (size_tot > size_rem) {
1168 *poctets_reqd = size_tot - size_rem;
1170 *poctets_reqd = size_tot;
1173 if (size_pool_ptrs > size_rem) {
1174 *poctets_reqd = size_pool_ptrs - size_rem;
1176 *poctets_reqd = size_pool_ptrs;
1183 for (i = 0u; i < blk_nbr; i++) {
1185 if (pmem_blk == (
void *)0) {
1186 pmem_addr_pool = (
CPU_INT08U *)pmem_pool_blk->SegAddrNextAvail;
1187 size_rem = (
CPU_SIZE_T )pmem_pool_blk->SegSizeRem;
1189 blk_rem = blk_nbr - i;
1195 if (size_tot > size_rem) {
1196 *poctets_reqd = size_tot - size_rem;
1198 *poctets_reqd = size_tot;
1203 ppool_ptr[i] = pmem_blk;
1209 if (pmem_pool_prev == pmem_pool_next) {
1211 pmem_pool_next = pmem_pool_blk->PoolNextPtr;
1212 pmem_pool->PoolPrevPtr = pmem_pool_blk;
1213 pmem_pool->PoolNextPtr = pmem_pool_next;
1214 pmem_pool_blk->PoolNextPtr = pmem_pool;
1215 if (pmem_pool_next != (MEM_POOL *)0) {
1216 pmem_pool_next->PoolPrevPtr = pmem_pool;
1221 pmem_pool->SegPrevPtr = pmem_pool_prev;
1222 pmem_pool->SegNextPtr = pmem_pool_next;
1224 if (pmem_pool_prev != (MEM_POOL *)0) {
1225 pmem_pool_prev->SegNextPtr = pmem_pool;
1230 if (pmem_pool_next != (MEM_POOL *)0) {
1231 pmem_pool_next->SegPrevPtr = pmem_pool;
1238 pmem_pool->PoolAddrStart = (
void *) pmem_addr_pool;
1239 pmem_pool->PoolAddrEnd = (
void *)(pmem_addr_pool + size_tot_pool - 1);
1240 pmem_pool->PoolPtrs = (
void **) ppool_ptr;
1241 pmem_pool->PoolSize = (
CPU_SIZE_T ) size_tot_pool;
1242 pmem_pool->BlkAlign = (
CPU_SIZE_T ) blk_align;
1286 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
1295 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1302 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1303 if (pmem_pool == (MEM_POOL *)0) {
1316 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1323 if (size > pmem_pool->BlkSize) {
1332 if (pmem_pool->BlkIx < 1) {
1338 if (pmem_pool->BlkIx > pmem_pool->BlkNbr) {
1346 pmem_blk = pmem_pool->PoolPtrs[pmem_pool->BlkIx];
1389 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
1394 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1401 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1408 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1409 if (pmem_pool == (MEM_POOL *)0) {
1414 if (pmem_blk == (
void *)0) {
1422 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1430 if (addr_valid !=
DEF_OK) {
1436 for (i = 0u; i < pmem_pool->BlkIx; i++) {
1437 if (pmem_blk == pmem_pool->PoolPtrs[i]) {
1445 if (pmem_pool->BlkIx >= pmem_pool->BlkNbr) {
1452 pmem_pool->PoolPtrs[pmem_pool->BlkIx] = pmem_blk;
1493 #if ((LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED) && \
1494 (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED))
1499 void *ppool_addr_start;
1500 void *ppool_addr_end;
1511 ppool_addr_start = pmem_pool->PoolAddrStart;
1512 ppool_addr_end = pmem_pool->PoolAddrEnd;
1514 if ((pmem_blk < ppool_addr_start) ||
1515 (pmem_blk > ppool_addr_end)) {
1521 if (align_offset != 0u) {
1522 mem_align_offset = blk_align - align_offset;
1524 mem_align_offset = 0u;
1527 blk_size = pmem_pool->BlkSize;
1528 align_offset = blk_size % blk_align;
1529 if (align_offset != 0u) {
1530 blk_align_offset = blk_align - align_offset;
1532 blk_align_offset = 0u;
1537 mem_align = (
CPU_SIZE_T )( blk_size + blk_align_offset);
1539 addr_valid = ((mem_diff % mem_align) == 0u) ?
DEF_YES :
DEF_NO;
1541 return (addr_valid);
1646 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
1652 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1664 align_offset = (
CPU_ADDR)pmem_addr % blk_align;
1665 if (align_offset != 0u) {
1666 mem_align_offset = blk_align - align_offset;
1668 mem_align_offset = 0u;
1671 align_offset = blk_size % blk_align;
1672 if (align_offset != 0u) {
1673 blk_align_offset = blk_align - align_offset;
1675 blk_align_offset = 0u;
1678 size_tot = mem_align_offset + ((blk_size + blk_align_offset) * (blk_nbr - 1)) + blk_size;
1680 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1681 blk_size_mem_aligned = mem_align_offset + blk_size;
1682 if ((blk_size_mem_aligned < mem_align_offset) ||
1683 (blk_size_mem_aligned < blk_size)) {
1688 blk_size_aligned = blk_size + blk_align_offset;
1689 if ((blk_size_aligned < blk_align_offset) ||
1690 (blk_size_aligned < blk_size)) {
1694 blk_size_aligned_nbr = blk_size_aligned * (blk_nbr - 1);
1695 if ((blk_size_aligned_nbr < blk_size_aligned) ||
1696 (blk_size_aligned_nbr < blk_align_offset) ||
1697 (blk_size_aligned_nbr < blk_size)) {
1701 blk_size_tot = blk_size_aligned_nbr + blk_size;
1702 if ((blk_size_tot < blk_size_aligned_nbr) ||
1703 (blk_size_tot < blk_size)) {
1707 if ((size_tot < blk_size_mem_aligned) ||
1708 (size_tot < blk_size_aligned_nbr) ||
1709 (size_tot < blk_size_tot)) {
1754 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
1766 pmem_addr = (
CPU_INT08U *)pmem_pool->SegAddrNextAvail;
1770 if (mem_align != 0u) {
1771 align_offset = align - mem_align;
1776 size_tot = align_offset + size;
1777 if (size_tot > pmem_pool->SegSizeRem) {
1781 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1782 if ((size_tot < align_offset) ||
1783 (size_tot < size)) {
1788 pmem_addr_next = pmem_addr + size_tot;
1790 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
1791 if (pmem_addr_next < pmem_addr) {
1796 pmem_addr += align_offset;
1798 pmem_pool->SegAddrNextAvail = (
void *)pmem_addr_next;
1799 pmem_pool->SegSizeRem -= (
CPU_SIZE_T)size_tot;
1801 return ((
void *)pmem_addr);