Làm cách nào để bảo vệ thẻ SD trước sự cố mất điện đột xuất?


18

Tôi đang làm việc trên một thiết bị sử dụng thư viện MDDFS của Microchip để lưu trữ dữ liệu vào thẻ SD. Trình ghi nhật ký sẽ ghi dữ liệu với tốc độ tối đa 1 mục (56byte) mỗi phút. Vấn đề là thiết bị có thể bị mất điện bất cứ lúc nào, có khả năng ở giữa một chuỗi ghi. Tôi tự hỏi đâu là cách tốt nhất để bảo vệ dữ liệu của tôi chống lại tham nhũng. Tôi đã thấy rằng nếu tệp bị mở khi mất nguồn, tất cả dữ liệu được ghi vào tệp sau lần đóng tệp cuối cùng sẽ bị mất. Tôi không biết điều tương tự có đúng không nếu mất điện ở giữa trình tự ghi.

Vì quy trình ghi không xảy ra rất thường xuyên nên tôi có thể mở tệp, ghi dữ liệu và sau đó đóng tệp, mỗi khi dữ liệu được ghi. Cách tiếp cận này sẽ làm hỏng thẻ sd theo thời gian?

Một cách tiếp cận khác có thể là giữ cho tệp được mở nhưng cứ sau 10 hoặc 50 lần ghi tôi có thể đóng tệp và sau đó mở lại.

Tôi cũng có thể đệm dữ liệu trong bộ nhớ, sau đó thỉnh thoảng xóa dữ liệu có thể sau một kbyte hoặc hơn.

Ý tưởng cuối cùng tôi có là, trong mạch của mình, tôi có thể thêm một tụ điện lớn sẽ cung cấp năng lượng cho thẻ pic / sd của mình đủ lâu sau khi ngắt nguồn để nhanh chóng đóng tệp. Vấn đề với phương pháp này là thời gian cần thiết để đóng tệp và / hoặc lưu dữ liệu rất không nhất quán. Theo hiểu biết của tôi, thời gian này rất có thể phụ thuộc vào vị trí hiện tại trong một trang flash mà tập tin đang ở.

Dù sao, các bạn sẽ đề nghị gì?


2
Nếu bạn chuyển sang flash NAND thô với hệ thống tệp tối thiểu, bạn có thể truy cập nhiều lớp trừu tượng hiện đang cản trở khả năng thực hiện ghi nhỏ của bạn và có khả năng đạt được khả năng ghi khối một phần ngay lập tức khi dữ liệu có sẵn. Bạn cũng sẽ được bảo vệ chống lại người dùng cuối thay thế thẻ với các chi tiết hiệu suất khác nhau (thậm chí có thể là thị trường xám cận biên).
Chris Stratton

Câu trả lời:


16

Một vài điều có thể xảy ra khi bạn ghi dữ liệu vào một tệp. Tôi sẽ mô tả trình tự cần xảy ra để dữ liệu được an toàn, không nhất thiết phải là các cuộc gọi thư viện.

Khi bạn viết và thêm vào cuối tệp (chế độ ghi bình thường), bạn đọc khối cuối cùng của tệp vào bộ nhớ, sửa đổi nó bằng dữ liệu ghi của bạn, sau đó ghi lại toàn bộ khối vào thẻ SD . Nếu khối đầy, thì phải tìm một khối mới trong Bảng phân bổ tệp (FAT). Sau khi tìm thấy một khối mới, FAT phải được cập nhật, đó là một chu trình đọc-sửa-ghi. Nếu chúng ta đã hoàn thành với tệp, thì chúng ta cần cập nhật các thuộc tính tệp (chẳng hạn như độ dài tệp) trong thư mục gốc, điều này gây ra một chu trình đọc-sửa đổi-ghi khác.

Giảm thiểu thời gian viết của bạn

  • Đảm bảo rằng tệp đã giữ dữ liệu của bạn khi bạn viết một sector. Nếu bạn bắt đầu với một tệp lớn và ghi đè lên dữ liệu thay vì nối thêm dữ liệu, dữ liệu sẽ được an toàn ngay khi quá trình ghi thẻ SD kết thúc. Bạn có thể loại bỏ một đến hai chu kỳ đọc-sửa-ghi theo cách đó. Mã khởi động của tôi sẽ ghi 0 'vào một tệp theo gia số của ngành cho đến khi thẻ SD đầy, sau đó tua lại vào đầu tệp.

  • Tạo kích thước của các mục nhập dữ liệu của bạn sao cho số lượng mục nhập phù hợp trong một khu vực. Tôi sẽ tăng các mục của bạn lên 64 byte. Mặc dù điều này kém hiệu quả hơn, nhưng nó sẽ khiến bạn không cần phải đọc-sửa đổi-ghi hai lĩnh vực.

  • Tạo một biến thể của hàm FSwrite cho phép bạn viết toàn bộ các lĩnh vực. Nếu bạn giữ toàn bộ khu vực trong SRAM, thì chu trình của bạn sẽ chuyển từ "đọc-sửa đổi-ghi" sang "sửa đổi-ghi"

Giữ nguồn PIC và SD của bạn càng lâu càng tốt

  • Tụ lớn là tốt. 470uF sẽ cung cấp cho bạn nhiều năng lượng hơn đủ để hoàn thành một chu kỳ ghi.

  • Hãy chắc chắn rằng nguồn năng lượng của bạn sẽ không hút nguồn điện từ tụ điện dự phòng của bạn! Thêm một diode nếu cần thiết.

Biết khi nào bạn mất điện

  • Một nắp cung cấp năng lượng lớn sẽ cung cấp cho bạn 10ms trở lên để bọc mọi thứ bằng thẻ SD, nhưng đừng nhấn vào vận may của bạn. Sử dụng ghim trên vi điều khiển của bạn để xem nguồn điện của bạn có còn tốt không và không bắt đầu ghi nếu nguồn của bạn đã chết.

Cảm ơn bạn về thông tin. Rất hữu ích. Tôi sẽ xem những gì tôi có thể làm với nó ...
PICyourBrain

Bạn nghĩ sẽ mất bao lâu để ghi tất cả số không vào thẻ 4gb? Có vẻ như một thời gian dài. Ngoài ra, bạn có bất kỳ ví dụ mã nào bạn có thể chia sẻ để sửa đổi hàm fswrite để cho phép ghi toàn bộ cho toàn bộ các ngành không?
PICyourBrain

Ngoài ra, nếu bạn viết tất cả số không vào tệp. Làm thế nào để bạn theo dõi nơi kết thúc của dữ liệu thực tế của bạn? Bạn chỉ cần đọc tất cả các dữ liệu lúc đầu và tìm chuỗi số không?
PICyourBrain

1
Nếu bạn đang sử dụng FAT16, tôi tin rằng bạn bị giới hạn ở mức 2GB. Tôi tin rằng thẻ SD / MMC có chức năng "xóa khối", dường như không được triển khai trong thư viện MDDFS. Tôi đã sử dụng thư viện mã độc quyền cho dự án thẻ SD của mình, vì vậy tôi không thể chia sẻ bất kỳ ví dụ mã nào. Để tìm dữ liệu cuối cùng, bạn cần đọc cho đến khi tìm thấy tất cả 0 trong một bản ghi dữ liệu. Nếu bản ghi dữ liệu của bạn có thể là tất cả 0, tôi khuyên bạn nên thêm vào một số dữ liệu khác không hoặc một dấu phân cách của một số loại.
W5VO

6

Một vấn đề chưa được đề cập với thẻ SD (hoặc MMC, CompactFlash, v.v.) là trong khi thẻ SD có thể xuất hiện với máy chủ như một bộ sưu tập đơn giản gồm các cung 512 byte có thể được đọc và ghi theo thứ tự tùy ý, các thiết bị flash nói chung lưu trữ các trang 528 byte trong các nhóm có dung lượng 32KB nếu không lớn hơn mỗi trang và các thao tác duy nhất được hỗ trợ là ghi vào một trang trống khác hoặc xóa toàn bộ nhóm. Để giải quyết giới hạn này, bộ điều khiển trên thẻ SD sẽ giữ một bảng cho phép bất kỳ khu vực logic nào được ánh xạ tới bất kỳ trang vật lý nào. Khi một yêu cầu được thực hiện để viết một khu vực, bộ điều khiển sẽ tìm thấy một trang trống ở đâu đó trên chip và cập nhật ánh xạ với địa chỉ mới của khu vực được đề cập. Nếu các trang trống nhận được nguồn cung khan hiếm, hoặc tại các thời điểm khác,

Điều quan trọng của việc này là hành động viết cho một lĩnh vực logic cụ thể có thể yêu cầu xáo trộn xung quanh dữ liệu từ nhiều lĩnh vực logic. Nếu có sự cố xảy ra trong quy trình đó, nó có thể dẫn đến tham nhũng của bất kỳ khu vực tùy tiện nào - không chỉ khu vực mà thẻ được yêu cầu viết. Một bộ điều khiển thẻ SD tốt phải được thiết kế để thực hiện các thao tác xáo trộn dữ liệu theo cách nếu mất điện trong quá trình xáo trộn dữ liệu, nó sẽ có thể tìm ra phần nào của hoạt động đã hoàn thành và phần nào không, và do đó có thể kết thúc hoạt động đúng. Thật không may, tôi không biết làm thế nào người ta có thể biết liệu thẻ SD $ 5 mà một người nhặt được tại một cửa hàng giảm giá sẽ có ích gì trong vấn đề đó hay không.

Để chắc chắn, ngay cả khi thẻ SD hoàn toàn hoàn hảo từ quan điểm đảm bảo rằng mọi thao tác ghi được báo cáo là đã hoàn thành, trên thực tế, sẽ tồn tại khi mất điện (nghĩa là đảm bảo rằng có hay không tất cả công việc ghi sẽ gây ra là hoàn tất, đủ để thẻ hoàn thành hoạt động khi cấp điện trở lại) điều đó không có nghĩa là hệ điều hành máy chủ sẽ không gặp sự cố nếu nó thực hiện một số nhưng không phải tất cả dữ liệu ghi. Tuy nhiên, điều quan trọng là phải nhớ rằng nếu thẻ SD không thể duy trì hết "món hời", thì không thể làm gì trên phần mềm phía máy chủ để ngăn ngừa mất dữ liệu do mất điện.


Đó là một nhận xét rất sâu sắc.
fret basset

5

Tôi cũng sẽ đề nghị sử dụng một số loại tổng kiểm tra để xác minh dữ liệu trên SD là chính xác bất cứ khi nào cần đọc.


3

Có lẽ siêu tụ điện này tại Sparkfun sẽ giải quyết vấn đề.


2
Nó sẽ giữ bộ nhớ của PIC, nhưng nó có xếp hạng tối đa 10uA. Tôi không nghĩ rằng bạn có thể ghi vào thẻ SD trên dòng điện đó.
W5VO

1
Khái niệm này là tốt mặc dù. Một cuộc tìm kiếm nhanh đã tìm thấy Tụ điện Illinois ( illinoiscapacitor.com ) có siêu tụ điện lên tới 8 F và có thể hỗ trợ dòng điện lên đến 4 A. Thêm một trong số này, hoặc pin, sẽ cho vi mô có cơ hội hoàn thành việc ghi và tắt mọi thứ độc đáo nếu nguồn năng lượng chính không thành công.
Photon

3

Vì quy trình ghi không xảy ra rất thường xuyên nên tôi có thể mở tệp, ghi dữ liệu và sau đó đóng tệp, mỗi khi dữ liệu được ghi. Cách tiếp cận này sẽ làm hỏng thẻ sd theo thời gian?

Như với bất kỳ vấn đề kỹ thuật nào, bạn sẽ cần phải đối phó với sự đánh đổi ở đây.

Có quan trọng rằng không có dữ liệu bị mất ở tất cả? Sau đó, tôi sẽ làm như trên. Bạn sẽ bị thiệt hại nhiều hơn do mất dữ liệu hơn là làm hỏng thẻ. Bạn có thể muốn thực hiện một bài kiểm tra căng thẳng, để xác định số lần bạn có thể thực hiện thao tác đó trước khi thẻ bị hỏng. Nếu bạn cảm thấy thoải mái với khoảng thời gian trước khi thẻ trở nên không thể sử dụng được và dường như đó là khoảng thời gian chấp nhận được trước khi đổi thẻ, tôi sẽ đi theo lộ trình đó.


1

Nếu bạn muốn lưu trữ dữ liệu thì không cần hệ thống tập tin. thao tác ghi sẽ được thực hiện trực tiếp qua SPI bằng cách chọn địa chỉ khối. bằng cách đó bạn giảm thiểu thời gian viết và bạn có nguy cơ bị hỏng dữ liệu.

Ngay cả trong trường hợp mất điện và không gặp may, bạn sẽ chỉ mất một mục (có thể chấp nhận được trên một số hệ thống).

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.