67 uint8_t *p_return = NULL;
68 mem_blk_header_t *p_block = &mem_blk_start;
71 if (mem_blk_end_ptr == NULL)
77 size = MEM_ALIGN(size);
78 if ((size == 0) || (size > byte_available))
80 core_assert(0,
"OS_ERR_MEM_INVALID_SIZE");
81 return (
void *)p_return;
84 p_block = p_block->next_ptr;
85 while (p_block != mem_blk_end_ptr)
87 if ((p_block->size < size) || (p_block->state == MEM_STATE_BUSY))
89 p_block = p_block->next_ptr;
100 if ((p_block->state == MEM_STATE_BUSY) || (p_block->size < size))
102 core_assert(0,
"OS_ERR_MEM_NO_BLOCK");
103 return (
void *)p_return;
106 if ((p_block->size - size) > (MIN_SIZE_TO_SPLIT + SIZE_OF_BLOCK_HEADER))
108 mem_blk_header_t *p_new_block = (mem_blk_header_t *)(((uint8_t *)p_block) + SIZE_OF_BLOCK_HEADER + size);
109 p_return = (uint8_t *)p_block + SIZE_OF_BLOCK_HEADER;
110 p_new_block->size = p_block->size - size - SIZE_OF_BLOCK_HEADER;
111 p_new_block->state = MEM_STATE_FREE;
112 p_new_block->next_ptr = p_block->next_ptr;
114 if (p_new_block->next_ptr == NULL)
116 mem_blk_end_ptr = p_new_block;
119 p_block->size = size;
120 p_block->state = MEM_STATE_BUSY;
121 p_block->next_ptr = p_new_block;
122 byte_available -= (size + SIZE_OF_BLOCK_HEADER);
126 p_return = ((uint8_t *)p_block + SIZE_OF_BLOCK_HEADER);
127 p_block->state = MEM_STATE_BUSY;
128 byte_available -= p_block->size;
132 return (
void *)p_return;
141 if ((mem_blk_end_ptr == NULL))
143 core_assert(0,
"OS_ERR_MEM_LIST_IS_EMPTY");
149 core_assert(0,
"OS_ERR_MEM_INVALID_ADDRESS");
153 uint8_t is_above_heap_end =
154 ((uint8_t *)p_addr >= ((uint8_t *)mem_blk_end_ptr + SIZE_OF_BLOCK_HEADER + mem_blk_end_ptr->size));
156 uint8_t is_below_heap_start =
157 ((uint8_t *)p_addr < ((uint8_t *)mem_blk_start.next_ptr + SIZE_OF_BLOCK_HEADER));
159 if (is_above_heap_end || is_below_heap_start)
161 core_assert(0,
"OS_ERR_MEM_INVALID_ADDRESS");
165 mem_blk_header_t *p_block = (mem_blk_header_t *)((uint8_t *)p_addr - SIZE_OF_BLOCK_HEADER);
166 mem_blk_header_t *p_block_temp = &mem_blk_start;
167 mem_blk_header_t *p_prev_block = p_block_temp;
169 while ((p_block_temp != mem_blk_end_ptr) && (p_block_temp != p_block))
171 p_prev_block = p_block_temp;
172 p_block_temp = p_block_temp->next_ptr;
175 if (p_block_temp != p_block)
177 core_assert(0,
"OS_ERR_MEM_INVALID_ADDRESS");
181 if (p_block_temp->state == MEM_STATE_FREE)
183 core_assert(0,
"OS_ERR_MEM_DOUBLE_FREE");
187 byte_available += p_block_temp->size;
188 p_block_temp->state = MEM_STATE_FREE;
191 if ((p_block_temp->next_ptr != NULL) && (p_block_temp->next_ptr->state == MEM_STATE_FREE))
193 byte_available += SIZE_OF_BLOCK_HEADER;
194 p_block_temp->size += p_block_temp->next_ptr->size + SIZE_OF_BLOCK_HEADER;
195 p_block_temp->next_ptr = p_block_temp->next_ptr->next_ptr;
196 if (p_block_temp->next_ptr == NULL)
198 mem_blk_end_ptr = p_block_temp;
203 if ((p_prev_block->state == MEM_STATE_FREE) && (p_prev_block != &mem_blk_start))
205 if (mem_blk_end_ptr == p_block_temp)
207 mem_blk_end_ptr = p_prev_block;
210 byte_available += SIZE_OF_BLOCK_HEADER;
211 p_prev_block->size += p_block_temp->size + SIZE_OF_BLOCK_HEADER;
212 p_prev_block->next_ptr = p_block_temp->next_ptr;