реклама на сайте
подробности

 
 
> Как в AVR определить сколько можно RAM памяти использовать для своих нужд?
Laksus
сообщение Oct 9 2011, 20:20
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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, но по-моему довольно глупый, лучше в раздел "Для начинающих".
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
DpInRock
сообщение Oct 9 2011, 20:32
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Хоть до 100%.
Разумеется, кучу вы нигде не используете. Все выделяете статически.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 9 2011, 21:01
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Не сказано, где хранится запись. В EEPROM? В ОЗУ?
Если в ОЗУ, то вопророс стека.
Если в EEPROM, то как производится доступ - там массив записей определен, или как-нить по другому?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Laksus
сообщение Oct 9 2011, 23:24
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Цитата(Dog Pawlowa @ Oct 10 2011, 00:01) *
Не сказано, где хранится запись. В EEPROM? В ОЗУ?

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

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

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

Go to the top of the page
 
+Quote Post
DpInRock
сообщение Oct 10 2011, 05:37
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Стек переполняется. Бывает.
Это зависит от программиста и его программы.
И никак не связано с остальными переменными программы.
Вы можете иметь всю память свободной. Но переполнение стека с таким же успехом может вызвать крах.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Lexdaw
сообщение Oct 10 2011, 13:38
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 5-02-08
Пользователь №: 34 772



Так ведь в AVR стек в ОЗУ, вот и смотрите сколько для данных а сколько для стека.
Go to the top of the page
 
+Quote Post
Laksus
сообщение Oct 10 2011, 14:10
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Цитата(DpInRock @ Oct 10 2011, 08:37) *
Стек переполняется. Бывает.
Это зависит от программиста и его программы.

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

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

А куда смотреть? Встречал упоминания, что вроде бы в map-файле есть информация по этому поводу. Если да, то как ее там найти?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 11 2011, 06:46
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 12 2011, 21:27
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Keil, помнится, мог после компиляции выдавать информацию о максимальном размере стека, которое используется, на основании анализа глубины вызовов. WinAVR так умеет?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 13 2011, 04:39
Сообщение #10


неотягощённый злом
******

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



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
777777
сообщение Oct 13 2011, 04:43
Сообщение #11


Профессионал
*****

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



Цитата(toweroff @ Oct 13 2011, 01:27) *
Keil, помнится, мог после компиляции выдавать информацию о максимальном размере стека, которое используется, на основании анализа глубины вызовов. WinAVR так умеет?

Что-то я с трудом себе представляю как компилятор может определить размер стека. Кейл хоть и строит дерево вызовов и знает о количестве локальных переменных в каждой функции, но ведь могут быть вызовы по указателю на функцию, а они могут вызываться откуда угодно. Но для указателей там вроде нужно было вручную составлять для линкера дерево вызовов. Но ведь есть еще рекурсивные вызовы, а их компилятор не может просчитать в принципе, так как количество вложений на этапе компиляции неизвестно.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 13 2011, 06:56
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Ну про рекурсию я вообще не говорил laughing.gif
надо еще раз посмотреть, какой он там стек считает
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 13 2011, 10:56
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
но ведь могут быть вызовы по указателю на функцию, а они могут вызываться откуда угодно.
В HT-PIC компайлере эту проблему решили весьма оригинально - они считают, что в месте вызова функции по указателю может быть вызвана любая функция из программы с совпадающим прототипом.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 13 2011, 10:59
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 13 2011, 15:04
Сообщение #15


неотягощённый злом
******

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



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

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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 06:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01507 секунд с 7
ELECTRONIX ©2004-2016