Тест EEPROM памяти AVR микроконтроллера. Эксперимент

Введение

   Внутренняя программа микроконтроллера AVR может читать и записывать любой байт EEPROM памяти. Однако при программировании EEPROM`a внешним программатором чтение и запись осуществляется постранично. В зависимости от типа микроконтроллера страницы EEPROM памяти имеют разный размер. Например, у микроконтроллера atmega16 размер страницы EEPROM памяти равен 4-ем байтам. 
   Существует мнение, что заявленный производителем ресурс EEPROM памяти AVR микроконтроллеров, равный 100000 циклов запись/чтение, относится не к единичной ячейке памяти, а к целой странице. То есть если мы в один байт EEPROM`а atmega16 запишем 100000 раз, остальные три ячейки страницы памяти потеряют свой ресурс, будучи вроде ни разу не тронутыми. 
   Мне стало интересно узнать, соответствует ли это действительности, и я провел небольшой тест EEPROM памяти atmega16. Понятно, что этот тест не является каким-то глубоким научным исследованием, но это все же лучше, чем ничего. 

Содержание теста

   Суть теста была предельно проста. В заданный байт EEPROM`a записывалось произвольное число, затем из этой же ячейки производилось чтение. Далее программа сравнивала записанное и считанное значение, и по результату сравнения увеличивался или счетчик удачных записей, или счетчик ошибок. Произвольное число генерировалось с помощью встроенной Си функции, а запись-чтение EEPROM`a производилось самописными функциями (чтобы можно было обращаться к EEPROM по конкретным адресам). 
   Каждые 10000 удачных записей в терминал выводилось сообщение с адресом тестируемой ячейки, числом произведенных записей и последним записанным числом. Таким образом, я контролировал, что микроконтроллер тестирует память, и каждый раз записывает разные числа. Также в терминал выводилось сообщение при появлении ошибок, чтобы отследить момент первого сбоя и посмотреть, как они накапливаются. 
   Ячейки тестировались в порядке возрастания адреса. Сначала "убивалась" 0-я ячейка, затем 1, 2 и так далее. То есть когда доходила очередь до последнего байта страницы (3 и 7 байты), предыдущие три были уже испорчены. 

Результаты теста EEPROM

   Всего я проверил 8 байтов EEPROM памяти atmega16, то есть две страницы. Да, это не так много, но вопреки моим ожиданиям ячейки оказались очень стойкими, и на тест одного байта уходило полдня. Полученные данные я свел в два графика. 
   Первый график отображает число циклов запись/чтение до появления первой ошибки. Из графика видно, что число циклов перезаписи для каждой ячейки составило не меньше 3 миллионов. Довольно большое число, но вряд ли ему стоит удивляться. Во-первых, заявленный ресурс EEPROM`a (100 тысяч), естественно, берется с большим запасом. Во-вторых, он указывается для всего рабочего температурного диапазона микроконтроллера, а я проводил тест только для комнатной температуры.
   Как видите, ресурс одной ячейки никак не зависит от ресурса другой. Если бы от одной испорченной ячейки портилась вся страница, соседние ячейки EEPROM`a в лучшем случае не показали бы такой же результат, а в худшем начинали сбоить практически сразу. Этого не было. Например, 2-ой байт вообще побил все рекорды, выдержав 6 миллионов записей, а ведь он тестировался третьим по счету. Делайте выводы. 

тест ресурса eeprom памяти

   
   Второй график, составленный по результатам теста, отображает характер «деградации» ячейки памяти. Дело в том, что даже после появления сбоев, EEPROM памятью еще можно пользоваться. Некоторое время ошибки возникают достаточно редко, и только после превышения определенного порога, ячейка начинает сбоить практически постоянно. Это значит, что программные способы коррекции ошибок, реально могут продлить ресурс EEPROM памяти и их нужно применять.

Выводы

   Заявленный фирмой Atmel ресурс EEPROM памяти микроконтроллеров AVR, равный 100 тысячам циклов запись/чтение, относится к ресурсу одного байта памяти, а не к целой странице.

Добавить комментарий

При добавлении в комментарий Си кода, заключайте его между тегами [code] [/code]. Иначе он будет отображаться некорректно.


Защитный код
Обновить