Перейти к содержанию
    

Непонятное увеличение RAM

Компилирую проект. Результативный используемый RAM -   27 117 bytes of readwrite data memory. (всего в камне - 32К)

Добавляю в проект файл

#define FUNC_ARGS_MAX    7
#define FUNC_ARG_LEN     128

#define ARGS_MAX  FUNC_ARGS_MAX
  
typedef struct
{
   int idx;
   int type;

   char arguments[FUNC_ARGS_MAX][FUNC_ARG_LEN];
}FUNCTION;

FUNCTION functions[1];

int ParseFunction(char *src, FUNCTION *func, int idx)
{
    int str_len; 
    int name_len=0;
    int body_len;
    int argc = 0;
    
    //first get a function name
    char *name = ToLower(src);
    
    RemoveEmptySpaces(name);
    str_len = strlen(src);
    
    if(strncmp("fovc", name, 4)==0)
    {
        func->type = FUNC_TYPE_OVC;
        name_len = 4;
    }
    else if(strncmp("stall", name, 5)==0)
    {
        func->type = FUNC_TYPE_STALL;
        name_len = 5;
    }
    else if(strncmp("poslim", name, 6)==0)
    {
        func->type = FUNC_TYPE_POSLIM;
        name_len = 6;
    }
    else if(strncmp("posfix", name, 6)==0)
    {
        func->type = FUNC_TYPE_POSFIX;
        name_len = 6;
    }
    else
        return -1;
    
    //all in ()
    body_len = str_len - name_len;
    char body[body_len];
    strcpy(body, &src[name_len]);
    
    if (body[0] != '(' || body[body_len-1] != ')')
        return -1;

    //get arguments
    body_len = strlen(body);
    
    char args[body_len-1];
    strncpy(args, &body[1], body_len-2);
    args[body_len-2] = '\0';
    
    char* arguments[ARGS_MAX]={ NULL };
    arguments[argc] = strtok(args, ",");
    while (arguments[argc] != NULL)
    {
        if(argc >= ARGS_MAX)
           return -1;
        
        arguments[++argc] = strtok (NULL, ",");
    }
    
    for (int i = 0; i < argc; i++)
    {
        if (strlen(arguments[i]) < FUNC_ARG_LEN)
            strcpy(func->arguments[i], arguments[i]);
        else
            return -2;
    }
    
    func->idx = idx;
   
   return func->idx;
}

Компилирую отдельно файл -  904 bytes of DATA  memory - всё правильно.

Добавляю строку в другом файле

val = ParseFunction(current_tok.name, &functions[func_idx], func_idx);

и получаю переполнение RAM

Quote

Error[Lp011]: section placement failed 
            unable to allocate space for sections/blocks with a total estimated minimum size of 0x8d84 bytes (max align 0x8) in <[0x20000000-0x20007fff]> (total uncommitted space 0x8000). 

 

  36 225 bytes of readwrite data memory 

Откуда может насосаться ещё почти 10Килобайт ? Новуй модуль не тянет никаких сторонних библиотек.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/22/2022 at 8:43 AM, aaarrr said:

Стандартный ответ - смотреть/сравнивать map.

сравнил с Beyond Compare. добавилось несколько объектных файлов но размеры смешные, никак 10К дополнительных не получается, максимум 1-2К.

что да - стак и хип какие то раздутые 

"P2", part 3 of 3 (*** FAILED ***):        0x4000
  CSTACK                                   0x2000  <Block>
    CSTACK            uninit               0x2000  <Block tail>
  HEAP                                     0x2000  <Block>
    HEAP              uninit               0x2000  <Block tail>
                                           0x4000

подрезал

  CSTACK 0x1000  
  HEAP    0x0000  
            

теперь влезает, даже суммарный RAM уменьшился  -  23 937 bytes of readwrite data memory. Чё то я не понимаю это явление. 

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам явно намекнули, что в map будет виден объект, под который выделены эти десятки кБайт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, jenya7 said:

сравнил с Beyond Compare

