67 uint8_t *p_return = NULL;
68 mem_blk_header_t *p_block = &mem_blk_start;
70 AKOS_CORE_ENTER_CRITICAL();
73 if (mem_blk_end_ptr == NULL)
79 size = MEM_ALIGN(size);
80 if ((size == 0) || (size > byte_available))
82 core_assert(0,
"OS_ERR_MEM_INVALID_SIZE");
83 AKOS_CORE_EXIT_CRITICAL();
84 return (
void *)p_return;
87 p_block = p_block->next_ptr;
88 while (p_block != mem_blk_end_ptr)
90 if ((p_block->size < size) || (p_block->state == MEM_STATE_BUSY))
92 p_block = p_block->next_ptr;
103 if ((p_block->state == MEM_STATE_BUSY) || (p_block->size < size))
105 core_assert(0,
"OS_ERR_MEM_NO_BLOCK");
106 AKOS_CORE_EXIT_CRITICAL();
107 return (
void *)p_return;
110 if ((p_block->size - size) > (MIN_SIZE_TO_SPLIT + SIZE_OF_BLOCK_HEADER))
112 mem_blk_header_t *p_new_block = (mem_blk_header_t *)(((uint8_t *)p_block) + SIZE_OF_BLOCK_HEADER + size);
113 p_return = (uint8_t *)p_block + SIZE_OF_BLOCK_HEADER;
114 p_new_block->size = p_block->size - size - SIZE_OF_BLOCK_HEADER;
115 p_new_block->state = MEM_STATE_FREE;
116 p_new_block->next_ptr = p_block->next_ptr;
118 if (p_new_block->next_ptr == NULL)
120 mem_blk_end_ptr = p_new_block;
123 p_block->size = size;
124 p_block->state = MEM_STATE_BUSY;
125 p_block->next_ptr = p_new_block;
126 byte_available -= (size + SIZE_OF_BLOCK_HEADER);
130 p_return = ((uint8_t *)p_block + SIZE_OF_BLOCK_HEADER);
131 p_block->state = MEM_STATE_BUSY;
132 byte_available -= p_block->size;
136 AKOS_CORE_EXIT_CRITICAL();
137 return (
void *)p_return;
146 AKOS_CORE_ENTER_CRITICAL();
148 if ((mem_blk_end_ptr == NULL))
150 core_assert(0,
"OS_ERR_MEM_LIST_IS_EMPTY");
151 AKOS_CORE_EXIT_CRITICAL();
157 core_assert(0,
"OS_ERR_MEM_INVALID_ADDRESS");
158 AKOS_CORE_EXIT_CRITICAL();
162 uint8_t is_above_heap_end =
163 ((uint8_t *)p_addr >= ((uint8_t *)mem_blk_end_ptr + SIZE_OF_BLOCK_HEADER + mem_blk_end_ptr->size));
165 uint8_t is_below_heap_start =
166 ((uint8_t *)p_addr < ((uint8_t *)mem_blk_start.next_ptr + SIZE_OF_BLOCK_HEADER));
168 if (is_above_heap_end || is_below_heap_start)
170 core_assert(0,
"OS_ERR_MEM_INVALID_ADDRESS");
171 AKOS_CORE_EXIT_CRITICAL();
175 mem_blk_header_t *p_block = (mem_blk_header_t *)((uint8_t *)p_addr - SIZE_OF_BLOCK_HEADER);
176 mem_blk_header_t *p_block_temp = &mem_blk_start;
177 mem_blk_header_t *p_prev_block = p_block_temp;
179 while ((p_block_temp != mem_blk_end_ptr) && (p_block_temp != p_block))
181 p_prev_block = p_block_temp;
182 p_block_temp = p_block_temp->next_ptr;
185 if (p_block_temp != p_block)
187 core_assert(0,
"OS_ERR_MEM_INVALID_ADDRESS");
188 AKOS_CORE_EXIT_CRITICAL();
192 if (p_block_temp->state == MEM_STATE_FREE)
194 core_assert(0,
"OS_ERR_MEM_DOUBLE_FREE");
195 AKOS_CORE_EXIT_CRITICAL();
199 byte_available += p_block_temp->size;
200 p_block_temp->state = MEM_STATE_FREE;
203 if ((p_block_temp->next_ptr != NULL) && (p_block_temp->next_ptr->state == MEM_STATE_FREE))
205 byte_available += SIZE_OF_BLOCK_HEADER;
206 p_block_temp->size += p_block_temp->next_ptr->size + SIZE_OF_BLOCK_HEADER;
207 p_block_temp->next_ptr = p_block_temp->next_ptr->next_ptr;
208 if (p_block_temp->next_ptr == NULL)
210 mem_blk_end_ptr = p_block_temp;
215 if ((p_prev_block->state == MEM_STATE_FREE) && (p_prev_block != &mem_blk_start))
217 if (mem_blk_end_ptr == p_block_temp)
219 mem_blk_end_ptr = p_prev_block;
222 byte_available += SIZE_OF_BLOCK_HEADER;
223 p_prev_block->size += p_block_temp->size + SIZE_OF_BLOCK_HEADER;
224 p_prev_block->next_ptr = p_block_temp->next_ptr;
227 AKOS_CORE_EXIT_CRITICAL();