Проблемы с оперативной памятью бывают или как правило её хватает ?
- Войдите на сайт для отправки комментариев
Пнд, 01/04/2013 - 10:08
Вчера стал считать, сколько памяти нужно под проект и осознал, сколько оперативы стоит в Uno и потобных платах. Просто обнять и плакать, ZX Spectrum на фоне этого объема суперкомпьютер просто.
Как вообще на практике, хватает такого объема или иногда приходится упираться в ограничение ?
Все таки при длительной работе имеет место и фрагментация памяти в т.ч.
ну так в x86 программа грузится в озу а потом выполняется, в мк программа выполняется во флеш, а озу используется для стека и переменных, ну или что сами туда засунете. короче, абсолютно разные принципы работы.
и как вы "до проекта" считаете сколько нужно будет озу? ну флеш еще можно прикинуть, а озу... тоже можно, но это всегда меньше чем имеется в мк.
Нужно мне на даче перебросить 2.5 тонны песка из одного конца участка в другой. Подсчитал я количество ходок с садовой тачкой, сравнил с мощностью садового насоса погружного... и расплакался.
А вообще - ну как можно об этом рассуждать абстрактно? Есть тысячи задач для которых ресурсов уны - не хватит. Есть тысячи задач где они излишни, есть тысячи задач где они "как раз то что нужно". И лишнее будет только усложнять/удорожать.
А вот методика как вы "прикидывали память" - это интерестно. Так как даже на готовом скетче, не всегда просто выяснить "сколько он жрет памяти в данный момент".
Ну разве что, вам изначально требуется какой-нибудь массив int-тов 1000x1000, тогда сразу ясно "не влезет". Вообщем опять-таки... без конкретики - разговор ни о чем.
Надо успеть... Успеть вспомнить.
Просто затарить все полки. Сделать кластеры. И забыть ограничения как страшный сон...
Странно, не получил оповещения об ответах, думал ветка умерла себе тихо
и как вы "до проекта" считаете сколько нужно будет озу? ну флеш еще можно прикинуть, а озу... тоже можно, но это всегда меньше чем имеется в мк.
Ну например сейчас делаю одну системку и предполагаю следующий алгоритм
В файле есть список номеров телефонов, в пределе их будет 200, с запасом 300.
При старте Ардуина считывает этот файл в оперативку и при поступлении звонка проверяет, есть ли звонящий в списке.
номер телефона ну пускай 10 цифр, 200 абонентов х 10 цифр, вот собственно и вся оператива кончилась в Uno. А ведь еще есть динамические переменные
Видимо придется либо каждый раз читать файл, либо городить какую то доп память, либо переходить на Мегу
Возникает вопрос,зачем держать все номера в памяти ( у тебя же не сто звонков в секунду, где требуется оперативно их обработать)? Для твоего проекта достаточно их загружать динамически с SD, по приходу звонка. Тем более что можно разбить файл на несколько, например 901.txt, 902.txt ...,так что память особо не пострадает.
Ну это как раз и есть "частный случай", когда "требуется какой-нибудь массив int-тов 1000x1000", да тут можно заранее сказать "не влезет".
Во вторых - а накой ляд их в память читать при запуске? гуглим "PROGMEM arduino". Пусть и лежат во флеше - его всегда больше.
В третьих - не обазательно хранить номер как "строку". Тогда "10 цифр" займут 5-ть байт, а не 11-ть. Да еще и сравнивать числа легче.
В четвертых не обязательно хратить сам номер. Можно прогонять их через какую-нибудь хеш-функцию и сравнивать/хранить значение хешей, а не сами номера. Если даже малая вероятность коллизии функций не устраивает "ну никак", можно посмотреть еще на какое-нибудь примитивное "сжатие". Ведь наверняка же у вас будут какие-то часто повторяющие-ся куски номеров. Особенно в начальных цифрах. Причем для сравнения "разархивировать номер" - вам не нужно, можно "архивировать" поступающий и сравнивать архивы.
Но вообщем-то и без архиивирований/хеширований то флеша должно хватать.
Это если вы номера забиваете в скетч. Если же читаете с SD-карты, то .. опять-таки для сравнения не обязательно "все поднимать в память". Если хранить номера на SD-шке в отсортированном виде - то можно за несколько чтений выяснить "есть такой номер или нет".
Да эт понятно, просто как то дико в наше то время экономить килобайты
Последний раз таким подсчетом байт занимался аж на ZX Spectrume
Да эт понятно, просто как то дико в наше то время экономить килобайты
А зачем ставить числодробилку-обогреватель-комнаты там где можно подсчитать байты и поставить что-то копеечно экономное? Ну посмотрите в сторону netduino, Fez Panda II и т.п. Там вам и памяти побольше будет и многопоточность, и язык C# (сборщики мусора и т.п.)
Вообщем просто подбирайте инструмент соотвесвующий задаче и вашим вкусам. Не хотите считать байты - так никто не заставляет :) Альтернативы - есть.
Последний раз таким подсчетом байт занимался аж на ZX Spectrume
Как ни странно, но это тоже был 8-битный процессор. Кстати сравните его размер/цену и atmega в SMD корпусе (даже если убрать из сравнение клавиатуру/видео-карту и т.п.). Если вы возмете материнку от ZX-спектрума, то на ней поместится кластер ATMEG. Который по вычислительной мощи и объему памяти порвет спектрум как тузик грелку. Вот это и есть "наши дни" :)