ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
1175425 Топик полностью
Oman (18.02.2022 18:10, просмотров: 168) ответил IBAH на Устал дефайнить, хочу попробовать динамическое выделение памяти (ИАР АРМ). Какую функцию использовать? Что настроить, чтобы не было мучительно больно?
Использую кучу 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 ];
}