Arduino sketch использует слишком много места в памяти?

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

#include "Adafruit_CCS811.h"
Adafruit_CCS811 ccs;

void setup() {
    Serial.begin(9600);
    Serial.println("CCS811 test");
    if(!ccs.begin()){
        Serial.println("Failed to start sensor! Please check your wiring.");
        while(1);
    }

    //калибровка датчика температуры
    while(!ccs.available());
    float temp = ccs.calculateTemperature();
    ccs.setTempOffset(temp - 25.0);
}

void loop() {
    if(ccs.available()){
        float temp = ccs.calculateTemperature();
        if(!ccs.readData()){
            Serial.print("CO2: ");
            Serial.print(ccs.geteCO2());
            Serial.print("ppm, TVOC: ");
            Serial.print(ccs.getTVOC());
            Serial.print("ppb Temp:");
            Serial.println(temp);
        } else {
            Serial.println("ERROR!");
            while(1);
        }
    }
    delay(500);
}

Но когда я загружаю его, все, что я вижу, это сообщение, в котором говорится

Sketch uses 8830 bytes (30%) of program storage space. Maximum is 28672 bytes.
Global variables use 487 bytes (19%) of dynamic memory, leaving 2073 bytes for local variables. Maximum is 2560 bytes.

Означает ли это, что на моем компьютере недостаточно места или недостаточно места в arduino? Этот arduino достался мне из вторых рук.

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

, 👍-1

Обсуждение

Там, где это Леонардо, вы можете поместить while (!Serial) {} сразу после вашего Serial.begin. По сути, это приведет к ожиданию, пока последовательный монитор не установит соединение, чтобы вы не потеряли никаких диагностических сообщений., @timemage

Пожалуйста, внимательно прочтите вашу проблему. В нем говорится, что ваша программа использует 30% вашего пространства и 19% динамической памяти. Вы даже близко не приблизились к полноте. @jwh20 прекрасно ответил на этот вопрос., @DragonflyRobotics


2 ответа


3

Здесь нет никаких проблем, пожалуйста, внимательно прочтите сообщение!

В нем говорится, что вы используете ТОЛЬКО 30% доступной программной памяти и 19% динамической памяти.

У тебя осталось ГОРАЗДО больше места.

,

Так значит, это не настоящее сообщение об ошибке? Это должно появляться после каждой загрузки? Я не уверен, следует ли сообщать, была ли она успешной, потому что на последовательном мониторе нет значений данных., @Screenwriter Marc

Это не сообщение об ошибке. Это информационное сообщение. Да, это будет отображаться после каждой загрузки в Arduino., @jwh20

Что касается того, что на последовательном мониторе ничего не отображается, это совсем другая проблема. Возможно, вам следует попробовать один из более простых примеров в качестве отправной точки, чтобы помочь вам ознакомиться с Arduino и его набором инструментов? Пример с миганием - хорошее место для начала., @jwh20

@jwh20 ваш комментарий по поводу сообщения, отображаемого после загрузки, неверен... сообщение отображается в конце процесса компиляции кода .... загрузка происходит позже, @jsotola

Спасибо за разъяснение. Уже слишком поздно редактировать комментарий., @jwh20


1

То, что вы видите там, не является сообщением об ошибке, это только для информации. Он показывает, сколько памяти у вас осталось на Arduino.

Sketch использует 8830 байт (30%) дискового пространства программы. Максимум - 28672 байта.

Речь идет о программном хранилище, также известном как флэш-хранилище (это тип используемой здесь технологии хранения). Это место, где сохраняется фактическая программа, и оно является энергонезависимым (что означает, что оно хранит данные / ваш код даже при отключении питания). В сообщении говорится, что Arduino Leonardo имеет в общей сложности 28672 байта памяти для вашей программы. Когда вы пишете большие программы, вы также будете использовать больше флэш-памяти / программного хранилища. Это означает, что размер флэш-памяти / хранилища программ (который является аппаратным ограничением в микроконтроллере) дает вам верхний предел размера скомпилированной программы, поскольку он не может превышать 100% от максимального значения, заданного там, и все равно загружается. Хотя обратите внимание, что компилятор выполняет большую оптимизацию вашего кода, поэтому нет простой связи между размером кода на C / C ++ и размером скомпилированного кода. Вам нужно на самом деле скомпилировать свой код, чтобы увидеть, какого он будет размера и поместится ли он на вашем Arduino. И это именно то, для чего предназначено это сообщение.

В сообщении говорится, что вы используете 30% флэш-памяти / программного хранилища. Таким образом, вы очень хорошо вписываетесь в рамки дозволенного.

Глобальные переменные используют 487 байт (19%) динамической памяти, оставляя 2073 байта для локальных переменных. Максимум - 2560 байт.

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

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

Это сообщение дает вам подсказку, если у вас закончится оперативная память с вашей программой. Это всего лишь намек. Из-за этого компилятор в этот момент покажет предупреждение, если вы собираетесь использовать 75% или более доступной оперативной памяти, что это может не оставить достаточно места для локальных переменных и, следовательно, привести к нестабильности в программе. (Обратите внимание, что я не уверен в точном пределе, начиная с которого отображается предупреждение. Вы можете попытаться исследовать эту деталь).

Когда у вашей программы заканчивается оперативная память, она выходит из строя или вызывает нестабильность. Итак, вы хотите предотвратить это. В настоящее время вы находитесь на уровне 19%. Кроме того, вы используете несколько локальных переменных, поэтому вы сохраняете здесь.

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

Вы должны, по крайней мере, иметь возможность видеть сообщение CCS811 test на последовательном мониторе. Если нет, пожалуйста, убедитесь, что вы действительно загрузили код (нажав на кнопку загрузить, а не на кнопку подтвердить). В настройках вы можете включить подробный вывод для компиляции и загрузки, чтобы найти возможные источники проблем. Также убедитесь, что вы выбрали правильный порт и что ваш последовательный монитор настроен на ту же скорость передачи данных, что и ваш sketch (в данном случае 9600 бод).

Если это по-прежнему не дает никаких результатов, попробуйте загрузить пример Blink, который вы можете найти в Arduino IDE в меню в разделе примеры -> Основы. Если загрузка прошла успешно, понаблюдайте, начнет ли мигать индикатор сборки. Если да, то этот код работает правильно.

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

,