arttech 0 21 апреля, 2009 Опубликовано 21 апреля, 2009 · Жалоба Добрый день! Подскажите, как можно определить какое количество памяти RAM требуется в процессе выполнения программы и не превышает ли программа своими запросами установленное количество на МК? Использую MSP430F2471, RAM памяти - 4 КБ. Иногда замечал, что в процессе девайс начинал вести себя непредсказуемо и логики в работе никакой не было. После уменьшения количества длин буферов всё ставало на свои места. В MAP файле под глобальные переменные расходуется "3 670 bytes of DATA memory (+ 61 absolute )", но вот в процессе работы включаются в работу процедуры, где запрашивается RAM из стека. Так вот, как убедиться, что процедуры не превышают запрашиваемый объём RAM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 21 апреля, 2009 Опубликовано 21 апреля, 2009 · Жалоба Так вот, как убедиться, что процедуры не превышают запрашиваемый объём RAM?Поместить на вершину стека (или, что проще, в конец данных) магическое число и периодически смотреть - не затерлось ли оно. Ну или если компилятор умеет строить дерево вызовов - анализировать его. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttech 0 21 апреля, 2009 Опубликовано 21 апреля, 2009 · Жалоба Поместить на вершину стека (или, что проще, в конец данных) магическое число и периодически смотреть - не затерлось ли оно. Ну или если компилятор умеет строить дерево вызовов - анализировать его. Да, идея хорошая и что самое главное достоверно можно определить наличие дыр в коде.. Но вот хотелось бы узнать, как сам компилятор заставить определить перерасход RAMa... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 22 апреля, 2009 Опубликовано 22 апреля, 2009 · Жалоба Т.к. Вы не указали, какой компилятор используете, то только сам Бог и Вы (после изучения документации на компилятор) можете сказать, как можно заставить компилятор строить дерево вызовов. Для ИАР это делается так: Options->Linker->Cmd Opt добавляем свою строку : -xmos И в *.map-файле линкер построит дерево вызовов функций с подсчетом занимаемой памяти Так мы определим минимальный размер стека, затем увеличим его до максимума у выбраного процессора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kurt 0 22 апреля, 2009 Опубликовано 22 апреля, 2009 · Жалоба про контроль вершины стека, простой примерчик для компилятора 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttech 0 23 апреля, 2009 Опубликовано 23 апреля, 2009 · Жалоба Огромное спасибо за советы и полезные идеи :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться