Сделал приборчик на 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
Oct 9 2011, 20:32
Хоть до 100%.
Разумеется, кучу вы нигде не используете. Все выделяете статически.
Dog Pawlowa
Oct 9 2011, 21:01
Не сказано, где хранится запись. В EEPROM? В ОЗУ?
Если в ОЗУ, то вопророс стека.
Если в EEPROM, то как производится доступ - там массив записей определен, или как-нить по другому?
Цитата(Dog Pawlowa @ Oct 10 2011, 00:01)

Не сказано, где хранится запись. В EEPROM? В ОЗУ?
ОЗУ, (заголовок вопроса - "Как в AVR определить сколько можно RAM памяти использовать для своих нужд?")
Цитата
Если в ОЗУ, то вопророс стека.
Вот это и волнует. Читал, что бывает, что стек переполняется. А как застраховаться не знаю. Хочу разобраться, как определить - есть ли такая опасность.
DpInRock
Oct 10 2011, 05:37
Стек переполняется. Бывает.
Это зависит от программиста и его программы.
И никак не связано с остальными переменными программы.
Вы можете иметь всю память свободной. Но переполнение стека с таким же успехом может вызвать крах.
Lexdaw
Oct 10 2011, 13:38
Так ведь в AVR стек в ОЗУ, вот и смотрите сколько для данных а сколько для стека.
Laksus
Oct 10 2011, 14:10
Цитата(DpInRock @ Oct 10 2011, 08:37)

Стек переполняется. Бывает.
Это зависит от программиста и его программы.
Ну программист из меня плохонький. А все равно хотелось бы чтобы программа не заглючила когда нибудь.
Какие есть основные правила по поводу переполнения стека?
Цитата(Lexdaw @ Oct 10 2011, 16:38)

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

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

на основании анализа глубины вызовов
Это сделать ИМХО впринципе не возможно при наличии рекурсивных вызовов и завязке их кол-ва на условиях известных лишь в рантайме.
777777
Oct 13 2011, 04:43
Цитата(toweroff @ Oct 13 2011, 01:27)

Keil, помнится, мог после компиляции выдавать информацию о максимальном размере стека, которое используется, на основании анализа глубины вызовов. WinAVR так умеет?
Что-то я с трудом себе представляю как компилятор может определить размер стека. Кейл хоть и строит дерево вызовов и знает о количестве локальных переменных в каждой функции, но ведь могут быть вызовы по указателю на функцию, а они могут вызываться откуда угодно. Но для указателей там вроде нужно было вручную составлять для линкера дерево вызовов. Но ведь есть еще рекурсивные вызовы, а их компилятор не может просчитать в принципе, так как количество вложений на этапе компиляции неизвестно.
toweroff
Oct 13 2011, 06:56
Ну про рекурсию я вообще не говорил
надо еще раз посмотреть, какой он там стек считает
Цитата
но ведь могут быть вызовы по указателю на функцию, а они могут вызываться откуда угодно.
В HT-PIC компайлере эту проблему решили весьма оригинально - они считают, что в месте вызова функции по указателю может быть вызвана любая функция из программы
с совпадающим прототипом.
toweroff
Oct 13 2011, 10:59
upd
вот что примерно сообщает Keil
Цитата
Maximum Stack Usage = 76 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)
Call chain for Maximum Stack Depth:
main ⇒ Func1 ⇒ Func2
если реально не используются указатели на функции, рекурсии и прочая, наверное можно и поверить
demiurg_spb
Oct 13 2011, 15:04
Цитата(XVR @ Oct 13 2011, 14:56)

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

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

Для каких таргетов тулчейн и какой версии?
Для ARM подобного сообщения не выдаёт...
4.22a (но и раньше все было)
Именно ARM
Файл создается (у меня в \OBJ) с расширением .htm и с именем проекта
demiurg_spb
Oct 14 2011, 04:30
Да. Есть такое. Спасибо за наводку!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.