Флеш-память
Флеш-память в Arduino: ваш справочник по постоянному хранению программ и данных
Когда вы начинаете работать с Arduino, вы быстро сталкиваетесь с понятием «память». Одним из трех ключевых типов памяти в микроконтроллере является флеш-память. Давайте разберем, что это такое, зачем она нужна и как с ней работать.
Что такое флеш-память? Аналогия из жизни
Представьте себе учебник:
Оперативная память (SRAM) — это ваш рабочий стол. Вы кладете на него книгу, делаете пометки, вычисления. Но как только вы уходите (отключается питание), стол пуст.
Флеш-память — это полка с учебниками. Книги (программы и данные) хранятся там постоянно, даже когда вы покинули комнату. Чтобы прочитать книгу, вы берете ее с полки и кладете на стол. Чтобы изменить книгу, нужно достать ее, стереть карандашные пометки и написать новые.
Технически: Флеш-память — это энергонезависимая память (EEPROM), которая сохраняет информацию после отключения питания. В контексте Arduino она используется в первую очередь для двух целей.
Две главные роли флеш-памяти в Arduino
Хранение прошивки (скетча)
Это основное назначение. Когда вы нажимаете «Загрузить» в Arduino IDE, скомпилированный машинный код вашей программы записывается (прошивается) именно во флеш-память.
При каждом включении платы микроконтроллер начинает выполнять программу отсюда.
Важно: Стирание и запись этой части памяти происходит медленно (десятки миллисекунд) и имеет ограниченное количество циклов (около 10 000 для чипов ATmega). Но так как вы перезаписываете скетч не так часто, этого хватает на годы разработки.
Хранение постоянных данных (PROGMEM)
Иногда в программе нужны большие неизменяемые массивы данных: таблицы символов для дисплея, шаблоны HTML для веб-сервера, длинные строки, карты уровней игры, коэффициенты калибровки.
По умолчанию они загружаются в оперативную память (SRAM), которая очень мала (2 КБ на Uno). Это может привести к ее переполнению и сбоям.
Решение — хранить эти данные во флеш-памяти с помощью директивы
PROGMEM(Program Memory). Программа будет считывать их оттуда прямо во время работы, не занимая драгоценную SRAM.
Сколько флеш-памяти на разных платах?
Объем определяет, насколько сложную программу вы можете загрузить.
Arduino Uno, Nano (ATmega328P): 32 КБ. Из них ~0.5 КБ занимает загрузчик (bootloader).
Arduino Mega 2560 (ATmega2560): 256 КБ — для очень больших проектов.
Arduino Leonardo (ATmega32u4): 32 КБ.
ESP8266 (NodeMCU): 4 МБ — здесь флеш-память внешняя, ее много.
ESP32: Обычно 4-16 МБ — огромный объем для программ и файловой системы (SPIFFS/LittleFS).
Как узнать, сколько занято? При загрузке скетча Arduino IDE внизу показывает: «Sketch uses X bytes (Y%) of program storage space. Maximum is Z bytes».
Практика: Работа с флеш-памятью для хранения данных (PROGMEM)
Допустим, нам нужен большой массив констант.
Проблема (обычное объявление, занимает SRAM):
Решение (храним во флеш-памяти):
Подключите библиотеку:
#include <avr/pgmspace.h>(для AVR: Uno, Nano, Mega). Для ESP8266/ESP32 используют свои методы.Используйте макрос
PROGMEM:
Для чтения есть удобные функции:
pgm_read_byte_near(address)— читает байт.pgm_read_word_near(address)— читает слово (2 байта).strcpy_P(dest, source_progmem)— копирует строку из флеш в SRAM.
Флеш-память и EEPROM — в чем разница?
Флеш-память: Предназначена для хранения программы и больших постоянных массивов (PROGMEM). Стирается/записывается большими блоками (страницами по 64-128 байт). Медленнее для частых по-байтовых обновлений.
EEPROM: Это отдельная небольшая память (1-4 КБ на ATmega) для хранения изменяемых пользовательских данных (настройки, счетчики, результаты калибровки). Позволяет перезаписывать отдельные байты до 100 000 раз. Для работы с ней используют библиотеку
EEPROM.h.
Кратко: PROGMEM — для того, что не меняется (константы программы), EEPROM — для того, что меняется в процессе работы (данные).
Полезные советы и частые ошибки
Не путайте объемы: Если скетч не компилируется с ошибкой «low memory» или ведет себя странно — проблема обычно в SRAM, а не во флеш-памяти. Следите за использованием оперативной памяти.
Загрузчик (Bootloader): Небольшая программа во флеш-памяти, которая позволяет загружать скетч через USB-UART. Без него прошиваться можно только через отдельный программатор.
ESP8266/ESP32: У них флеш-память внешняя и организована сложнее. Часть ее отводится под файловую систему (SPIFFS или LittleFS), где можно хранить веб-страницы, конфиги, как на SD-карте. Библиотеки:
FS.h,SPIFFS.h.Счетчик циклов записи: Не пишите во флеш-память в бесконечном цикле
loop()— это быстро ее убьет. Используйте для частых обновлений EEPROM (с осторожностью) или внешнюю SD-карту.
Заключение
Флеш-память в Arduino — это фундамент, на котором работает ваша программа, и ценный ресурс для оптимизации. Понимая ее роль:
вы сможете писать более сложные и большие скетчи,
эффективно бороться с нехваткой оперативной памяти,
и создавать проекты, которые надежно хранят не только код, но и постоянные данные.
Начните с использования PROGMEM для больших массивов, и вы сразу сделаете шаг от новичка к продвинутому разработчику Arduino.
Оставить комментарий
Ваш адрес электронной почты не будет опубликован. Email необязателен. Обязательные поля отмечены *