2010-08-23 29 views
9

Gần đây tôi đã thiết lập nhu cầu lưu các biến cấu hình không thường xuyên cập nhật trong EEPROM của một vi điều khiển. Thêm nhà nước đối với chương trình ngay lập tức buộc một lo lắng vềLưu trữ và truy cập an toàn EEPROM

  • phát hiện các dữ liệu chưa được khởi tạo trong EEPROM (tức là khởi động đầu tiên),
  • chuyển đổi hoặc làm vô hiệu dữ liệu từ phiên bản firmware cũ, và
  • giải quyết của nhiều cấu trúc, mỗi cái có thể phát triển trong bản cập nhật chương trình cơ sở.

Googling mở rộng chỉ bật lên một bài viết có địa chỉ keeping your EEPROM data valid through firmware updates. Có ai đã sử dụng cách tiếp cận được thảo luận trong bài viết đó không? Có cách tiếp cận thay thế tốt hơn không?

Trả lời

7

Cá nhân, tôi thích định dạng "bảng được gắn thẻ".

Ở định dạng này, dữ liệu của bạn được chia thành một loạt "bảng". Mỗi bảng có một tiêu đề theo định dạng có thể dự đoán được và một cơ thể có thể thay đổi khi bạn cần nó.

Dưới đây là một ví dụ về những gì một trong các bảng sẽ trông như thế:

Byte 0: Table Length (in 16-bit words) 
Byte 1: Table ID  (used by firmware to determine what this data is) 
Byte 2: Format Version (incremented every time the format of this table changes) 
Byte 3: Checksum  (simple sum-to-zero checksum) 
Byte 4: Start of body 
... 
Byte N: End of body 

Tôi đã không lưu trữ rất nhiều dữ liệu, vì vậy tôi sử dụng một byte duy nhất cho từng lĩnh vực trong tiêu đề. Bạn có thể sử dụng bất kỳ kích thước nào bạn cần, miễn là bạn không bao giờ thay đổi nó. Các bảng dữ liệu được viết một cái khác vào EEPROM.

Khi chương trình cơ sở của bạn cần đọc dữ liệu từ EEPROM, chương trình bắt đầu đọc ở bảng đầu tiên. Nếu phần mềm nhận ra ID bảng và hỗ trợ phiên bản bảng được liệt kê, nó sẽ tải dữ liệu ra khỏi phần thân của bảng (sau khi xác thực kiểm tra, tất nhiên). Nếu ID, phiên bản hoặc tổng kiểm tra không kiểm tra, bảng sẽ bị bỏ qua. Trường độ dài được sử dụng để định vị bảng tiếp theo trong chuỗi. Khi chương trình cơ sở nhìn thấy một bảng có độ dài bằng 0, nó biết rằng nó đã đến cuối dữ liệu và không có nhiều bảng để xử lý.

Tôi thấy định dạng này linh hoạt (tôi có thể thêm bất kỳ loại dữ liệu nào vào phần thân của bảng) và mạnh mẽ (giữ nguyên định dạng tiêu đề và bảng dữ liệu sẽ tương thích về phía trước và ngược).

Có một vài cảnh báo, mặc dù chúng không quá nặng nề. Trước tiên, bạn cần đảm bảo rằng chương trình cơ sở của bạn có thể xử lý trường hợp dữ liệu quan trọng không có trong bảng hoặc đang sử dụng phiên bản định dạng không được hỗ trợ. Bạn cũng sẽ cần phải khởi tạo byte đầu tiên của vùng lưu trữ EEPROM bằng không (vì vậy mà trên lần khởi động đầu tiên, bạn không bắt đầu tải trong thùng rác nghĩ rằng đó là dữ liệu của nó). Vì mỗi bảng biết chiều dài của nó, có thể mở rộng hoặc thu nhỏ một bảng; Tuy nhiên, bạn phải di chuyển phần còn lại của vùng lưu trữ bảng xung quanh để đảm bảo rằng không có "lỗ hổng" (nếu toàn bộ chuỗi bảng không thể vừa với bộ nhớ của thiết bị thì quá trình này có thể gây khó chịu). Cá nhân, tôi không tìm thấy bất kỳ vấn đề nào trong số này là vấn đề lớn, và nó cũng đáng để tôi lưu lại bằng cách sử dụng một số phương pháp lưu trữ dữ liệu khác.

+0

Điều này nghe có vẻ giống như một giải pháp tuyệt vời để đối phó với những thay đổi về kích thước bảng giữa các phiên bản phần mềm. Bạn có lời khuyên nào để làm cho nó khoan dung với việc mất năng lượng giữa ghi bên cạnh việc sao chép dữ liệu? –

+2

Viết toàn bộ bảng bằng tổng kiểm tra không hợp lệ, sau đó (trong một giao dịch riêng) quay lại và viết tổng kiểm tra chính xác. Nếu có vấn đề giữa ghi, kiểm tra của bạn sẽ sai khi bạn đọc dữ liệu. – bta

+0

Đó là một giải pháp thanh lịch không đáng kể để thực hiện: cảm ơn bạn đã theo dõi. –

3

Nigel Jones đã đề cập đến một số thông tin cơ bản để bạn tham khảo. Có rất nhiều lựa chọn thay thế.

Một lựa chọn thay thế, trong số các bạn có nhiều chỗ, lưu trữ các cặp khóa-giá trị thay vì cấu trúc. Sau đó, bạn có thể cập nhật một giá trị (bằng cách thêm nó) mà không xóa tất cả mọi thứ. Điều này hữu ích nhất trong các thiết bị có số lần xóa giới hạn. Thói quen đọc của bạn sẽ cần phải quét từ đầu, cập nhật các giá trị mỗi khi gặp phải khóa.Tất nhiên, thói quen cập nhật của bạn sẽ cần phải có một "bộ thu gom rác" sẽ khởi động khi bộ nhớ đầy.

Để xử lý lỗi thiết bị và nguồn điện ở giữa các bản cập nhật, chúng tôi thường lưu trữ nhiều bản sao của dữ liệu. Cách tiếp cận đơn giản nhất là pingpong giữa một nửa số thiết bị sử dụng số thứ tự để xác định cái nào mới hơn. CRC trên mỗi phần được sử dụng để xác thực nó. Điều này cũng giải quyết vấn đề dữ liệu chưa được khởi tạo.

Đối với phiên bản khóa-giá trị bạn cần phải thêm CRC mới sau mỗi lần viết.

+0

Tôi thực sự thích âm thanh của phương pháp này trong lý thuyết, nhưng tiếc là không có đủ EEPROM có sẵn để làm cho nó khả thi: chỉ 1 kB trên một ATmega328p. Cảm ơn bạn đã mô tả! –

Các vấn đề liên quan