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

определение расхода RAM

Добрый день!

 

Подскажите, как можно определить какое количество памяти RAM требуется в процессе выполнения программы и не превышает ли программа своими запросами установленное количество на МК?

 

Использую MSP430F2471, RAM памяти - 4 КБ.

 

Иногда замечал, что в процессе девайс начинал вести себя непредсказуемо и логики в работе никакой не было. После уменьшения количества длин буферов всё ставало на свои места.

В MAP файле под глобальные переменные расходуется "3 670 bytes of DATA memory (+ 61 absolute )", но вот в процессе работы включаются в работу процедуры, где запрашивается RAM из стека.

Так вот, как убедиться, что процедуры не превышают запрашиваемый объём RAM?

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


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

Так вот, как убедиться, что процедуры не превышают запрашиваемый объём RAM?
Поместить на вершину стека (или, что проще, в конец данных) магическое число и периодически смотреть - не затерлось ли оно. Ну или если компилятор умеет строить дерево вызовов - анализировать его.

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


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

Поместить на вершину стека (или, что проще, в конец данных) магическое число и периодически смотреть - не затерлось ли оно. Ну или если компилятор умеет строить дерево вызовов - анализировать его.

Да, идея хорошая и что самое главное достоверно можно определить наличие дыр в коде..

Но вот хотелось бы узнать, как сам компилятор заставить определить перерасход RAMa...

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


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

Т.к. Вы не указали, какой компилятор используете, то только сам Бог и Вы (после изучения документации на компилятор) можете сказать, как можно заставить компилятор строить дерево вызовов.

Для ИАР это делается так:

 

Options->Linker->Cmd Opt

добавляем свою строку :

-xmos

 

И в *.map-файле линкер построит дерево вызовов функций с подсчетом занимаемой памяти

Так мы определим минимальный размер стека, затем увеличим его до максимума у выбраного процессора.

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


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

про контроль вершины стека, простой примерчик для компилятора IAR:

//---------------------------------------------------------
void sys_check_stack_init(void)
{  
    #pragma segment="CSTACK"
    unsigned short * p = (unsigned short *)__segment_begin("CSTACK");
    *p++ = 0xDEAD;
    *p   = 0xDEAD; 
}

//---------------------------------------------------------
void sys_check_stack(void)
{  
    #pragma segment="CSTACK"
    unsigned short * p = (unsigned short *)__segment_begin("CSTACK");
    if( (p[0] != 0xDEAD) || (p[1] != 0xDEAD) ) WDTCTL=0x00;
}

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


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

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

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

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

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

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

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

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

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

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