А сколько памяти корректно занимать под переменные и прошивку?

Чечако
Offline
Зарегистрирован: 15.06.2018

Компилятор постоянно показывает текущий расклад, за что ему спасибо (ниже для примера):

Скетч использует 17630 байт (57%) памяти устройства. Всего доступно 30720 байт.

Глобальные переменные используют 1162 байт (56%) динамической памяти, оставляя 886 байт для локальных переменных. Максимум: 2048 байт.
 
А есть ли какие-то ограничения кроме этих цифр? Понятно, что скажем динамической памяти занять больше 2048 байт я не могу. Но значит ли это, что я могу реально сожрать все 2048, или какое-то количество с точки зрения cтабильной работы программы я должен оставить свободным? Скажем, если используются переменные типа String?
 
Аналогичный вопрос по флешу - я могу реально отожрать все 30720, или сколько-то я должен сам оставить?
Навскидку гугл мне на эти вопросы ответить не смог. Внутренний параноик говорит, что безусловно сколько-то нужно оставить свободными. Но вот сколько?
b707
Offline
Зарегистрирован: 26.05.2017

По оперативке - чем меньше занято, тем проще жить. Желательно выше 75% не залезать. Если используются String - запас должен быть больше.

Флеш можно занимать хоть весь.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Программа для чпу grbl занимает на нане 97% и вроде ничего критичного в ея фунциклировании не отмечено

однако! Как то залез выше 80% оперативы и получил глюков по полной программе, остерегаюсь теперь я

sadman41
Offline
Зарегистрирован: 19.10.2016

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

В частности, думаю, можно в критических местах провести промеры свободного объёма ОЗУ и постепенно к ним приближаться. Но, опять же - структура кода изменится, компилятор поменяет стратегию и начинай всё сначала...

И, да, компилятор показывает не всё. Заведёте у себя стринги с маллоками или библиотеку с неопикселями начнёте использовать и вся эта статистика компилятора не будет стоить ломанного гроша.

По ROM же, как ранее написали, можно весь забить - тут компилятор не соврёт в "предсказаниях".

Bobre
Offline
Зарегистрирован: 01.12.2014
// Переменные, создаваемые процессом сборки,
// когда компилируется скетч
extern int __bss_end;
extern void *__brkval;
 
// Функция, возвращающая количество свободного ОЗУ (RAM)
int memoryFree()
{
   int freeValue;
   if((int)__brkval == 0)
      freeValue = ((int)&freeValue) - ((int)&__bss_end);
   else
      freeValue = ((int)&freeValue) - ((int)__brkval);
   return freeValue;
}

Работает на atmega328 - Вызываете memoryFree и смотрите сколько осталось RAM.  Как только превысите лимит, в переменных будет появляться мусор, пока это не приведет к критической ошике. Flash можно хоть весь использовать, он все равно не перезаписывается

Чечако
Offline
Зарегистрирован: 15.06.2018

Bobre пишет:

Работает на atmega328 - Вызываете memoryFree и смотрите сколько осталось RAM.  Как только превысите лимит, в переменных будет появляться мусор, пока это не приведет к критической ошике. Flash можно хоть весь использовать, он все равно не перезаписывается

А вот за этот код вам просто ОГРОМНОЕ спасибо. Добавил в проект и погонял как следует. По факту, вместо обещаных компилятором 874 у меня остается 690 максимум. Причем интересно, что в процессе работы оно долго висело на 720, потом прыгнуло на 690, и на этом успокоилось. Буду изучать предметно, на чем это я аж 30 байт сходу потерял. 

Update: 30 байт улетели на две вводимых в том месте в игру переменных типа String. Сурово. Причем сами по себе они хранят по 8 символов максимум. Буду значит минимизировать их использование.

sadman41
Offline
Зарегистрирован: 19.10.2016

Гонять как следует мало. Надо ещё и замерять где следует ;)

Чечако
Offline
Зарегистрирован: 15.06.2018

sadman41 пишет:

Гонять как следует мало. Надо ещё и замерять где следует ;)

