Память в Arduino

В микроконтроллере ATmega168, используемом на платформах Arduino, существует три вида памяти:

  • Флеш-память: используется для хранения скетчей.
  • ОЗУ (Статическая оперативная память с произвольным доступом): используется для хранения и работы переменных. 
  • EEPROM (энергонезависимая память): используется для хранения постоянной информации.

Флеш-память и EEPROM являются энергонезависимыми видами памяти (данные сохраняются при отключении питания). ОЗУ является энергозависимой памятью.

Микроконтроллер ATmega168 имеет:

  • 16 Кб флеш-памяти (2 Кб используется для хранения загрузчика)
  • 1024 байта ОЗУ
  • 512 байт EEPROM

Необходимо обратить внимание на малый объем ОЗУ, т.к. большое число строк в скетче может полностью ее израсходовать. Например, следующая объявление:

char message[] = "I support the Cape Wind project.";

занимает 32 байта из общего объема ОЗУ (каждый знак занимает один байт). При наличии большого объема текста или таблиц для вывода на дисплей возможно полностью использовать допустимые 1024 байта ОЗУ.

При отсутствии свободного места в ОЗУ могут произойти сбои программы, например, она может записаться, но не работать. Для определения данного состояния требуется превратить в комментарии или укоротить строки скетча (без изменения кода). Если после этого программа работает корректно, то на ее выполнение был затрачен весь объем ОЗУ. Существует несколько путей решения данной проблемы:

  • При работе скетча с программой на компьютере можно перебросить часть данных или расчетов на компьютер для снижения нагрузки на Arduino.
  • При наличии таблиц поиска или других больших массивов можно использовать минимальный тип данных для хранения значений. Например, тип данных занимает два байта, а byte - только один (но может хранить небольшой диапазон значений).
  • Неизменяемые строки и данные во время работы скетча можно хранить во флеш-памяти. Для этого необходимо использовать ключ PROGMEM.

Для использования EEPROM обратитесь к библиотеке EEPROM.