Проблемы с оперативной памятью бывают или как правило её хватает ?

vlkam
Offline
Зарегистрирован: 17.02.2013

 Вчера стал считать, сколько памяти нужно под проект и осознал, сколько оперативы стоит в Uno и потобных платах. Просто обнять  и плакать, ZX Spectrum на фоне этого объема суперкомпьютер просто.

Как вообще на практике, хватает такого объема или иногда приходится упираться в ограничение ?

Все таки при длительной работе имеет место и фрагментация памяти в т.ч.

__Alexander
Offline
Зарегистрирован: 24.10.2012

ну так в x86 программа грузится в озу а потом выполняется, в мк программа выполняется во флеш, а озу используется для стека и переменных, ну или что сами туда засунете. короче, абсолютно разные принципы работы.

и как вы "до проекта" считаете сколько нужно будет озу? ну флеш еще можно прикинуть, а озу... тоже можно, но это всегда меньше чем имеется в мк.

 

leshak
Offline
Зарегистрирован: 29.09.2011

Нужно мне на даче перебросить 2.5 тонны песка из одного конца участка в другой. Подсчитал я количество ходок с садовой тачкой, сравнил с мощностью садового насоса погружного... и расплакался.

А вообще - ну как можно об этом рассуждать абстрактно? Есть тысячи задач для которых ресурсов уны - не хватит. Есть тысячи задач где они излишни, есть тысячи задач где они "как раз то что нужно". И лишнее будет только усложнять/удорожать.

А вот методика как вы "прикидывали память" - это интерестно. Так как даже на готовом скетче, не всегда просто выяснить "сколько он жрет памяти в данный момент".

Ну разве что, вам изначально требуется какой-нибудь массив int-тов 1000x1000, тогда сразу ясно "не влезет". Вообщем опять-таки... без конкретики  - разговор ни о чем.

paf
Offline
Зарегистрирован: 25.01.2013

Надо успеть... Успеть вспомнить

Просто затарить все полки. Сделать кластеры. И забыть ограничения как страшный сон...

vlkam
Offline
Зарегистрирован: 17.02.2013

Странно, не получил оповещения об ответах, думал ветка умерла себе тихо

и как вы "до проекта" считаете сколько нужно будет озу? ну флеш еще можно прикинуть, а озу... тоже можно, но это всегда меньше чем имеется в мк.

Ну например сейчас делаю одну системку и предполагаю следующий алгоритм
В файле есть список номеров телефонов, в пределе их будет 200, с запасом 300.
При старте Ардуина считывает этот файл в оперативку и при поступлении звонка проверяет, есть ли звонящий в списке.

номер телефона ну пускай 10 цифр, 200 абонентов х 10 цифр, вот собственно и вся оператива кончилась в Uno. А ведь еще есть динамические переменные

Видимо придется либо каждый раз читать файл, либо городить какую то доп память, либо переходить на Мегу

Snubist
Offline
Зарегистрирован: 18.02.2013

Возникает вопрос,зачем держать все номера в памяти ( у тебя же не сто звонков в секунду, где требуется оперативно их обработать)? Для твоего проекта достаточно их загружать динамически с SD, по приходу звонка. Тем более что можно разбить файл на несколько, например 901.txt, 902.txt ...,так что память особо не пострадает.

leshak
Offline
Зарегистрирован: 29.09.2011

Ну это как раз и есть "частный случай", когда "требуется какой-нибудь массив int-тов 1000x1000", да тут можно заранее сказать "не влезет".

Во вторых - а накой ляд их в память читать при запуске?  гуглим "PROGMEM arduino". Пусть и лежат во флеше - его всегда больше.

В третьих - не обазательно хранить номер как "строку". Тогда "10 цифр" займут 5-ть байт, а не 11-ть. Да еще и сравнивать числа легче.

В четвертых не обязательно хратить сам номер. Можно прогонять их через какую-нибудь хеш-функцию и сравнивать/хранить значение хешей, а не сами номера. Если даже малая вероятность коллизии функций не устраивает "ну никак", можно посмотреть еще на какое-нибудь примитивное "сжатие". Ведь наверняка же у вас будут какие-то часто повторяющие-ся куски номеров. Особенно в начальных цифрах. Причем для сравнения "разархивировать номер" - вам не нужно, можно "архивировать" поступающий и сравнивать архивы.

Но вообщем-то и без архиивирований/хеширований то флеша должно хватать.

Это если вы номера забиваете в скетч. Если же читаете с SD-карты, то .. опять-таки для сравнения не обязательно "все поднимать в память".  Если хранить номера на SD-шке в отсортированном виде - то можно за несколько чтений выяснить "есть такой номер или нет".

vlkam
Offline
Зарегистрирован: 17.02.2013

Snubist пишет:
Возникает вопрос,зачем держать все номера в памяти ( у тебя же не сто звонков в секунду, где требуется оперативно их обработать)? Для твоего проекта достаточно их загружать динамически с SD

Да эт понятно, просто как то дико в наше то время экономить килобайты

Последний раз таким подсчетом байт занимался аж на ZX Spectrume

leshak
Offline
Зарегистрирован: 29.09.2011

vlkam пишет:

Snubist пишет:
Возникает вопрос,зачем держать все номера в памяти ( у тебя же не сто звонков в секунду, где требуется оперативно их обработать)? Для твоего проекта достаточно их загружать динамически с SD

Да эт понятно, просто как то дико в наше то время экономить килобайты

А зачем ставить числодробилку-обогреватель-комнаты там где можно подсчитать байты и поставить что-то копеечно экономное? Ну посмотрите в сторону netduino, Fez Panda II и т.п. Там вам и памяти побольше будет и многопоточность, и язык C# (сборщики мусора и т.п.)

Вообщем просто подбирайте инструмент соотвесвующий задаче и вашим вкусам. Не хотите считать байты - так никто не заставляет :)  Альтернативы - есть.

vlkam пишет:

Последний раз таким подсчетом байт занимался аж на ZX Spectrume

Как ни странно, но это тоже был 8-битный процессор. Кстати сравните его размер/цену и atmega в SMD корпусе (даже если убрать из сравнение клавиатуру/видео-карту и т.п.). Если вы возмете материнку от ZX-спектрума, то на ней поместится кластер ATMEG. Который по вычислительной мощи и объему памяти порвет спектрум как тузик грелку. Вот это и есть "наши дни" :)