У меня в отладочном режиме раз в секунду в сериал выплевывается средняя загрузка в процентах, теперь туда же выплевывается и остаток памяти. Вполне себе наглядно получается. :)

sadman41
Offline
Зарегистрирован: 19.10.2016

На всякий случай проиллюстрирую:


int getRamFree(void) {
  extern int __bss_end;
  extern void *__brkval;
  int freeValue;
  if ((int)__brkval == 0)
    freeValue = ((int)&freeValue) - ((int)&__bss_end);
  else
    freeValue = ((int)&freeValue) - ((int)__brkval);
  return freeValue;
}

void ramDevourer() {
  uint8_t array[500];
  memset(array, 0xFF, sizeof(array));
  Serial.println(getRamFree());
}

void setup() {
  Serial.begin(115200);
  Serial.println(getRamFree());
  ramDevourer();
  Serial.println(getRamFree());
}

void loop(){}

 

rx3qic
Offline
Зарегистрирован: 27.05.2019

всем доброго времени суток!за ранее прошу прощения если спрошу не по теме,но нужна помощь. есть проект синтезатора частоты https://www.youtube.com/watch?v=2w7OSwKUFAs есть скетч .проблема заключается в том,что библиотека Adafruit_SSD1306-master под ОЛЕД дисплей 0.96* сделана с разрешением 128х32 и тогда дисплей отображает верхнюю половину информации . при включении режима 128х64 после компиляции скетча выдается надпись :       Archiving built core (caching) in: C:\Users\F930~1\AppData\Local\Temp\arduino_cache_304247\core\core_arduino_avr_nano_cpu_atmega328_083fd89c5532a37bd76182c72c100de6.a     Скетч использует 29334 байт (95%) памяти устройства. Всего доступно 30720 байт.

Глобальные переменные используют 1805 байт (88%) динамической памяти, оставляя 243 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.
плата ардуино нано проц. атмега 328 . я не силен в программировании. бльшая просьба хоть чем то помочь.
asam
Offline
Зарегистрирован: 12.12.2018

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

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

rx3qic, Вы забыли написать, в чем заключается Ваша проблема.

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

rx3qic пишет:

я не силен в программировании. бльшая просьба хоть чем то помочь.

непонятно, чем вам помочь? - переписать код за вас?

rx3qic
Offline
Зарегистрирован: 27.05.2019

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

rx3qic
Offline
Зарегистрирован: 27.05.2019

проблема в том,что при разрешении экрана 128х64 скетч в ардуино загружается,но не работает. а при разрешении экрана в 128х32 скетч загружается,но работает только верхняя половина изображения,которая развернута на весь дисплей. и нижней информации просто не видно.

rx3qic
Offline
Зарегистрирован: 27.05.2019

код переписывать не надо.может чего посоветовать. у автора то все работает.но он не особо идет на контакт. что он мог то ответил.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Если ты вообще ничего не понимаешь в коде, то единственное разумное решение - купить на Али 128х32.

Или переделывать код на Мегу, там памяти больше, или на "безбуферную" библиотеку, тут, на форуме, есть вариант от Андриано. Но для всего этого нужно уметь хоть "цу-цуть" програмировать. ;))

 

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

rx3qic пишет:

проблема в том,что при разрешении экрана 128х64 скетч в ардуино загружается,но не работает. а при разрешении экрана в 128х32 скетч загружается,но работает только верхняя половина изображения,которая развернута на весь дисплей. и нижней информации просто не видно.

В библиотеке дисплея, скорее всего. в памяти создается буфер на весь экран. Буфер  для разрешения 128х32 занимает 512 байт, а для 128х64 - уже целый килобайт. Вот этой памяти Вам и не хватает.

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

Для вас самое простое - это использовать свой экран 120х64 как 128х32 - то есть только верхнюю половину

rx3qic
Offline
Зарегистрирован: 27.05.2019

в нижней половине находиться S метр.и если включить 128х32,то его как раз и не видно...есть другой скетч. который работает нормально,но там нет S метра. как можно перенесть S метр из одного скетча в другой? простым копированием строк из одного скетча в другой проблема не решается.

