Подтвердить что ты не робот

Ограничения памяти на 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).

4b9b3361

Ответ 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());