Apa kehidupan nyata EEPROM?

21

ATMEL mengatakan masa pakai sel sel EEPROM adalah sekitar 100.000 siklus tulis / sel. Apakah ini sebenarnya kinerja EEPROM di alam liar?

Jika saya tidak mengubah nilai sel, apakah ini menekankan masa pakai? Sebagai contoh, jika saya menulis nilai 0xFFke sel yang sama lagi dan lagi, apakah ini berbeda untuk menulis 0x00, 0xFF, 0x00dll

Marlon Abeykoon
sumber

Jawaban:

19

Seperti yang Anda nyatakan, EEPROM internal memiliki masa pakai 100.000 siklus tulis. Ini bukan dugaan - proporsi ATmega328 yang sangat signifikan akan mencapai angka ini tanpa masalah. Saya telah menguji tiga prosesor sebelumnya, dan semuanya mencapai 150.000 siklus tanpa masalah.

Penting untuk mencatat mode kegagalan EEPROM. Sebagian besar proyek "perusak EEPROM" berulang kali membaca / menulis hingga data tidak ditulis sama sekali. Sebelum titik ini, EEPROM akan tetap rusak. Ini akan dimanifestasikan oleh data yang tidak disimpan untuk periode yang wajar. Tidak bijaksana untuk mengandalkan lebih dari 100.000 siklus tulis untuk alasan ini.

EEPROM berbeda dengan RAM pada ATmega. Menulis itu tidak sederhana atau cepat, tetapi dibungkus dengan perpustakaan Arduino yang ramah , menyembunyikan kerumitan ini dari pengguna.

Tingkat tipuan pertama adalah perpustakaan EEPROM , yang sangat sederhana], hanya memanggil dua fungsi lain untuk membaca dan menulis. Ini panggilan eeprom_write_byte, ditemukan di sini .

Fungsi ini menggunakan perakitan inline, jadi mungkin tidak mudah dipahami. Ada komentar yang mudah dimengerti:

Atur mode pemrograman: hapus dan tulis

Ini mengisyaratkan salah satu kerumitan dalam berurusan dengan EEPROM - untuk menulisnya, pertama-tama Anda harus menghapusnya. Ini berarti bahwa jika Anda memanggil EEPROM.write (), ia akan melakukan siklus penulisan terlepas dari nilai yang Anda tulis.

Ini berarti bahwa berulang kali menulis 0xFF kemungkinan akan memiliki efek yang sama seperti menulis 0xFF, 0x00,0xFF, 0x00 dll.

Ada beberapa cara untuk mengatasinya - Anda dapat mencoba menelepon EEPROM.read () sebelum EEPROM.write () untuk melihat apakah nilainya sudah sama, tetapi ini membutuhkan waktu tambahan.

Ada teknik lain untuk menghindari pemakaian EEPROM yang berlebihan, tetapi penggunaannya tergantung pada aplikasi Anda.

Cybergibbons
sumber
3
Meratakan pemakaian
9

Saya pernah menjalankan percobaan pada EEPROM eksternal dengan 1 juta siklus nilai maksimum. Butuh sekitar 6 juta siklus untuk menjadi sangat korup, dan sebelum itu telah berkembang menjadi jumlah korupsi yang sporadis.

Ketika Anda mengatakan Anda tidak mengubah nilainya, saya berasumsi Anda menulis data yang sama ke alamat beberapa kali. Ini hampir pasti akan menekankan kehidupan, meskipun mungkin tidak akan menekankan sel-sel di sekitarnya.

Dokter
sumber
2

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

Arduino dicolokkan ke dinding kutil dan duduk, "di belakang sofa selama beberapa bulan." EEPROM melihat kesalahan penulisan pertama setelah 47 hari dan 1.230.163 siklus. Ini adalah urutan besarnya lebih baik daripada spesifikasi pada lembar data atmel, tetapi mirip dengan hasil percobaan serupa.

80HD
sumber
Ini sepertinya terlalu tinggi. Saya pernah mendengar tentang 150k hingga 200k sebelumnya, tetapi tidak pernah seperti ini: o
asheeshr
5
Masalahnya adalah ini tidak mendeteksi semua mode kegagalan. Ketika EEPROM menjadi rusak, yang terjadi adalah lamanya waktu untuk menyimpan data secara bertahap berkurang. Pada 100.000 siklus, Atmel menjamin retensi data 20 tahun. Di luar ini, retensi data berkurang. Ketika siklus 1,2m tercapai, dan Anda melihat kesalahan, ini adalah kesalahan langsung. pada 1.230.160 siklus, mungkin tidak ada kesalahan langsung, tetapi data mungkin hanya disimpan selama berhari-hari.
Cybergibbons
0

Solusi ajaib - jika Anda tidak ingin kode apa kata Cybergibbons tentang membaca sebelum menulis, adalah fungsi EEPROM.update (). Itu persis seperti itu:

EEPROM.update (alamat, nilai);

hanya akan menulis dan menekankan memori jika nilainya berbeda dari yang sudah disimpan.

Jorge
sumber