Использую кучу 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 ]; }