Память микроконтроллера
В микроконтроллере три вида памяти, и их важно не путать: Flash хранит программу, RAM — переменные (стирается при выключении), EEPROM — небольшая энергонезависимая область для настроек и данных, переживающих отключение питания. Эта статья — о том, как пользоваться энергонезависимой памятью: EEPROM и самопрограммированием Flash.
EEPROM: хранение настроек
EEPROM позволяет побайтно читать и записывать данные, сохраняющиеся без питания: калибровки, счётчики, пользовательские настройки, серийные номера. Доступ — через регистры (адрес, данные, управление) или готовые функции библиотеки (например, eeprom_read_byte/eeprom_write_byte в avr-libc).
#include <avr/eeprom.h>
uint8_t v = eeprom_read_byte((uint8_t*)0); // чтение
eeprom_write_byte((uint8_t*)0, 42); // запись
Ресурс записи и износ
У EEPROM (и Flash) ограниченный ресурс циклов перезаписи — обычно около 100 000 для EEPROM и меньше для Flash. Запись к тому же медленнее чтения. Отсюда правила:
- не писать в цикле без нужды;
- писать только при реальном изменении данных;
- для частых записей применять выравнивание износа (wear leveling) — распределять записи по разным ячейкам.
Самопрограммирование Flash и бутлоадер
Многие МК умеют записывать собственную Flash в работе (self-programming). На этом основан бутлоадер — небольшая программа, позволяющая обновлять прошивку без программатора (через UART, USB, «по воздуху»). Именно бутлоадер делает возможной загрузку скетчей в Arduino по USB. Часть Flash также используют как дополнительное энергонезависимое хранилище данных.
Частые вопросы
Чем EEPROM отличается от Flash?
Flash хранит программу и стирается/пишется блоками, EEPROM — данные, доступные побайтно, с большим ресурсом перезаписи. EEPROM удобна для настроек, Flash — для кода и крупных массивов.
Почему нельзя постоянно писать в EEPROM?
Ресурс ограничен (~100 000 циклов на ячейку). Частая запись в одну ячейку быстро её изнашивает. Пишите только при изменении данных и распределяйте записи по адресам.
Итоги
Энергонезависимая память МК — EEPROM для настроек и данных, Flash для программы (с возможностью самопрограммирования и бутлоадера). Главное ограничение — конечный ресурс перезаписи: пишите редко, только при изменениях и с выравниванием износа при частых записях.
Смотрите также: AVR на C · Arduino и бутлоадер · PIC · Intel HEX.