Какой реальный срок службы EEPROM?
ATMEL заявляет, что срок службы ячейки EEPROM составляет около 100 000 циклов записи на ячейку. Действительно ли так работает EEPROM в дикой природе?
Если я не изменю значение ячейки, влияет ли это на время жизни? Например, если я снова и снова записываю значение 0xFF
в одну и ту же ячейку, отличается ли это от написания 0x00
, 0xFF
, 0x00
и т. д.
@Marlon Abeykoon, 👍25
5 ответов
Лучший ответ:
Как вы утверждаете, срок службы внутренней EEPROM составляет 100 000 циклов записи. Это не предположение - очень значительная часть ATmega328 достигнет этого числа без проблем. Ранее я тестировал три процессора, и все без проблем достигли 150 000 циклов.
Важно обратить внимание на режим отказа EEPROM. Большинство проектов «разрушителей EEPROM» многократно читают/записывают до тех пор, пока данные не перестанут записываться вообще. До этого момента EEPROM все равно будет поврежден. Это проявляется в том, что данные не сохраняются в течение разумного периода времени. По этой причине неразумно полагаться на что-то большее, чем 100 000 циклов записи.
EEPROM отличается от оперативной памяти ATmega. Запись в него не простая и не быстрая, но он заключен в дружественную библиотеку Arduino, скрывающую это сложность от пользователя.
Первый уровень косвенности — это библиотека EEPROM, которая тривиально простой], просто вызывая две другие функции для чтения и записи. Это вызывает eeprom_write_byte, найденный здесь.
Эта функция использует встроенный ассемблер, поэтому ее может быть нелегко понять. Однако есть комментарий, который легко понять:
Установить режим программирования: стереть и записать
Это намек на одну из сложностей работы с EEPROM - запись в его, вам сначала нужно стереть его. Это означает, что если вы вызовете EEPROM.write(), он выполнит цикл записи независимо от записываемого вами значения.
Это означает, что повторная запись 0xFF, скорее всего, будет иметь тот же эффект, что и запись 0xFF, 0x00, 0xFF, 0x00 и т. д.
Есть способы обойти это — вы можете попробовать вызвать EEPROM.read() перед EEPROM.write(), чтобы убедиться, что значение уже то же самое, но это требует дополнительного времени.
Есть и другие способы избежать чрезмерного износа EEPROM, но их использование зависит от вашего приложения.
Однажды я провел эксперимент с внешней EEPROM с максимальным номинальным числом циклов 1 миллион. Потребовалось около 6 миллионов циклов, чтобы сильно испортиться, а до этого он прогрессировал, имея спорадические количества повреждений.
Когда вы говорите, что не меняете значение, я предполагаю, что вы записываете одни и те же данные по адресу несколько раз. Это почти наверняка вызовет стресс для жизни, хотя, вероятно, не повлияет на окружающие клетки.
http://hackaday.com/2011/05/16/destroying-an-arduinos-eeprom/
Ардуино было подключено к настенной розетке и сидело «за диваном пару месяцев». В EEPROM произошла первая ошибка записи после 47 дней и 1 230 163 циклов. Это на порядок лучше, чем в спецификации atmel, но похоже на результаты аналогичных экспериментов.
Это кажется слишком высоким. Я слышал о 150-200 тысячах раньше, но никогда об этом :o, @asheeshr
Проблема в том, что это не обнаруживает все режимы отказа. Когда EEPROM повреждается, происходит постепенное уменьшение продолжительности хранения данных. При 100 000 циклов Atmel гарантирует сохранение данных в течение 20 лет. Кроме того, уменьшается срок хранения данных. Когда достигается 1,2 млн циклов и вы видите ошибку, это немедленная ошибка. при 1 230 160 циклах, возможно, не было немедленной ошибки, но данные могли сохраняться только в течение нескольких дней., @Cybergibbons
Волшебное решение — если вы не хотите кодировать то, что Cybergibbons говорит о чтении перед записью, — это функция EEPROM.update(). Он делает именно это:
EEPROM.update(адрес, значение);
будет записывать и выделять память только в том случае, если значение отличается от уже сохраненного.
Пару лет назад я сделал регистратор рабочего времени для оборудования. Память была повреждена после 6 месяцев записи 40 часов с разрешением 1 с => 144000 записей. Мое решение состояло в том, чтобы распределить записи по всему eeprom.
Можете ли вы предоставить более подробную информацию о том, как вы это сделали?, @VE7JRO
Мой 2ct: очистить память (записать все нули или 0xFF; что-то, что вы можете распознать). Затем: каждый раз, когда вы хотите восстановить: найдите первое вхождение идентификатора, загрузите с адреса перед ним и сохраните новое значение в найденном месте. Таким образом вы перемещаетесь по всему адресному пространству. Поднимитесь и повторите, когда дойдете до конца адресного пространства., @Nebula
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Как читать и записывать EEPROM в ESP8266
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Очистка EEPROM
- Как сохранить переменную с плавающей запятой в EEPROM
- Spiffs против Eeprom на esp8266
- В ESP8266 EEPROM сохраненные данные отличаются, когда я пытаюсь их прочитать
Выравнивание износа для EEPROM: http://electronics.stackexchange.com/questions/60342/wear-leveling-on-a-microcontrollers-eeprom, @jippie
@Cybergibbons Я пытаюсь определить, почему EEPROM в системе сохраняет значение только в течение нескольких секунд. Например, если я сразу прочитаю значение, похоже, что запись прошла успешно. Если я прочитаю его через несколько секунд, я начну видеть, как биты меняются с 1 на 0. Вы упомянули выше: «До этого момента EEPROM все еще будет поврежден. Это будет проявляться в том, что данные не сохраняются в течение разумного периода». Не похоже ли описываемый мной режим сбоя на что-то, что может произойти из-за большого количества циклов стирания/записи в определенную ячейку EEPROM?, @Nick