AlexZabr 0 20 мая, 2007 Опубликовано 20 мая, 2007 · Жалоба Начал писать код проэкта (первый свой проэкт под DSP и С5402 в частности, посему опыта 0) - проблема конфигурации памяти (или моей безграмотности в использовании памяти процессора). Есть несколько больших массивов данных определяемых в программе, + массивы стрингов/чаров. При Build All падает линкер: can't allocate .stack, size 00000400 (page 1) in IDATA (avail: 000003f6) И хотя конфигурация памяти в .cmd почти масимальная, мен кажется проблема в черезмерном кол-ве данных, которыми я забиваю всю память, посему ее и нехватает. Привожу релеваныные кусок кода: int samples = 2900; int original_data[2900*4], unpacked_data[2900*4]; float packed_data[2900]; void f_write(char *str, int arr[], int N); void f_read(char *str, int arr[], int N); extern void ci_to_matlab(); extern void matlab_to_ci(); void main() { int i; char* read_file[5]; char* write_file[5]; read_file[0] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\zoom_inst1"; read_file[1] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\zoom_inst2"; read_file[2] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\zoom_inst3"; read_file[3] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\zoom_inst4"; read_file[4] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\zoom_inst5"; write_file[0] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\out_inst1"; write_file[1] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\out_inst2"; write_file[2] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\out_inst3"; write_file[3] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\out_inst4"; write_file[4] = "C:\\MATLAB7\\work\\Project\\Weighted filtering\\Operational version\\MATLAB sources\\Data\\out_inst5" Файл конфигурации памяти: MEMORY { PAGE 0: EPROG: origin = 0x80, len = 0x7c00 PAGE 1: IDATA: origin = 0x80, len =0x8000 } SECTIONS { .text: {} > EPROG PAGE 0 .bss: {} > IDATA PAGE 1 .const: {} > IDATA PAGE 1 .switch: {} > IDATA PAGE 1 .sysmem: {} > IDATA PAGE 1 .stack {} > IDATA PAGE 1 } [/code] Подозреваю большие массивы (в коде С) забили всю память DATA. Ваше мнение ? Что происходит ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chan 0 20 мая, 2007 Опубликовано 20 мая, 2007 · Жалоба Смотрите *.map файл - там подробно расписано куда ушла память Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 20 мая, 2007 Опубликовано 20 мая, 2007 · Жалоба Смотрите *.map файл - там подробно расписано куда ушла память Да, спасибо, его и смотрел. ****************************************************************************** TMS320C54x COFF Linker PC Version 3.83 ****************************************************************************** >> Linked Sun May 20 11:21:37 2007 OUTPUT FILE NAME: <./Debug/Project.out> ENTRY POINT SYMBOL: "_c_int00" address: 00000a48 MEMORY CONFIGURATION name origin length used attr fill ---------------------- -------- --------- -------- ---- -------- PAGE 0: EPROG 00000080 00007c00 00000f86 RWIX PAGE 1: IDATA 00000080 00008000 00007d29 RWIX SECTION ALLOCATION MAP output attributes/ section page origin length input sections -------- ---- ---------- ---------- ---------------- .text 0 00000080 00000ecd 00000080 000000b4 dataFormating.obj (.text) 00000134 0000002d f_ci_to_matlab1.obj (.text) 00000161 0000001b f_matlab_to_ci1.obj (.text) 0000017c 0000004f rts.lib : fclose.obj (.text) 000001cb 00000075 : fflush.obj (.text) 00000240 00000148 : fopen.obj (.text) 00000388 000000a7 : fread.obj (.text) 0000042f 0000003c : fseek.obj (.text) 0000046b 00000119 : fwrite.obj (.text) 00000584 000001ec : lowlev.obj (.text) 00000770 0000001e : memchr.obj (.text) 0000078e 0000000f : memcpy.obj (.text) 0000079d 0000023e : memory.obj (.text) 000009db 00000012 : memset.obj (.text) 000009ed 00000005 : remove.obj (.text) 000009f2 00000011 : strchr.obj (.text) 00000a03 00000016 : strcmp.obj (.text) 00000a19 0000002f : strncpy.obj (.text) 00000a48 00000045 : boot.obj (.text) 00000a8d 0000000c : udiv.obj (.text) 00000a99 0000005d : _bufread.obj (.text) 00000af6 0000009f : _io_perm.obj (.text) 00000b95 0000003d : exit.obj (.text) 00000bd2 00000203 : lddrv.obj (.text) 00000dd5 000000a9 : ldmsg.obj (.text) 00000e7e 00000031 : memmov.obj (.text) 00000eaf 00000081 : setvbuf.obj (.text) 00000f30 0000000d : strcpy.obj (.text) 00000f3d 00000010 : strlen.obj (.text) .cinit 0 00000f4d 000000b9 00000f4d 00000003 dataFormating.obj (.cinit) 00000f50 0000001b rts.lib : lowlev.obj (.cinit) 00000f6b 00000003 : memory.obj (.cinit) 00000f6e 00000091 : defs.obj (.cinit) 00000fff 00000006 : exit.obj (.cinit) 00001005 00000001 --HOLE-- [fill = 0] .data 1 00000000 00000000 UNINITIALIZED .stack 1 00000000 00000400 UNINITIALIZED .switch 1 00000080 00000000 UNINITIALIZED //.stack 1 00000080 00000000 UNINITIALIZED .bss 1 00000080 00007459 UNINITIALIZED 00000080 0000714a dataFormating.obj (.bss) 000071ca 000001cd rts.lib : defs.obj (.bss) 00007397 000000d0 : lddrv.obj (.bss) 00007467 00000048 : lowlev.obj (.bss) 000074af 00000022 : exit.obj (.bss) 000074d1 00000004 f_ci_to_matlab1.obj (.bss) 000074d5 00000002 f_matlab_to_ci1.obj (.bss) 000074d7 00000002 rts.lib : memory.obj (.bss) .const 1 000074da 000003b0 000074da 000003b0 dataFormating.obj (.const) .sysmem 1 0000788a 00000400 UNINITIALIZED .cio 1 00007d00 00000120 UNINITIALIZED 00007d00 00000120 rts.lib : ldmsg.obj (.cio) Первые строчки (IDATA) по моему уже говорят что забито под завязку, но вроде не перехлестывает еще. Не вижу явного указания на нехватку памяти... Может не правильно читаю .map файл ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chan 0 20 мая, 2007 Опубликовано 20 мая, 2007 · Жалоба Секции, которые не влезли в память в сводке MEMORY CONFIGURATION не учитываются. Попробуйте отрезать немного от .sysmem Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 20 мая, 2007 Опубликовано 20 мая, 2007 · Жалоба Секции, которые не влезли в память в сводке MEMORY CONFIGURATION не учитываются. Попробуйте отрезать немного от .sysmem Спасибо. Я почти полный профан пока в этом, как отрезать от sysmem ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chan 0 20 мая, 2007 Опубликовано 20 мая, 2007 · Жалоба Меню Project/Build options, вкладка linker, пункт Heap Size. Стек настраивается там же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 20 мая, 2007 Опубликовано 20 мая, 2007 · Жалоба Меню Project/Build options, вкладка linker, пункт Heap Size. Стек настраивается там же. ОК, спасибо. Я не знаком пока с этими вещами. Как и почему нужно настраивать heap и на что это влияет конкретно ? Нужно ли мне увеличить там стек ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chan 0 20 мая, 2007 Опубликовано 20 мая, 2007 · Жалоба Heap (куча) используется в основном при динамическом выделени памяти (new, alloc и т.п.). А необходимая глубина стека зависит максимальной вложенности функций и размера передаваемых через стек параметров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться