|
Как в AVR определить сколько можно RAM памяти использовать для своих нужд? |
|
|
|
Oct 9 2011, 20:20
|
Частый гость
 
Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069

|
Сделал приборчик на ATmega32. Работает автоматически, рабочий цикл состоит из 8 этапов. Хочу сохранять в память времена этапов для нескольких последних циклов, чтобы затем можно было просмотреть. На запись одного цикла надо 14 байт.
Вопрос. Как узнать, или хотя бы оценить, сколько можно сделать записей, чтобы не нарушить работу программы? _______________________________________________ Используется WinAVR. Если не делать записей, то WinAVR выдает сообщение AVR Memory Usage ---------------- Device: atmega32 Program: 17548 bytes (53.6% Full) (.text + .data + .bootloader) Data: 1507 bytes (73.6% Full) (.data + .bss + .noinit) EEPROM: 72 bytes (7.0% Full) (.eeprom)
Если сохраняю 20 записей, то выдает Data: 1787 bytes (87.3% Full)
Можно ли доводить до 99%? Или какой-то запас надо оставлять? Если да то какой? Может ли программа длительно работать, а затем, при стечении некоторых условий, дать сбой из-за малого запаса памяти? ___ PS. Вопрос про AVR, но по-моему довольно глупый, лучше в раздел "Для начинающих".
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Oct 9 2011, 23:24
|
Частый гость
 
Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069

|
Цитата(Dog Pawlowa @ Oct 10 2011, 00:01)  Не сказано, где хранится запись. В EEPROM? В ОЗУ? ОЗУ, (заголовок вопроса - "Как в AVR определить сколько можно RAM памяти использовать для своих нужд?") Цитата Если в ОЗУ, то вопророс стека. Вот это и волнует. Читал, что бывает, что стек переполняется. А как застраховаться не знаю. Хочу разобраться, как определить - есть ли такая опасность.
|
|
|
|
|
Oct 10 2011, 14:10
|
Частый гость
 
Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069

|
Цитата(DpInRock @ Oct 10 2011, 08:37)  Стек переполняется. Бывает. Это зависит от программиста и его программы. Ну программист из меня плохонький. А все равно хотелось бы чтобы программа не заглючила когда нибудь. Какие есть основные правила по поводу переполнения стека? Цитата(Lexdaw @ Oct 10 2011, 16:38)  Так ведь в AVR стек в ОЗУ, вот и смотрите сколько для данных а сколько для стека. А куда смотреть? Встречал упоминания, что вроде бы в map-файле есть информация по этому поводу. Если да, то как ее там найти?
|
|
|
|
|
Oct 11 2011, 06:46
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Laksus @ Oct 10 2011, 17:10)  А куда смотреть? Встречал упоминания, что вроде бы в map-файле есть информация по этому поводу. Если да, то как ее там найти? QUOTE Data: 1507 bytes (73.6% Full) (.data + .bss + .noinit) Вот это заняла программа под глобальные и статические переменные. Все, что осталось - отдается под стек и кучу. Если используете динамическое выделение - читайте про кучу в папке doc документ malloc.html. Если динамическое выделение не используете - то вся оставшаяся память - это ваш стек. А дальше внимательно вспоминайте, сколько данных вы могли занять на стеке под локальные переменные, какова у вас глубина вызовов функций, ну и поверх этого то же самое (локальные переменные и вызовы функций) для прерываний.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 13 2011, 04:43
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(toweroff @ Oct 13 2011, 01:27)  Keil, помнится, мог после компиляции выдавать информацию о максимальном размере стека, которое используется, на основании анализа глубины вызовов. WinAVR так умеет? Что-то я с трудом себе представляю как компилятор может определить размер стека. Кейл хоть и строит дерево вызовов и знает о количестве локальных переменных в каждой функции, но ведь могут быть вызовы по указателю на функцию, а они могут вызываться откуда угодно. Но для указателей там вроде нужно было вручную составлять для линкера дерево вызовов. Но ведь есть еще рекурсивные вызовы, а их компилятор не может просчитать в принципе, так как количество вложений на этапе компиляции неизвестно.
|
|
|
|
|
Oct 13 2011, 15:04
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(XVR @ Oct 13 2011, 14:56)  В HT-PIC компайлере эту проблему решили весьма оригинально - они считают, что в месте вызова функции по указателю может быть вызвана любая функция из программы с совпадающим прототипом. в свежих версиях GCC подобного рода оптимизация тоже стала применяться. Цитата(toweroff @ Oct 13 2011, 14:59)  вот что примерно сообщает Keil Для каких таргетов тулчейн и какой версии? Для ARM подобного сообщения не выдаёт...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|