Раздел данных превышает доступное пространство на плате

Тема в разделе "Arduino & Shields", создана пользователем martin1987, 13 июл 2021.

Метки:
  1. martin1987

    martin1987 Нерд

    Недавно я создаю небольшую игру и хочу использовать для этого Arduino. Мой код компилируется без проблем, но когда я загружаю его, я получаю ошибку, как показано на рисунке, это потому, что у меня определено слишком много переменных?
    Может кто-нибудь подскажет мне, как это исправить?
    Код (C++):
    Arduino:1.8.12 (Windows 10), Плата разработки: "Arduino Uno".

    Проект использует 6336 байт, что занимает (19%) места в памяти программы. Максимальное значение - 32256 байт. секция данных превышает доступное пространство на плате

    Глобальные переменные используют 3046 байт, (148%) динамической памяти, оставляя -998 байт для локальных переменных. Максимальное значение составляет 2048 байт.
    Недостаточно памяти; посетите следующий URL-адрес, чтобы следовать инструкциям по уменьшению использования памяти.
    http://www.arduino.cc/en/Guide/Troubleshooting#size
    Ошибка при компиляции для платы разработки Arduino Uno.

    Включите в Файл -> Предпочтения
    опцию "Показывать подробный вывод во время компиляции".
    Этот отчет будет содержать больше информации.
     
  2. a1000

    a1000 Гуру

    Возьмите Arduino Mega там микроконтроллер ATmega2560. В нём 8 Kb оперативки.
     
  3. b707

    b707 Гуру

    уменьшить число переменных, очевидно :) Ну или взять другую плату, как посоветовали выше.
    Код можете показать?
     
  4. parovoZZ

    parovoZZ Гуру

    Переходи на ARM.
    Я почему-то уверен, что если выкинуть арудиновские функции полностью, то всё поместится.
     
  5. Рокки1945

    Рокки1945 Гуру

    Тип переменных и волетайл
     
  6. b707

    b707 Гуру

    удивляюсь. как ты вообще что-то программируешь с такой внимательностью :) - обьясняю, у ТС не помещаются ПЕРЕМЕННЫЕ, причем аж на целый килобайт... при общем размере скетча всего 6к. Какие нафик "ардуиновские функции" при таком раскладе? :)))

    Вангую - у ТС там либо куча строчек, либо какой-то массив, типа заставки для игры... которые можно было бы убрать в ПРОГМЕМ и все вошло бы.. Но автор морозится и код не показывает.
     
  7. issaom

    issaom Гуру

    Не совсем очевидно, возможно автор засунул в свой проект дисплей библиотека которого всю память и схомячила...
    Например какой-нибудь OLED 128*64 и Arduino уже будет работать впритык
     
  8. b707

    b707 Гуру

    вообще-то буфер дисплея это тоже переменные :) в каком-то роде :)
    Но я не думаю. что это библиотека - слишком маленький основной скетч... скорее картинка для игры, обьявленная как массив в ОЗУ
     
  9. issaom

    issaom Гуру

    Это вам понятно - а автору раз он задает такой вопрос скорее всего нет)))
     
  10. parovoZZ

    parovoZZ Гуру

    поэтому надо брать архитектуру фон неймана или новые тиньки. Там можно читать по адресу прямо из EEPROM поблочно загружая в ОЗУ, а не целиком.
     
  11. martin1987

    martin1987 Нерд

    Как я могу исправить эту ошибку, не меняя плату?
     
  12. martin1987

    martin1987 Нерд

    О да, я использую сенсорный дисплей, который имеет определенный набор инструкций, для которых мне не нужно вызывать библиотеки в arduino, мне просто нужно использовать эти наборы инструкций для связи между экраном и arduino. Но это также может быть причиной нехватки памяти.
     
  13. martin1987

    martin1987 Нерд

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

    Код (C++):
    unsigned int r_flag1 = 0;
    uint8_t   RecievedTemp1[30]       = {0};

    uint8_t   cout_i = 0;
    unsigned int quan_hang1 = 0;
    unsigned int quan_hang2 = 0;
    unsigned int quan_hang3 = 0;
    unsigned int quan_lie1 = 0;
    unsigned int quan_lie2 = 0;
    unsigned int quan_lie3 = 0;
    unsigned int quan_zuoxia = 0;
    unsigned int quan_youxia = 0;


    unsigned int cha_hang1 = 0;
    unsigned int cha_hang2 = 0;
    unsigned int cha_hang3 = 0;
    unsigned int cha_lie1 = 0;
    unsigned int cha_lie2 = 0;
    unsigned int cha_lie3 = 0;
    unsigned int cha_zuoxia = 0;
    unsigned int cha_youxia = 0;
    unsigned int cha[8]={0};
    void setup()
    {
       Serial.begin(115200);
       for(int i=3; i<=8; i++)
       pinMode(i,OUTPUT);
    }

    void loop(){

      if(Serial.available() != 0)
      {
        Serial.readBytes(RecievedTemp1, 20);
        switch(RecievedTemp1[13])
      {
      case 49:
            if((r_flag1 == 0)&&(RecievedTemp1[14]==2))
            {
            Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image2\",\"image\":\"circle\"}>ET");
            r_flag1 = 1;
            quan_hang1++;
            quan_lie1++;
            quan_youxia++;
            Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button1\",\"enable\":false}>ET");
            }
            else if((r_flag1 == 1)&&(RecievedTemp1[14]==2))
            {
              Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image2\",\"image\":\"x\"}>ET");
             r_flag1 = 0;
                cha_hang1++;
                cha_lie1++;
                cha_youxia++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button1\",\"enable\":false}>ET");
            }
           
            break;
      case 50:
            if((r_flag1 == 0)&&(RecievedTemp1[14]==2))
            {
            Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image3\",\"image\":\"circle\"}>ET");
            r_flag1 = 1;
            quan_hang1++;
                quan_lie2++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button2\",\"enable\":false}>ET");
            }
            else if((r_flag1 == 1)&&(RecievedTemp1[14]==2))
            {
              Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image3\",\"image\":\"x\"}>ET");
             r_flag1 = 0;
             cha_hang1++;
               cha_lie2++;
               Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button2\",\"enable\":false}>ET");
            }
            break;
      case 51:
            if((r_flag1 == 0)&&(RecievedTemp1[14]==2))
            {
            Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image4\",\"image\":\"circle\"}>ET");
            r_flag1 = 1;
            quan_hang1++;
                quan_lie3++;
                quan_zuoxia++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button3\",\"enable\":false}>ET");
            }
            else if((r_flag1 == 1)&&(RecievedTemp1[14]==2))
            {
              Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image4\",\"image\":\"x\"}>ET");
             r_flag1 = 0;
             cha_hang1++;
               cha_lie3++;
                cha_zuoxia++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button3\",\"enable\":false}>ET");
            }
            break;
      case 52:
            if((r_flag1 == 0)&&(RecievedTemp1[14]==2))
            {
            Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image5\",\"image\":\"circle\"}>ET");
            r_flag1 = 1;
            quan_hang2++;
                quan_lie1++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button4\",\"enable\":false}>ET");
            }
            else if((r_flag1 == 1)&&(RecievedTemp1[14]==2))
            {
              Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image5\",\"image\":\"x\"}>ET");
             r_flag1 = 0;
             cha_hang2++;
               cha_lie1++;
               Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button4\",\"enable\":false}>ET");
            }
            break;
      case 53:
            if((r_flag1 == 0)&&(RecievedTemp1[14]==2))
            {
            Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image6\",\"image\":\"circle\"}>ET");
            r_flag1 = 1;
            quan_hang2++;
                quan_lie2++;
                quan_zuoxia++;
                quan_youxia++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button5\",\"enable\":false}>ET");
            }
            else if((r_flag1 == 1)&&(RecievedTemp1[14]==2))
            {
              Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image6\",\"image\":\"x\"}>ET");
              r_flag1 = 0;
              cha_hang2++;
                cha_lie2++;
                cha_zuoxia++;
                cha_youxia++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button5\",\"enable\":false}>ET");
            }
            break;      
      case 54:
            if((r_flag1 == 0)&&(RecievedTemp1[14]==2))
            {
            Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image7\",\"image\":\"circle\"}>ET");
            r_flag1 = 1;
            quan_hang2++;
                quan_lie3++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button6\",\"enable\":false}>ET");
            }
            else if((r_flag1 == 1)&&(RecievedTemp1[14]==2))
            {
              Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image7\",\"image\":\"x\"}>ET");
             r_flag1 = 0;
             cha_hang2++;
               cha_lie3++;
               Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button6\",\"enable\":false}>ET");
            }
            break;      
      case 55:
            if((r_flag1 == 0)&&(RecievedTemp1[14]==2))
            {
            Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image8\",\"image\":\"circle\"}>ET");
            r_flag1 = 1;
            quan_hang3++;
                quan_lie1++;
                quan_zuoxia++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button7\",\"enable\":false}>ET");
            }
            else if((r_flag1 == 1)&&(RecievedTemp1[14]==2))
            {
              Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image8\",\"image\":\"x\"}>ET");
             r_flag1 = 0;
             cha_hang3++;
               cha_lie1++;
                cha_zuoxia++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button7\",\"enable\":false}>ET");
            }
            break;      
      case 56:
            if((r_flag1 == 0)&&(RecievedTemp1[14]==2))
            {
            Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image9\",\"image\":\"circle\"}>ET");
            r_flag1 = 1;
            quan_hang3++;
                quan_lie2++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button8\",\"enable\":false}>ET");
            }
            else if((r_flag1 == 1)&&(RecievedTemp1[14]==2))
            {
              Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image9\",\"image\":\"x\"}>ET");
             r_flag1 = 0;
             cha_hang3++;
               cha_lie2++;
               Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button8\",\"enable\":false}>ET");
            }
            break;      
      case 57:
            if((r_flag1 == 0)&&(RecievedTemp1[14]==2))
            {
            Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image10\",\"image\":\"circle\"}>ET");
            r_flag1 = 1;
            quan_hang3++;
                quan_lie3++;
                quan_youxia++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button9\",\"enable\":false}>ET");
            }
            else if((r_flag1 == 1)&&(RecievedTemp1[14]==2))
            {
              Serial.println("ST<{\"cmd_code\":\"set_image\",\"type\":\"image\",\"widget\":\"image10\",\"image\":\"x\"}>ET");
             r_flag1 = 0;
             quan_hang3++;
               quan_lie3++;
                quan_youxia++;
                Serial.println("ST<{\"cmd_code\":\"set_enable\",\"type\":\"widget\",\"widget\":\"button9\",\"enable\":false}>ET");
            }
            break;
      }
     
  14. martin1987

    martin1987 Нерд

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

    Код (C++):
    if((quan_hang1==3)||(cha_hang1==3))
          {
                Serial.println("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif4\",\"visible\":true}>ET");
          }
          else if((quan_hang2==3)||(cha_hang2==3))
          {
                Serial.println("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif5\",\"visible\":true}>ET");
          }
          else if((quan_hang3==3)||(cha_hang3==3))
          {
                Serial.println("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif6\",\"visible\":true}>ET");
          }
          else if((quan_lie1==3)||(cha_lie1==3))
          {
                Serial.println("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif7\",\"visible\":true}>ET");
          }
          else if((quan_lie2==3)||(cha_lie2==3))
          {
                Serial.println("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif8\",\"visible\":true}>ET");
          }
          else if((quan_lie3==3)||(cha_lie3==3))
          {
                Serial.println("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif9\",\"visible\":true}>ET");
          }
          else if((quan_zuoxia==3)||(cha_zuoxia==3))
          {
                Serial.println("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif10\",\"visible\":true}>ET");
          }
          else if((quan_youxia==3)||(cha_youxia==3))
          {
                Serial.println("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif11\",\"visible\":true}>ET");
          }
      }
    }
     
  15. Рокки1945

    Рокки1945 Гуру

    а зачем их делать интеджер когда они в байтового типа переменных влезут - отрицательных значение ведь нет
     
  16. b707

    b707 Гуру

    martin1987 первым делом переместите все ваши строчки во флеш
    Для этого достаточно во всех операторах Serial.print добавить вокруг текста макрос F(), вот так:
    было:
    Код (C++):
    Serial.println("bla-bla-bla");
    должно быть:
    Код (C++):
    Serial.println(F("bla-bla-bla"));
    ну а во-вторых - приведенный код это ярчайший пример гав%%кода... просто кровь из глаз... Так бывает когда человек не доучив язык Си, хватается за большой проект. Например во второй части у вас 8 практически одинаковых огромных строчек, отличающихся только номером выводимой ГИФки/ Так нафига же вы каждый раз печатаете всю строку? Задайте строку заранее и меняйте в ней только один символ... - на одном этом сэкономите минимум байтов 500 оперативки...
    Ну и остальной код такой же...
     
    Un_ka, martin1987 и SergeiL нравится это.
  17. b707

    b707 Гуру

    в тиньку не знаю, а в рассматриваемую Уно - без проблем
    Но ТС пока рано писать такие программы. судя по всему, он пишет код простым копипастом одинаковых строк, вообще не вникая в их смысл
     
  18. parovoZZ

    parovoZZ Гуру

    Очевидно, что ему не ведомо такое понятие, как константы и конкатенация строк. Поэтому берём учебник и зубрим.
     
  19. martin1987

    martin1987 Нерд

    Определяется как целое число - счетное, поэтому оно должно быть целым.
     
  20. martin1987

    martin1987 Нерд

    Спасибо за совет, я действительно очень любитель, но я попытался сделать несколько простых проектов, потому что я был заинтересован в этом.
    Я попробовал так, как вы сказали, и все получилось, спасибо вам большое!