В данном случае исчерпывающий ответ может дать только map-файл, основное предназначение которого - дать ответ на вопрос о всей распределённой памяти. Никто здесь на форуме не сможет дать иной ответ, КМК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/22/2022 at 9:11 AM, Arlleex said:

Вам явно намекнули, что в map будет виден объект, под который выделены эти десятки кБайт.

 

On 12/22/2022 at 9:12 AM, haker_fox said:

В данном случае исчерпывающий ответ может дать только map-файл, основное предназначение которого - дать ответ на вопрос о всей распределённой памяти. Никто здесь на форуме не сможет дать иной ответ, КМК.

сравнил. добавилось пару объектов ну максимум 2 кило.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 минуты назад, jenya7 сказал:
int ParseFunction(char *src, FUNCTION *func, int idx)
{
  ...
    str_len = strlen(src);
    
    body_len = str_len - name_len;
    char body[body_len];
    ...
    
    body_len = strlen(body);
    char args[body_len-1];
    ...
}

В опасную игру играете 😃

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, jenya7 said:

добавилось пару объектов ну максимум 2 кило.

Может быть размер других объектов изменился по какой-либо причине?

Т.е. Вы видите, что добавилось 2 кБ, но на самом деле за счёт изменения объёма других объектов ещё прибавилось 8 кБ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/22/2022 at 9:38 AM, haker_fox said:

Может быть размер других объектов изменился по какой-либо причине?

Т.е. Вы видите, что добавилось 2 кБ, но на самом деле за счёт изменения объёма других объектов ещё прибавилось 8 кБ.

не вижу никаких существенных изменений. такое ощущение что во втором случае подключается -  HEAP  0x2000. как раз по размеру подходит. я его подрезал и всё нормализовалось.

 

во втором случае в  PLACEMENT SUMMARY добавляется

Quote

"P2", part 3 of 3 (*** FAILED ***):        0x4000
  CSTACK                                   0x2000  <Block>
    CSTACK            uninit               0x2000  <Block tail>
  HEAP                                     0x2000  <Block>
    HEAP              uninit               0x2000  <Block tail>
                                           0x4000
 

в первом случае  HEAP нету. он (IAR) сам принимает решения о динамическом выделении памяти?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, jenya7 said:

он (IAR) сам принимает решения о динамическом выделении памяти?

Нет, не сам. Но думаю, что может выбросить блок HEAP, если нет обращений для выделения динамической памяти. А если есть - конечно оставит, и размер прибавится.

Ищите прямые или косвенные вызовы malloc, calloc, что там в Си ещё есть? Не помню, т.к. очень редко использую динаимеческую память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, jenya7 сказал:

такое ощущение что во втором случае подключается -  HEAP  0x2000

Вот вам и советуют превратить ощущение в уверенность с помощью .MAP файла:

image.png.d1af335f2ecf94ca0db5a8cdd14aaebf.png

Пользуясь случаем, спрошу у знатоков: Существуют ли какие-то удобные инструменты для визуализации/анализа *.map файлов?  Чтобы открыл файл  в окошке, а там наглядно показано сколько-чего-откуда-куда линкёр положил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно, в этом куске кода дело. Посмотрите в отладчике или в том же .MAP, на который тут уже несколько раз намекали, в какой области выделяется память для args[].

1 hour ago, jenya7 said:
    body_len = strlen(body);
    
    char args[body_len-1];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/22/2022 at 10:12 AM, AndyBig said:

Возможно, в этом куске кода дело. Посмотрите в отладчике или в том же .MAP, на который тут уже несколько раз намекали, в какой области выделяется память для args[].

MAP так глубоко не копает. показывает только глобальные объекты. а по каким адресам располагается HEAP?  адрес STACK есть

Quote

"P2", part 2 of 3:                         0x2000
  CSTACK                       0x20000060  0x2000  <Block>
    CSTACK            uninit   0x20000060  0x2000  <Block tail>
                             - 0x20002060  0x2000
 

а HEAP не показывает свой адрес.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

сравнил. добавилось пару объектов ну максимум 2 кило.

Так не бывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...