rx3qic
Offline
Зарегистрирован: 27.05.2019

а есть вообще ОЛЕД дисплей с разрешением 128х32? я сколько смотрел и заказывал там все одинаковые.

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

rx3qic пишет:

как можно перенесть S метр из одного скетча в другой?

А сами не догадываетесь? - сначала научиться программировать

И хочу сразу сказать, чтобы остановить дальнейшие вопросы - иного пути, кроме как садится за учебники и изучать программирования - НЕТ.

rx3qic
Offline
Зарегистрирован: 27.05.2019

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

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

rx3qic пишет:

если вы понимаете в программировании то подскажите как перенести программу из одного скетча в другой

"подсказать" - я вам уже подсказал. Разберитесь в коде и перенесите.

А если речь идет о том, чтобы взять конкретно ваш код, разобраться в нем и написать вам построчную инструкцию, как это сделать - то это называется не "подсказать", а сделать за вас. Такое вам с радостью сделают в платном разделе, обращайтесь.

rx3qic
Offline
Зарегистрирован: 27.05.2019

понял. спасибо ...буду дальше просить помощи в другом месте.

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

rx3qic пишет:

понял. спасибо ...буду дальше просить помощи в другом месте.

удчи ... хотя в другом месте вряд ли будет сильно лучше.

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

rx3qic
Offline
Зарегистрирован: 27.05.2019

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Буржуи, они добрые, потому что у них велосипеды есть. И зверушка.

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

rx3qic пишет:

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

пришли мне проект, гляну, ник на яндексе

rx3qic
Offline
Зарегистрирован: 27.05.2019

написал письмо...если пришло то товетьте и я отправлю проект.

slider
Offline
Зарегистрирован: 17.06.2014

Флэш можно выгребать весь, компилятор  хорошо просчитывает все ходы скетча.  Оперативку не надо.
По флэшу имел случай, когда грузил скетч OpenEvse (для зарядки электромобиля) , надо было заливать буткор менее жрущий (уно - минипро) в чистую атмегу328 , иначе скетч не заливался , ругался из-за недостатка флэша (какойто буткор больше жрал флэша чем другой) .
А вообще можно было заливать через программатор , тогда буткор затирается, поэтому флэша для вас становиться чутка побольше. 
   С оперативой да бывали косяки, когда подходил близко к пределу, компилятор не все варианты может просчитать когда используется дисплей и разные шрифты  (думаю компилятор может не все варианты букв просчитать которые могут понадобиться вывести в зависимости от неизвестных исходных данных ). Так замечал с UTFT либой, либо становился белый экран , либо висла атмега, в итоге отказывался от некоторых массивов в скетче , полагаясь на видеопамять в дисплее.

Если юзаете OLED и либу U8G2 то правильно выбирайте там дисп. С либой ASOLED встречал проблемы при переходе с 128х64 на 128х32 дисплей (изображение сыпалось) .

//Компиляторы разных версий IDE могут по разному ужимать скетч в код . пробуйте разные версии IDE  (1.5.8   1.6.3   1.8.9 ,...). Используйте как в оригинале проекта.
// еще может возникнуть проблема в atmega2560 , если много своих данных хранить во флэше (к примеру картинки для дисплея)  , адресация там до 65К  http://arduino.ru/forum/programmirovanie/progmem-ili-kak-izvlech-mashinku?page=2#comment-270054
// полезно еще будет  Этюды для начинающих: Память  http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-pamyat-3-dinamicheskie-i-avtomaticheskie-peremen части 1 2 3

//// у вас есть же рабочий проект , на известных деталях , вот и используйте их , разница по деньгам между 128x32  128x64 несущественная .

rx3qic пишет:

проблема в том,что при разрешении экрана 128х64 скетч в ардуино загружается,но не работает. а при разрешении экрана в 128х32 скетч загружается,но работает только верхняя половина изображения,которая развернута на весь дисплей. и нижней информации просто не видно.

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

rx3qic
Offline
Зарегистрирован: 27.05.2019

мне уже помогли ,спасибо .уже все работает хорошо.