Что такое?

Флеш-память

Флеш-память

Флеш-память в Arduino: ваш справочник по постоянному хранению программ и данных

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

Что такое флеш-память? Аналогия из жизни

Представьте себе учебник:

  • Оперативная память (SRAM) — это ваш рабочий стол. Вы кладете на него книгу, делаете пометки, вычисления. Но как только вы уходите (отключается питание), стол пуст.

  • Флеш-память — это полка с учебниками. Книги (программы и данные) хранятся там постоянно, даже когда вы покинули комнату. Чтобы прочитать книгу, вы берете ее с полки и кладете на стол. Чтобы изменить книгу, нужно достать ее, стереть карандашные пометки и написать новые.

Технически: Флеш-память — это энергонезависимая память (EEPROM), которая сохраняет информацию после отключения питания. В контексте Arduino она используется в первую очередь для двух целей.

Две главные роли флеш-памяти в Arduino

  1. Хранение прошивки (скетча)

    • Это основное назначение. Когда вы нажимаете «Загрузить» в Arduino IDE, скомпилированный машинный код вашей программы записывается (прошивается) именно во флеш-память.

    • При каждом включении платы микроконтроллер начинает выполнять программу отсюда.

    • Важно: Стирание и запись этой части памяти происходит медленно (десятки миллисекунд) и имеет ограниченное количество циклов (около 10 000 для чипов ATmega). Но так как вы перезаписываете скетч не так часто, этого хватает на годы разработки.

  2. Хранение постоянных данных (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):

 

Решение (храним во флеш-памяти):

  1. Подключите библиотеку: #include <avr/pgmspace.h> (для AVR: Uno, Nano, Mega). Для ESP8266/ESP32 используют свои методы.

  2. Используйте макрос 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 — для того, что меняется в процессе работы (данные).

Полезные советы и частые ошибки

  1. Не путайте объемы: Если скетч не компилируется с ошибкой «low memory» или ведет себя странно — проблема обычно в SRAM, а не во флеш-памяти. Следите за использованием оперативной памяти.

  2. Загрузчик (Bootloader): Небольшая программа во флеш-памяти, которая позволяет загружать скетч через USB-UART. Без него прошиваться можно только через отдельный программатор.

  3. ESP8266/ESP32: У них флеш-память внешняя и организована сложнее. Часть ее отводится под файловую систему (SPIFFS или LittleFS), где можно хранить веб-страницы, конфиги, как на SD-карте. Библиотеки: FS.h, SPIFFS.h.

  4. Счетчик циклов записи: Не пишите во флеш-память в бесконечном цикле loop() — это быстро ее убьет. Используйте для частых обновлений EEPROM (с осторожностью) или внешнюю SD-карту.

Заключение

Флеш-память в Arduino — это фундамент, на котором работает ваша программа, и ценный ресурс для оптимизации. Понимая ее роль:

  • вы сможете писать более сложные и большие скетчи,

  • эффективно бороться с нехваткой оперативной памяти,

  • и создавать проекты, которые надежно хранят не только код, но и постоянные данные.

Начните с использования PROGMEM для больших массивов, и вы сразу сделаете шаг от новичка к продвинутому разработчику Arduino.


Оставить комментарий

Ваш адрес электронной почты не будет опубликован. Email необязателен. Обязательные поля отмечены *

Ваш опыт работы на этом сайте будет улучшен за счет использования файлов cookie Cookie Policy