Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в AVR определить сколько можно RAM памяти использовать для своих нужд?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Laksus
Сделал приборчик на 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, но по-моему довольно глупый, лучше в раздел "Для начинающих".
DpInRock
Хоть до 100%.
Разумеется, кучу вы нигде не используете. Все выделяете статически.
Dog Pawlowa
Не сказано, где хранится запись. В EEPROM? В ОЗУ?
Если в ОЗУ, то вопророс стека.
Если в EEPROM, то как производится доступ - там массив записей определен, или как-нить по другому?
Laksus
Цитата(Dog Pawlowa @ Oct 10 2011, 00:01) *
Не сказано, где хранится запись. В EEPROM? В ОЗУ?

ОЗУ, (заголовок вопроса - "Как в AVR определить сколько можно RAM памяти использовать для своих нужд?")

Цитата
Если в ОЗУ, то вопророс стека.

Вот это и волнует. Читал, что бывает, что стек переполняется. А как застраховаться не знаю. Хочу разобраться, как определить - есть ли такая опасность.

DpInRock
Стек переполняется. Бывает.
Это зависит от программиста и его программы.
И никак не связано с остальными переменными программы.
Вы можете иметь всю память свободной. Но переполнение стека с таким же успехом может вызвать крах.
Lexdaw
Так ведь в AVR стек в ОЗУ, вот и смотрите сколько для данных а сколько для стека.
Laksus
Цитата(DpInRock @ Oct 10 2011, 08:37) *
Стек переполняется. Бывает.
Это зависит от программиста и его программы.

Ну программист из меня плохонький. А все равно хотелось бы чтобы программа не заглючила когда нибудь.
Какие есть основные правила по поводу переполнения стека?

Цитата(Lexdaw @ Oct 10 2011, 16:38) *
Так ведь в AVR стек в ОЗУ, вот и смотрите сколько для данных а сколько для стека.

А куда смотреть? Встречал упоминания, что вроде бы в map-файле есть информация по этому поводу. Если да, то как ее там найти?
Сергей Борщ
QUOTE (Laksus @ Oct 10 2011, 17:10) *
А куда смотреть? Встречал упоминания, что вроде бы в map-файле есть информация по этому поводу. Если да, то как ее там найти?


QUOTE
Data: 1507 bytes (73.6% Full)
(.data + .bss + .noinit)
Вот это заняла программа под глобальные и статические переменные. Все, что осталось - отдается под стек и кучу. Если используете динамическое выделение - читайте про кучу в папке doc документ malloc.html. Если динамическое выделение не используете - то вся оставшаяся память - это ваш стек. А дальше внимательно вспоминайте, сколько данных вы могли занять на стеке под локальные переменные, какова у вас глубина вызовов функций, ну и поверх этого то же самое (локальные переменные и вызовы функций) для прерываний.
toweroff
Keil, помнится, мог после компиляции выдавать информацию о максимальном размере стека, которое используется, на основании анализа глубины вызовов. WinAVR так умеет?
demiurg_spb
Цитата(toweroff @ Oct 13 2011, 01:27) *
на основании анализа глубины вызовов
Это сделать ИМХО впринципе не возможно при наличии рекурсивных вызовов и завязке их кол-ва на условиях известных лишь в рантайме.
777777
Цитата(toweroff @ Oct 13 2011, 01:27) *
Keil, помнится, мог после компиляции выдавать информацию о максимальном размере стека, которое используется, на основании анализа глубины вызовов. WinAVR так умеет?

Что-то я с трудом себе представляю как компилятор может определить размер стека. Кейл хоть и строит дерево вызовов и знает о количестве локальных переменных в каждой функции, но ведь могут быть вызовы по указателю на функцию, а они могут вызываться откуда угодно. Но для указателей там вроде нужно было вручную составлять для линкера дерево вызовов. Но ведь есть еще рекурсивные вызовы, а их компилятор не может просчитать в принципе, так как количество вложений на этапе компиляции неизвестно.
toweroff
Ну про рекурсию я вообще не говорил laughing.gif
надо еще раз посмотреть, какой он там стек считает
XVR
Цитата
но ведь могут быть вызовы по указателю на функцию, а они могут вызываться откуда угодно.
В HT-PIC компайлере эту проблему решили весьма оригинально - они считают, что в месте вызова функции по указателю может быть вызвана любая функция из программы с совпадающим прототипом.
toweroff
upd

вот что примерно сообщает Keil

Цитата
Maximum Stack Usage = 76 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)
Call chain for Maximum Stack Depth:
main ⇒ Func1 ⇒ Func2


если реально не используются указатели на функции, рекурсии и прочая, наверное можно и поверить sm.gif
demiurg_spb
Цитата(XVR @ Oct 13 2011, 14:56) *
В HT-PIC компайлере эту проблему решили весьма оригинально - они считают, что в месте вызова функции по указателю может быть вызвана любая функция из программы с совпадающим прототипом.
в свежих версиях GCC подобного рода оптимизация тоже стала применяться.

Цитата(toweroff @ Oct 13 2011, 14:59) *
вот что примерно сообщает Keil
Для каких таргетов тулчейн и какой версии?
Для ARM подобного сообщения не выдаёт...
toweroff
Цитата(demiurg_spb @ Oct 13 2011, 19:04) *
Для каких таргетов тулчейн и какой версии?
Для ARM подобного сообщения не выдаёт...

4.22a (но и раньше все было)
Именно ARM
Файл создается (у меня в \OBJ) с расширением .htm и с именем проекта
demiurg_spb
Да. Есть такое. Спасибо за наводку!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.