Ограничения памяти на Arduino
Недавно я купил Arduino Uno, и теперь я немного экспериментирую с ним. У меня есть пара датчиков 18B20 и подключенный к ней сетевой модуль ENC28J60, затем я создаю эскиз, чтобы разрешить мне подключаться к нему из браузера и считывать температуры либо как простую веб-страницу, либо как JSON. Код, который делает веб-страницы, выглядит так:
client.print("Inne: ");
client.print(tempin);
client.println("<br />");
client.print("Ute: ");
client.print(tempout);
client.print("<br /><br />");
client.println(millis()/1000);
// client.print("<a href=\"/json\">j</a>");
Странная вещь: если я раскомментирую последнюю строку, эскиз компилируется в порядке, загружает все, но я не могу подключиться к плате. То же самое происходит, если я добавлю несколько символов в некоторые другие распечатки. Таким образом, мне кажется, что я сталкиваюсь с каким-то ограничением памяти (общий размер эскиза составляет около 15 килобайт, а в другом - код, а некоторые другие - и я знаю, я буду переписать его, чтобы использовать массив для хранения временных файлов, я только что украл код из примера).
Есть ли ограничение на количество памяти, которое я могу использовать для хранения строк в Arduino, и есть ли способ обойти это? (используя GUI v 1.0.1 на Debian ПК с GCC-AVR 4.3.5 и AVR Libc 1.6.8).
Ответы
Ответ 1
ОЗУ довольно мала, поскольку UNO 328 составляет всего 2K. У вас может быть просто нехватка памяти. Я узнал, что, когда он заканчивается, он просто сидит там.
Я предлагаю прочитать readme из этой библиотеки, чтобы получить FreeRAM. В нем упоминается, как ".print" может потреблять как RAM, так и ROM.
Я всегда использую (для Arduino IDE 1.0. +)
Serial.print(F("HELLO"));
против
Serial.print("HELLO");
поскольку он сохраняет RAM, и это должно быть верно для lcd.print. Где я всегда ставил
Serial.println(freeMemory(), DEC); // print how much RAM is available.
в начале кода и обратите внимание. Отмечая, что для запуска фактического кода и повторного проклятия в его подпрограммах должно быть место.
Для IDE до 1.0.0 библиотека предоставляет getPSTR()).
Теперь IDE 1.0.3 начинает отображать ожидаемое использование ОЗУ в конце компиляции. Тем не менее, я нахожу, что он часто бывает коротким, поскольку это только оценка.
Я также рекомендую вам посмотреть Webduino, поскольку у него есть библиотека, которая поддерживает JSON. Его примеры очень быстрые. Однако он не поддерживает ENC28J60.
Ответ 2
Я использую следующий код для получения бесплатной ОЗУ
int getFreeRam()
{
extern int __heap_start, *__brkval;
int v;
v = (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
Serial.print("Free RAM = ");
Serial.println(v, DEC);
return v;
}
Ответ 3
Вы можете проверить использование памяти с помощью небольшого lib, называемого memoryFree.
Когда на выходе слева, вы можете нажимать предел последовательного буфера вместо предела ram. Если это так, вы можете увеличить SERIAL_BUFFER_SIZE
в HardwareSerial.cpp
(C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino
на машине Windows)
Будьте осторожны, хотя в SRAM хранятся RAM и последовательный буфер. Увеличение последовательного буфера приведет к уменьшению объема доступной памяти для ваших переменных.
Для игры с JSON на ардуине есть действительно хорошая библиотека, называемая aJson.
Ответ 4
добавьте эту функцию и вызовите ее в настройках и время от времени в вашем цикле, чтобы убедиться, что RAM не используется.
// Private function: from http://arduino.cc/playground/Code/AvailableMemory
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Вам нужно вызвать его, например, внутри печати:
Serial.println(FreeRAM());