Недостаточно памяти, программа может работать нестабильно.

Тема в разделе "Arduino & Shields", создана пользователем Vovka, 12 фев 2019.

  1. Vovka

    Vovka Гик

    Столкнулся с таким предупреждением:

    Изменены опции сборки, пересобираем все
    Скетч использует 21916 байт (71%) памяти устройства. Всего доступно 30720 байт.
    Глобальные переменные используют 1705 байт (83%) динамической памяти, оставляя 343 байт для локальных переменных. Максимум: 2048 байт.
    Недостаточно памяти, программа может работать нестабильно.

    Как это понимать? Свободной памяти еще прилично, а уже предупреждение... В чем подвох?
     
  2. DetSimen

    DetSimen Guest

    вот в этом.
     
    Andrey12 нравится это.
  3. DetSimen

    DetSimen Guest

    у тебя остается всего 343 байта на стек и на кучу, этого мало.
     
    Andrey12 нравится это.
  4. DetSimen

    DetSimen Guest

    запхай все строки в PROGMEM, ты удивишьса.
     
    Andrey12 нравится это.
  5. Vovka

    Vovka Гик

    А сколько должно быть, чтобы было достаточно?
     
  6. parovoZZ

    parovoZZ Гуру

    а на хера так много? У меня 10 байт глобальных переменных это как серпом по яйцам. Обычно их там 0.
     
  7. Vovka

    Vovka Гик

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

    b707 Гуру

    чем меньше, тем лучше.
    Куда столько девал-то, признавайся.
    Обычно, к моменту как флеш на Нане заканчивается - переменные используют 300-500 байт. А у тебя в 3-4 раза больше
     
  9. b707

    b707 Гуру

    уже начинай искать - именно это тебе система и говорит. если ты не понял
     
  10. Vovka

    Vovka Гик

    А как эту радость запихать:
    Код (C++):
    PROGMEM const unsigned char* arRezim[5] = {
            PROGMEM (const unsigned char *)"\x0A\x4F\x63\xBF\x61\xBD\x6F\xB3\xBB\x65\xBD"
        ,    PROGMEM (const unsigned char *)"\x09\xA5\xBD\xBA\x79\xB2\x61\xBF\x6F\x70"
        ,    PROGMEM (const unsigned char *)"\x06\xA0\x70\x79\xE3\x65\x70"
        ,    PROGMEM (const unsigned char *)"\x07\x48\x65\x63\x79\xC1\xBA\x61"
        ,    PROGMEM (const unsigned char *)"\x0F\x50\x65\xB4\x79\xBB\xC7\xBF\x6F\x70\x20\x54\x2C\x56\x2C\x4C"
    };
     
    Пробовал разные варианты - не хочет :(
     
  11. b707

    b707 Гуру

    судя по слову PROGMEM - она уже там
     
  12. Vovka

    Vovka Гик

    нет, куча ошибок, начиная с первой строки:
    Код (C++):
    soo.h:9:39: error: variable 'arRezim' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

    PROGMEM const unsigned char* arRezim[5] = {
                                                                        ^
     
    И на каждый PROGMEM следующих строк жалуется
     
  13. AlexU

    AlexU Гуру

    С массивами строк не всё так просто.
    Если по-простому, то сначала надо запихать во флеш каждую строку:
    Код (C++):

    PROGMEM const char str_1[] = "\x0A\x4F\x63\xBF\x61\xBD\x6F\xB3\xBB\x65\xBD";
    PROGMEM const char str_2[] = "\x09\xA5\xBD\xBA\x79\xB2\x61\xBF\x6F\x70";
    PROGMEM const char str_3[] = "\x06\xA0\x70\x79\xE3\x65\x70";
    PROGMEM const char str_4[] = "\x07\x48\x65\x63\x79\xC1\xBA\x61";
    PROGMEM const char str_5[] = "\x0F\x50\x65\xB4\x79\xBB\xC7\xBF\x6F\x70\x20\x54\x2C\x56\x2C\x4C";
     
    а уже потом сформировать массив строк:
    Код (C++):

    PROGMEM const char * const arRezim[5] = {
      str_1
      ,  str_2
      ,  str_3
      ,  str_4
      ,  str_5
    };
     
    Но с такими данными нужно ещё уметь работать -- правильно их читать.
     
    Andrey12 и Vovka нравится это.
  14. Vovka

    Vovka Гик

    Тут есть как правильно инициализировать:
    http://arduino.ru/forum/programmirovanie/ocherednoi-raz-progmem

    В итоге имею:
    Скетч использует 21916 байт (71%) памяти устройства. Всего доступно 30720 байт.
    Глобальные переменные используют 1065 байт (52%) динамической памяти, оставляя 983 байт для локальных переменных. Максимум: 2048 байт.


    Если убрать пока единственные две строчки для работы с сериалом:
    Код (C++):
      Serial.begin(19200);
      Serial.setTimeout( 10 );
     
    то:
    Скетч использует 21072 байт (68%) памяти устройства. Всего доступно 30720 байт.
    Глобальные переменные используют 890 байт (43%) динамической памяти, оставляя 1158 байт для локальных переменных. Максимум: 2048 байт.


    Прожорливая библиотека - надо потом и ее переписать..
     
  15. Vovka

    Vovka Гик

    Опередил! ;)
     
  16. Vovka

    Vovka Гик

    Так это получается, что теперь все строки нужно через буфер выводить? :(
     
  17. AlexU

    AlexU Гуру

    Смотря куда выводить....
    Наследники класса Print умеют работать со строками из флеша.
     
    Vovka нравится это.
  18. DetSimen

    DetSimen Guest

    Ну от. Ты удивилса?
     
    Andrey12 нравится это.
  19. Vovka

    Vovka Гик

    была надежда, но не судьба :(
     
  20. Прежде чем заниматься ерундой, нужно запустить скетч и протестировать, есть ли в нем проблемы. И потом уже думать о том, нужно ли тратить время на оптимизации.