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

Нехватка памяти С5402 (CCS 2.20)

Начал писать код проэкта (первый свой проэкт под 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. Ваше мнение ? Что происходит ?

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


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

Смотрите *.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 файл ?

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


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

Секции, которые не влезли в память в сводке MEMORY CONFIGURATION не учитываются. Попробуйте отрезать немного от .sysmem

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


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

Секции, которые не влезли в память в сводке MEMORY CONFIGURATION не учитываются. Попробуйте отрезать немного от .sysmem

 

Спасибо.

Я почти полный профан пока в этом, как отрезать от sysmem ?

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


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

Меню Project/Build options, вкладка linker, пункт Heap Size. Стек настраивается там же.

 

ОК, спасибо.

Я не знаком пока с этими вещами.

Как и почему нужно настраивать heap и на что это влияет конкретно ?

Нужно ли мне увеличить там стек ?

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


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

Heap (куча) используется в основном при динамическом выделени памяти (new, alloc и т.п.). А необходимая глубина стека зависит максимальной вложенности функций и размера передаваемых через стек параметров.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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