Не хватает памяти, какие есть подходы?

vde69
Offline
Зарегистрирован: 10.01.2016

Столкнулся с нехваткой оперативной памяти, сейчас на макетке NANO. На сколько я понимаю банально мало памяти для динамической кучи.

в наличие есть NANO, UNO и MEGA, конечно можно перевести на последнюю, но может есть какие альтернативы? 

Типа короткие имена переменных и функций,

строки на долгосрочную флеш 

Отказ от объектов в пользу спагети кода?

Или еще чего?  Кто подскажет какие методы вообще эффективны для сокращения размеров как программы так и занимаемой ей оперативки?

 

Сейчас у меня больше всего занимает библиотека SD

b707
Offline
Зарегистрирован: 26.05.2017

vde69 пишет:

Столкнулся с нехваткой оперативной памяти, сейчас на макетке NANO. На сколько я понимаю банально мало памяти для динамической кучи.

в наличие есть NANO, UNO и MEGA, конечно можно перевести на последнюю, но может есть какие альтернативы?

СТМ32

Цитата:
Типа короткие имена переменных и функций,

абсолютно не влияет

Цитата:
строки на долгосрочную флеш

это полезно

Цитата:
Отказ от объектов в пользу спагети кода?

почти не влияет

Цитата:

Сейчас у меня больше всего занимает библиотека SD

если в проекте еще и дисплей - выбор Нано изначально был ошибкой

SAB
Offline
Зарегистрирован: 27.12.2016

Посмотри в сторону progmem мне когда то  помогло.

negavoid2
negavoid2 аватар
Offline
Зарегистрирован: 06.05.2020

Я тут как-то гнал на недостатки советского образования, мол, сперва много теории без объяснения зачем это, потом практика. Я ошибался. Снижение порога входа, когда сперва не нужно много теории, а берём хуяк-хуяк и в продакшен и приводит к этому:

vde69 пишет:
Типа короткие имена переменных и функций,

строки на долгосрочную флеш 

Отказ от объектов в пользу спагети кода?

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vde69 пишет:

Столкнулся с нехваткой оперативной памяти

А как это проявилось? Как Вы узнали, что не хватает памяти?

Рекомендаций по экономии памяти можно дать много, но беда в том, что почти все они применимы в каких-то сугубо специфических случаях.

Один их наиболее распространенных советов - полный отказ от строк-объектов (String).

Ну а вообще, нехватка памяти - результат ошибок. Либо в программировании, либо в выборе алгоритма, либо в выборе контроллера. Для того, чтобы памяти всегда хватало, Вы сами должны хорошо представлять, куда она расходуется и сколько ее нужно для конкретной задачи.

В любом случае без скетча поставить диагноз крайне затруднительно.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Да у него в программе  работа с SD картой, там только буфер 512 байт поедает без соли. Я SD только к Меге подключаю. :) 

vde69
Offline
Зарегистрирован: 10.01.2016

andriano пишет:

А как это проявилось? Как Вы узнали, что не хватает памяти?

Да все банально, при 2х элементах в массиве все работает, при 3х программа зависает в конце первого цикла.

От String я отказался ранее, в аналогичной ситуации немного помогло, но все равно SD буквально сжирает ресурсы, у меня в проекте - часы реального времени, sd карта, экран 4х20, шина One Wire с датчиками, еще планировал wifi модуль, но теперь понимаю что точно не взлетит...

сейчас отключил модуль SD и на 3х элементах массива все работает... (элемент массива это данные с датчика температуры)

b707 пишет:

СТМ32

почитал, конечно вещь интересная но наверно я лучше уйду на более дорогую мегу

negavoid2 пишет:

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

я не просто так это писал, я не знаю как именно компилится программа, в нормальных языках есть директивы компилятора, здесь по существу только условные операторы для нарезки кода. Ни модели передачи параметров, ни формат генерации (будь это байт код или машинные коды), ни размеры стека, кучи, не понятно как именно осуществляется адресация по таблицам или компилятор генерит адреса безусловно, абсолютная или относительная адресация. Именно от этого зависит например влияние имен переменных на использование памяти. Да банально даже в ДОС была разница как компилить в EXE или в COM, и разница существенная. 

Неужели Вы думает, что кто-то (кроме редких фанатов) будет влезать в физическую реализацию на платке которая стоит 2$ ??? Я например ожидаю, что если работать так как надо не будет - просто выкину и уйду в более дорогой сегмент где например есть полноценный питон или аналогичное, с нормальной отладкой и прочими плюшками.

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Вот реально странно. На микро + SD + 24 далласа температурный логер работает влет.  ТС, код где ? 

vde69
Offline
Зарегистрирован: 10.01.2016

перевел на мегу - все работает

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

Вот реально странно. На микро + SD + 24 далласа температурный логер работает влет.  ТС, код где ? 

ты требуешь невозможного )))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vde69 пишет:

andriano пишет:

А как это проявилось? Как Вы узнали, что не хватает памяти?

Да все банально, при 2х элементах в массиве все работает, при 3х программа зависает в конце первого цикла.

А как-то оптимизировать размер элемента или не дублировать повторяющиеся параметры в разных элементах не пробовали?

Цитата:

b707 пишет:

СТМ32

почитал, конечно вещь интересная но наверно я лучше уйду на более дорогую мегу

я не просто так это писал, я не знаю как именно компилится программа, в нормальных языках есть директивы компилятора, здесь по существу только условные операторы для нарезки кода.

Можно подумать в С++ нет.

А в stm32 можно еще и прямо из среды опции командной строки выбрать. Так что я не понимаю, чем они Вам не понравились.

Цитата:

Ни модели передачи параметров, ни формат генерации (будь это байт код или машинные коды),

Для МК это неактуально. Совсем.

Цитата:

ни размеры стека, кучи,

Для однозадачной среды - неактуально: используется ВСЯ память, где стек и куча растут навстречу друг другу.

Цитата:

Да банально даже в ДОС была разница как компилить в EXE или в COM, и разница существенная. 

Это проблемы исключительно DOS (т.е. его совместимости с CP/M-80), а также 8086 с его сегментированной памятью.

Цитата:

Неужели Вы думает, что кто-то (кроме редких фанатов) будет влезать в физическую реализацию на платке которая стоит 2$ ??? Я например ожидаю, что если работать так как надо не будет - просто выкину и уйду в более дорогой сегмент где например есть полноценный питон или аналогичное, с нормальной отладкой и прочими плюшками.

Тут есть несколько аспектов, в частности:

- если тираж составляет, скажем, миллион штук, разница между $2 и $3 оказывается уже вполне заметной,

- фанаты встречаются гораздо чаще, чем Вы думаете.

А вот называть интерпретируемый язык, большая часть "вкусностей" которого не может быть использована ввиду ограниченности ресурсов МК полноценным...

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

b707
Offline
Зарегистрирован: 26.05.2017

vde69 пишет:

Неужели Вы думает, что кто-то (кроме редких фанатов) будет влезать в физическую реализацию на платке которая стоит 2$ ??? Я например ожидаю, что если работать так как надо не будет - просто выкину и уйду в более дорогой сегмент где например есть полноценный питон или аналогичное, с нормальной отладкой и прочими плюшками.

 

 Если изучение нюансов реализации вы считаете "редким фанатизмом" - вы вряд ли когда-нибудь научитесь писать эффективные программы.  С таким подходом почему бы вам сразу не "уйти в более дорогой сегмент" и не тратить свое и чужое время на обьяснение того. что вам не интересно