Как вы заявляете, внутренняя 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, но их использование зависит от вашего применения.
Однажды я провел эксперимент на внешней ЭСППЗУ с 1 миллионами максимальных циклов. Потребовалось около 6 миллионов циклов, чтобы стать в значительной степени коррумпированным, и до этого у него возникали спорадические масштабы коррупции.
Когда вы говорите, что не меняете значение, я предполагаю, что вы записываете одни и те же данные на адрес несколько раз. Это почти наверняка подействовало бы на жизнь, хотя, вероятно, не повредило бы окружающие клетки.
источник
http://hackaday.com/2011/05/16/destroying-an-arduinos-eeprom/
источник
Волшебное решение - если вы не хотите кодировать то, что Cybergibbons говорит о чтении перед записью, это функция EEPROM.update (). Это делает именно это:
EEPROM.update (адрес, значение);
будет только писать и подчеркивать память, если значение отличается от того, которое уже сохранено.
источник