jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 (изменено) · Жалоба Компилирую проект. Результативный используемый 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Килобайт ? Новуй модуль не тянет никаких сторонних библиотек. Изменено 22 декабря, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба Стандартный ответ - смотреть/сравнивать map. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 (изменено) · Жалоба 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. Чё то я не понимаю это явление. Изменено 22 декабря, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба Вам явно намекнули, что в map будет виден объект, под который выделены эти десятки кБайт. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 14 minutes ago, jenya7 said: сравнил с Beyond Compare В данном случае исчерпывающий ответ может дать только map-файл, основное предназначение которого - дать ответ на вопрос о всей распределённой памяти. Никто здесь на форуме не сможет дать иной ответ, КМК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 (изменено) · Жалоба On 12/22/2022 at 9:11 AM, Arlleex said: Вам явно намекнули, что в map будет виден объект, под который выделены эти десятки кБайт. On 12/22/2022 at 9:12 AM, haker_fox said: В данном случае исчерпывающий ответ может дать только map-файл, основное предназначение которого - дать ответ на вопрос о всей распределённой памяти. Никто здесь на форуме не сможет дать иной ответ, КМК. сравнил. добавилось пару объектов ну максимум 2 кило. Изменено 22 декабря, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 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]; ... } В опасную игру играете 😃 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба On 12/22/2022 at 9:16 AM, Arlleex said: В опасную игру играете 😃 удобно было для отладки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 21 minutes ago, jenya7 said: добавилось пару объектов ну максимум 2 кило. Может быть размер других объектов изменился по какой-либо причине? Т.е. Вы видите, что добавилось 2 кБ, но на самом деле за счёт изменения объёма других объектов ещё прибавилось 8 кБ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 (изменено) · Жалоба 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) сам принимает решения о динамическом выделении памяти? Изменено 22 декабря, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 7 minutes ago, jenya7 said: он (IAR) сам принимает решения о динамическом выделении памяти? Нет, не сам. Но думаю, что может выбросить блок HEAP, если нет обращений для выделения динамической памяти. А если есть - конечно оставит, и размер прибавится. Ищите прямые или косвенные вызовы malloc, calloc, что там в Си ещё есть? Не помню, т.к. очень редко использую динаимеческую память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 8 минут назад, jenya7 сказал: такое ощущение что во втором случае подключается - HEAP 0x2000 Вот вам и советуют превратить ощущение в уверенность с помощью .MAP файла: Пользуясь случаем, спрошу у знатоков: Существуют ли какие-то удобные инструменты для визуализации/анализа *.map файлов? Чтобы открыл файл в окошке, а там наглядно показано сколько-чего-откуда-куда линкёр положил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба Возможно, в этом куске кода дело. Посмотрите в отладчике или в том же .MAP, на который тут уже несколько раз намекали, в какой области выделяется память для args[]. 1 hour ago, jenya7 said: body_len = strlen(body); char args[body_len-1]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 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 не показывает свой адрес. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 1 hour ago, jenya7 said: сравнил. добавилось пару объектов ну максимум 2 кило. Так не бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться