Использую кучу tlsf, в extra options линкера IAR делаю
перенаправление на всякий случай
--redirect malloc=sys_malloc
--redirect free=sys_free
выглядит как-то так, HEAPx блоки из файла линкера, не обязательно все определять, у меня обычно HEAP и HEAP1
static void * heap_base_pool = NULL;
static u32 __heap_segment_num = 0;
static boolean_t __heap_segment_end = FALSE;
#pragma segment="HEAP"
#pragma segment="HEAP1"
#pragma segment="HEAP2"
#pragma segment="HEAP3"
#pragma segment="HEAP4"
static void * __heap_segment_begin[ 4 ] = {
(void *)__segment_begin("HEAP1"),
(void *)__segment_begin("HEAP2"),
(void *)__segment_begin("HEAP3"),
(void *)__segment_begin("HEAP4")
};
static size_t __heap_segment_size[ 4 ] = {
(size_t)__segment_size("HEAP1"),
(size_t)__segment_size("HEAP2"),
(size_t)__segment_size("HEAP3"),
(size_t)__segment_size("HEAP4")
};
void heap_init( void )
{
u32 size = (u32)__segment_size("HEAP");
heap_base_pool = (void *)__segment_begin("HEAP");
memset(heap_base_pool, 0, 4);
init_memory_pool( size, heap_base_pool );
dbg_heap_init();
}
void* heap_get_new_area( size_t size )
{
void * ptr = (void *)~0;
if(__heap_segment_size[ __heap_segment_num ] >= size ) {
if( __heap_segment_end != TRUE )
ptr = __heap_segment_begin[ __heap_segment_num++ ];
}
return ptr;
}
size_t heap_def_area_size( void )
{
if( __heap_segment_size[ __heap_segment_num ] == 0 )
__heap_segment_end = TRUE;
return __heap_segment_size[ __heap_segment_num ];
}