Какова реальная продолжительность жизни EEPROM?

21

ATMEL говорит, что время жизни ячейки EEPROM составляет около 100 000 циклов записи / ячейка. Это на самом деле, как EEPROM работает в дикой природе?

Если я не изменяю значение ячейки, это напрягает жизнь? Например, если записать значение 0xFFв ту же клетку снова и снова, это по -другое письмо 0x00, 0xFF, и 0x00т.д.

Марлон Абейкун
источник

Ответы:

19

Как вы заявляете, внутренняя EEPROM имеет время жизни 100 000 циклов записи. Это не предположение - очень значительная часть ATmega328 достигнет этого числа без проблем. Я уже тестировал три процессора, и все они прошли 150 000 циклов без проблем.

Важно отметить режим сбоя EEPROM. Большинство проектов «EEPROM Разрушитель» многократно читают / пишут, пока данные не будут записаны вообще. До этого момента EEPROM все еще будет поврежден. Это будет проявляться в том, что данные не хранятся в течение разумного периода времени. По этой причине неразумно полагаться на что-либо более 100 000 циклов записи.

ЭСППЗУ отличается от ОЗУ на ATmega. Запись в него не простая и не быстрая, но она заключена в дружественную библиотеку Arduino , скрывающую эту сложность от пользователя.

Первым уровнем косвенности является библиотека EEPROM , которая является тривиально простой], просто вызывающей две другие функции для чтения и записи. Это вызывает eeprom_write_byte, найденный здесь .

Эта функция использует встроенную сборку, поэтому ее нелегко понять. Есть комментарий, который легко понять, хотя:

Установить режим программирования: стереть и записать

Это намекает на одну из сложностей работы с EEPROM - для записи в нее сначала необходимо стереть ее. Это означает, что если вы вызовете EEPROM.write (), он выполнит цикл записи независимо от значения, которое вы записываете.

Это означает, что повторная запись 0xFF, вероятно, будет иметь тот же эффект, что и запись 0xFF, 0x00,0xFF, 0x00 и т. Д.

Есть способы обойти эту проблему - вы можете попробовать вызвать EEPROM.read () перед EEPROM.write (), чтобы увидеть, является ли значение уже тем же, но это требует дополнительного времени.

Существуют и другие методы, позволяющие избежать чрезмерного износа EEPROM, но их использование зависит от вашего применения.

Cybergibbons
источник
3
Выравнивание износа для EEPROM: electronics.stackexchange.com/questions/60342/…
jippie
9

Однажды я провел эксперимент на внешней ЭСППЗУ с 1 миллионами максимальных циклов. Потребовалось около 6 миллионов циклов, чтобы стать в значительной степени коррумпированным, и до этого у него возникали спорадические масштабы коррупции.

Когда вы говорите, что не меняете значение, я предполагаю, что вы записываете одни и те же данные на адрес несколько раз. Это почти наверняка подействовало бы на жизнь, хотя, вероятно, не повредило бы окружающие клетки.

Доктор
источник
2

http://hackaday.com/2011/05/16/destroying-an-arduinos-eeprom/

Arduino был подключен к настенной бородавке и сидел «за кушеткой в ​​течение нескольких месяцев». EEPROM увидела свою первую ошибку записи после 47 дней и 1230 163 циклов. Это на порядок лучше, чем в спецификации на Atmel, но похоже на результаты аналогичных экспериментов.

80HD
источник
Это кажется слишком высоким. Я слышал о 150k до 200k раньше, но никогда не слышал: o
asheeshr
5
Проблема в том, что это не обнаруживает все режимы сбоя. Когда EEPROM повреждается, то время, в течение которого он будет хранить данные, постепенно уменьшается. Atmel гарантирует 100 000 циклов хранения данных в течение 20 лет. Помимо этого, срок хранения данных уменьшается. Когда пройдено 1,2 м циклов, и вы видите ошибку, это немедленная ошибка. при 1230 160 циклах, возможно, не было немедленной ошибки, но данные могли быть сохранены только в течение нескольких дней.
Cybergibbons
0

Волшебное решение - если вы не хотите кодировать то, что Cybergibbons говорит о чтении перед записью, это функция EEPROM.update (). Это делает именно это:

EEPROM.update (адрес, значение);

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

Jorge
источник