Размер загружаемого скетча????

Тема в разделе "Arduino & Shields", создана пользователем Вячеслав, 21 фев 2013.

  1. Столкнулся со странной ошибкой.
    Когда загружаю скетч в UNO, при размере скетча > 18126 Uno отказывается работать.
    Т.е.
    1. Загружаю скетч, Arduino пишет "Размер скетча в двоичном коде: 18126 байт (из 32 256 байт максимум)" - все работает корректно.
    2. Вношу изменения, загружаю, Arduino пишет "Размер скетча в двоичном коде: 18 254 байт (из 32 256 байт максимум)" и программа не работает.
    Причем проблемы начинаются когда код переваливает за 18000, я пробовал вносить изменения в разные "места" программы, ошибка зависит не от кода, а от размера.

    Ни кто не сталкивался с подобной проблемой?

    Правда стоит заметить, что Uno я купил в Китае.
    PS/ К сожалению второй UNO под рукой нет и не могу проверит на другой плате.
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Хм, довольно странно. Я помню, что заливал скетч с размером «под завязку» и всё хорошо бегало.
     
  3. Вот я подумываю что проблема в Китае. Надо попробовать на другой плате.
     
  4. roggedhorse

    roggedhorse Гик

    Пожалуйста, сообщите симптомы
    Как именно "не работает". Как вы определяете это ?


    P.S. Добавлю: выглядит так, будет у вас исчерпана оперативная память
     
  5. roggedhorse

    roggedhorse Гик

    Предлагаю попробовать следующее:

    Вставьте этот код в свою программу.

    Код (Text):
    // MemoryFree library based on code posted here:
    // http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1213583720/15
    //
    // Extended by Matthew Murdoch to include walking of the free list
    int getFreeRam() {
      extern int __heap_start, *__brkval;
      int v;
      return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
    }
     
    extern unsigned int __heap_start;
    extern void *__brkval;
     
    /*
    * The free list structure as maintained by the
    * avr-libc memory allocation routines.
    */
    struct __freelist {
      size_t sz;
      struct __freelist *nx;
    };
     
    /* The head of the free list structure */
    extern struct __freelist *__flp;
     
    /* Calculates the size of the free list */
    int freeListSize() {
      struct __freelist* current;
      int total = 0;
     
      for (current = __flp; current; current = current->nx) {
        total += 2; /* Add two bytes for the memory block's header  */
        total += (int) current->sz;
      }
     
      return total;
    }
     
    int freeMemory() {
      int free_memory;
     
      if ((int)__brkval == 0) {
        free_memory = ((int)&free_memory) - ((int)&__heap_start);
      } else {
        free_memory = ((int)&free_memory) - ((int)__brkval);
        free_memory += freeListSize();
      }
      return free_memory;
    }
     
    Затем верните код в то состояние, когда размер загружаемого файла будет не более 18126 (код у вас работает при таком размере).
    В самом начале setup() нужно вывести Serial.println(freeMemory());
     
  6. Получилось вот что:
    1. Размер загружаемого кода = 18124 в сериал говорит 600
    Все работает
    2. Размер загружаемого кода = 18212 в сериал говорит 576
    Появляются сбои
    Симптомы:
    Я сделал достаточно большое меню на LCD Keypad Shield, и при превышении размера скетча, начинают пропадать (потом могут и появиться) некоторые пункты меню. В сериал, куда я скидываю номер пункта меню UNO исправно все пишет. А на экране уже некоторые пункты не отображаются.
     
  7. roggedhorse

    roggedhorse Гик

    Свободная память есть, тут все ок.
    Симптомы очень сильно похожи на неправильную работу с памятью.
    Такое может происходить, когда, например, пытаетесь записать N байт данных в область памяти размера М, где M < N.
    Например, используете массив размером 10 элементов, но пытаетесь записать в него 11-ый.
     
    shoitov нравится это.
  8. Массивы проверил. Вроде нормально.
     
  9. Вот эта строчка работает
    Код (Text):
          } else if ((currentMenu=="0021010")) { // Устройство длительность полива ||(currentMenu=="0031010")||(currentMenu=="0041010")||(currentMenu=="0051010")
    А эта уже нет
    Код (Text):
      } else if ((currentMenu=="0021010")||(currentMenu=="0031010")||(currentMenu=="0041010")||(currentMenu=="0051010")) { // Устройство длительность полива
     
  10. roggedhorse

    roggedhorse Гик

    В коде используете указатели ? Операторы new, delete, вызов malloc().
     
  11. Мне кажется надо просто на другой Дуне попробовать. Если симптомы будут одинаковыми, проблема в коде.
     
  12. Нет
     
  13. roggedhorse

    roggedhorse Гик

    Я не нашел ссылку на либу, о которой вы говорите.
    currentMenu какой тип имеет ?
    Дайте этот кусок кода
     
  14. Нет, я не знал ни чего про библиотеку. Я сам писал меню, Код могу выложить но разобраться будет не просто.
     

    Вложения:

  15. Я писал про строку 349, впрочем если добавить код в других местах то эффект примерно тот же.
     
  16. roggedhorse

    roggedhorse Гик

    вот вы записали скетч в ардуино, она перезапустилась. Как потом развиваются события ?
    Вы сразу после ее старта определяете, что что-то не так или нажимаете кнопки и обнаруживаете сбой ?
    Последовательность какая ?
     
  17. Началось так: После добавления нового кода, первое меню появлялось только на половину(Одна строчка). Я начал постепенно убирать добавленный код и дошел до того, что не работает только пункты меню Shedule\Duration\Return Документ2.jpg . Если уменьшить 349 строчку то все работает.
     
  18. Мне думается пока рано разбираться, нужно на другой дуне попробовать. Уж очень ошибка странная.
     
  19. roggedhorse

    roggedhorse Гик

    Полагаю, что у вас ошибка в этой строке (и всех аналогичных строках):

    Код (Text):
    lcd.print("\x7E"+String( MenuPunkt2[i+startPos])+": "+hour())
    Попробуйте сделать тот же самый вывод, только в Serial:

    Код (Text):
    Serial.println("\x7E"+String( MenuPunkt2[i+startPos])+": "+hour());
    Скорее всего на выходе будет абракадабра. Что говорит о неправильном употреблении типа String.

    P.S. Объявите также константы MenuPunkt как String
    У вас они сейчас имеют тип char *
     
  20. Не. Все отображается корректно.
    А вот при замене char на String размер загружаемого кода вырос с 18124 до 19135 и не отображается даже первый уровень меню. Явная зависимость от размера.
    Вернул назад charы.