Введение
Внутренняя программа микроконтроллера 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 памяти и их нужно применять.
Выводы
Заявленный фирмой Atmel ресурс EEPROM памяти микроконтроллеров AVR, равный 100 тысячам циклов запись/чтение, относится к ресурсу одного байта памяти, а не к целой странице.
Comments
Тест - хотя бы вот как (типа псевдокод):
Оптимизация=none
long count;
EE(1) = 0; // Тестовые ячейки 1,2,3.
EE(2) = 0;
EE(3) = 0;
// Заведомо убить ячейку 0.
for(count= 0L;count < 10000000L;count ++){
// Писать в одну ячейку.В остальных - 0.
EE(0)= 0;
}
// Проверять другие ячейки страницы - пострадали ли они от записей в ячейку 0.
do{
EE(1)=0xaa;if( EE(1)!= 0xaa) break;
EE(1)=0x55;if( EE(1)!= 0x55) break;
EE(2)=0xaa;if( EE(2)!= 0xaa) break;
EE(2)=0x55;if( EE(2)!= 0x55) break;
EE(3)=0xaa;if( EE(3)!= 0xaa) break;
EE(3)=0x55;if( EE(3)!= 0x55) break;
НЕ ПОСТРАДАЛИ!
while(1) {;}
}while(0);
ПОСТРАДАЛИ!
while(1) {;}
Так?
То есть хотим понять, пишется в ЕПРОМ за один раз вся 4-байтовая страница или пишется только один выбранный байт. Так?
Мы знаем, что ресурс ячейки "сжигается", когда в нее пишем b00000000.
То есть, при страничной записи, если во всех ячейках данной страницы находятся нули, то запись даже в одну из ячеек вызывает процессы СтираниеСтраниц ы и ЗаписьСтраницы, то есть все 4 байта стираются и ОПЯТЬ перезаписываютс я нулями.
То есть гробится ресурс всех 4-х байт страницы.
Ваш тест как это покажет? Ну убивается ячейка 0, а в ячейке 1 лежит FF и ее ресурс не уменьшается. И не поймешь, страница пишется или нет. А Вы перед тем как писать в яч.0 - обнулите все другие ячейки страницы, - пусть они тоже перезаписываютс я (если конечно там действительно страничная запись).
RSS feed for comments to this post