Tuổi thọ thực sự của EEPROM là gì?


21

ATMEL cho biết tuổi thọ của tế bào EEPROM là khoảng 100.000 chu kỳ ghi / ô. Đây thực sự là cách EEPROM thực hiện trong tự nhiên?

Nếu tôi không thay đổi giá trị của một ô, điều này có làm căng thẳng cả đời không? Ví dụ, nếu tôi viết giá trị 0xFFvào ô tương tự một lần nữa và một lần nữa, đây là bất kỳ khác nhau để viết 0x00, 0xFF, 0x00, vv

Câu trả lời:


19

Như bạn nêu, EEPROM nội bộ có vòng đời 100.000 lần ghi. Đây không phải là một phỏng đoán - một tỷ lệ rất đáng kể ATmega328 sẽ đạt đến con số này mà không có vấn đề gì. Tôi đã thử nghiệm ba bộ xử lý trước đó và tất cả đều đạt 150.000 chu kỳ mà không gặp vấn đề gì.

Điều quan trọng cần lưu ý là chế độ thất bại của EEPROM. Hầu hết các dự án "khu trục EEPROM" liên tục đọc / ghi cho đến khi dữ liệu hoàn toàn không được ghi. Trước thời điểm này, EEPROM vẫn sẽ bị hỏng. Điều này sẽ được biểu hiện bằng dữ liệu không được giữ lại trong một khoảng thời gian hợp lý. Thật không khôn ngoan khi dựa vào bất cứ điều gì hơn 100.000 chu kỳ viết vì lý do này.

EEPROM khác với RAM trên ATmega. Viết cho nó không đơn giản hay nhanh chóng, nhưng nó được gói gọn trong một thư viện Arduino thân thiện , che giấu sự phức tạp này khỏi người dùng.

Cấp độ gián tiếp đầu tiên là thư viện EEPROM , đơn giản không đáng kể], chỉ cần gọi hai chức năng khác để đọc và viết. Điều này gọi eeprom_write_byte, được tìm thấy ở đây .

Hàm này sử dụng lắp ráp nội tuyến, vì vậy có thể không dễ hiểu. Có một nhận xét dễ hiểu mặc dù:

Đặt chế độ lập trình: xóa và viết

Điều này gợi ý cho một trong những phức tạp của việc xử lý EEPROM - để viết cho nó, trước tiên bạn cần xóa nó. Điều này có nghĩa là nếu bạn gọi EEPROM.write (), nó sẽ thực hiện chu trình ghi bất kể giá trị bạn đang viết là gì.

Điều này có nghĩa là việc viết nhiều lần 0xFF có thể sẽ có tác dụng tương tự như viết 0xFF, 0x00,0xFF, 0x00, v.v.

Có nhiều cách để giải quyết vấn đề này - bạn có thể thử gọi EEPROM.read () trước EEPROM.write () để xem giá trị này có giống nhau không, nhưng việc này cần thêm thời gian.

Có các kỹ thuật khác để tránh hao mòn EEPROM quá mức, nhưng việc sử dụng chúng phụ thuộc vào ứng dụng của bạn.



9

Tôi đã từng chạy thử nghiệm trên EEPROM bên ngoài với 1 triệu chu kỳ được xếp hạng tối đa. Phải mất khoảng 6 triệu chu kỳ để trở nên hư hỏng nặng nề, và trước đó nó đã tiến triển với số lượng tham nhũng lẻ tẻ.

Khi bạn nói rằng bạn không thay đổi giá trị, tôi giả sử bạn đang ghi cùng một dữ liệu vào một địa chỉ nhiều lần. Điều này gần như chắc chắn sẽ làm căng thẳng cuộc sống, mặc dù nó có thể sẽ không làm căng thẳng các tế bào xung quanh.


2

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

Arduino đã được cắm vào một cái mụn cóc trên tường và ngồi sau một vài tháng. EEPROM thấy lỗi viết đầu tiên sau 47 ngày và 1.230.163 chu kỳ. Đây là một thứ tự cường độ tốt hơn thông số kỹ thuật trên bảng dữ liệu atmel, nhưng tương tự với kết quả của các thí nghiệm tương tự.


Điều này dường như quá cao. Tôi đã nghe nói từ 150k đến 200k trước đây, nhưng chưa bao giờ: o
asheeshr

5
Vấn đề là điều này không phát hiện ra tất cả các chế độ thất bại. Khi EEPROM bị hỏng, thời gian xảy ra là thời gian lưu giữ dữ liệu sẽ giảm dần. Tại 100.000 chu kỳ, Atmel đảm bảo lưu giữ dữ liệu 20 năm. Ngoài ra, việc lưu giữ dữ liệu giảm. Khi đạt chu kỳ 1,2m và bạn thấy có lỗi, đây là lỗi ngay lập tức. tại 1.230.160 chu kỳ, có thể không có lỗi ngay lập tức, nhưng dữ liệu có thể chỉ được giữ lại trong nhiều ngày.
Cyberg Ribbon

0

Giải pháp kỳ diệu - nếu bạn không muốn mã hóa những gì Cyberg Ribbon đã nói về việc đọc trước khi viết, là hàm EEPROM.update (). Nó thực hiện chính xác điều đó:

EEPROM.update (địa chỉ, giá trị);

sẽ chỉ ghi và nhấn mạnh bộ nhớ nếu giá trị khác với giá trị đã được lưu trữ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.