Jak chronić kartę SD przed nieoczekiwanymi awariami zasilania?

18

Pracuję na urządzeniu, które korzysta z biblioteki Microchip MDDFS do przechowywania danych na karcie SD. Rejestrator rejestruje dane z maksymalną szybkością 1 wpisu (56 bajtów) co minutę. Problem polega na tym, że urządzenie może stracić moc w dowolnym momencie, potencjalnie w środku sekwencji zapisu. Zastanawiam się, jaki jest najlepszy sposób ochrony moich danych przed korupcją. Odkryłem, że jeśli plik jest otwarty po utracie zasilania, wszystkie dane, które zostały zapisane w pliku po ostatnim zamknięciu pliku, są tracone. Nie wiem, czy to samo odnosi się do utraty mocy w środku sekwencji zapisu.

Ponieważ procedura zapisu nie zdarza się zbyt często, mogłem otworzyć plik, zapisać dane, a następnie zamknąć plik za każdym razem, gdy dane są rejestrowane. Czy takie podejście z czasem uszkodzi kartę SD?

Innym podejściem może być pozostawienie pliku otwartego, ale po każdych 10 lub 50 zapisach mógłbym zamknąć plik, a następnie ponownie go otworzyć.

Mógłbym również buforować dane w pamięci, a następnie od czasu do czasu opróżniać dane, może po kbajtach.

Ostatnim pomysłem było to, że w moim obwodzie mogłem dodać duży kondensator, który zapewniłby zasilanie mojej karcie pic / sd wystarczająco długo po odłączeniu zasilania, aby szybko zamknąć plik. Problem z tym podejściem polega na tym, że czas potrzebny do zamknięcia pliku i / lub zapisania danych jest bardzo niespójny. Z mojego zrozumienia, tym razem może być bardzo zależne od bieżącego miejsca na flashowej stronie, w której znajduje się plik.

W każdym razie, co byście zaproponowali?

PICyourBrain
źródło
2
Jeśli przełączyłeś się na surową pamięć flash NAND z minimalnym systemem plików, możesz przejść przez wiele warstw abstrakcji, które obecnie utrudniają dokonywanie małych zapisów, i prawdopodobnie zyskać możliwość wykonywania częściowych zapisów blokowych natychmiast po udostępnieniu danych. Będziesz miał również ochronę przed zamianą przez użytkownika końcowego karty o różnych szczegółach wydajności (może nawet marginalnej na szarym rynku).
Chris Stratton,

Odpowiedzi:

16

Podczas zapisywania danych do pliku może się zdarzyć kilka rzeczy. Opiszę sekwencję, która musi się zdarzyć, aby dane były bezpieczne, niekoniecznie wywołania biblioteczne.

Podczas pisania i dodawania na końcu pliku (normalny tryb zapisu) odczytujesz ostatni blok pliku do pamięci, modyfikujesz go danymi zapisu, a następnie zapisujesz cały blok z powrotem na karcie SD . Jeśli blok jest pełny, nowy blok musi zostać znaleziony w tabeli alokacji plików (FAT). Po znalezieniu nowego bloku FAT musi zostać zaktualizowany, co stanowi cykl odczytu-modyfikacji-zapisu. Jeśli skończymy z plikiem, musimy zaktualizować atrybuty pliku (takie jak długość pliku) w katalogu głównym, co powoduje kolejny cykl odczytu-modyfikacji-zapisu.

Minimalizowanie czasu pisania

  • Upewnij się, że plik już przechowuje twoje dane podczas pisania sektora. Jeśli zaczniesz od dużego pliku i zastąpisz dane zamiast dołączać dane, dane będą bezpieczne, gdy tylko zapis sektora kart SD zostanie zakończony. W ten sposób można wyeliminować jeden lub dwa cykle odczytu-modyfikacji-zapisu. Mój kod startowy zapisywałby 0 do pliku w przyrostach sektorowych, dopóki karta SD nie zostanie zapełniona, a następnie przewinie do początku pliku.

  • Dopasuj rozmiar swoich danych, tak aby liczba całkowita pasowała do sektora. Zwiększyłbym twoje wpisy do 64 bajtów. Chociaż jest to mniej wydajne, nie pozwoli ci czytać, modyfikować i zapisywać dwóch sektorów.

  • Utwórz wariant funkcji FSwrite, który pozwala pisać całe sektory. Jeśli trzymasz cały sektor w SRAM, wtedy twój cykl przechodzi z „odczytu-modyfikacji-zapisu” do „modyfikacji-zapisu”

Utrzymuj zasilanie PIC i SD tak długo, jak to możliwe

  • Duże kondensatory są dobre. 470uF powinien dać ci więcej niż wystarczającą moc, aby zakończyć cykl zapisu.

  • Upewnij się, że źródło zasilania nie wyssie energii z kondensatora rezerwowego! W razie potrzeby dodaj diodę.

Wiedz, kiedy stracisz moc

  • Duża nasadka zasilająca da ci 10 ms lub więcej, aby owinąć kartę SD, ale nie trać szczęścia. Użyj szpilki na mikrokontrolerze, aby sprawdzić, czy źródło zasilania jest nadal dobre, i nie rozpoczynaj zapisu, jeśli źródło jest martwe.
W5VO
źródło
Dzięki za informację. Bardzo pomocny. Zobaczę, co mogę z tym zrobić ...
PICyourBrain
Jak myślisz, ile czasu zajęłoby zapisanie wszystkich zer na karcie 4 GB? Wydaje się, że to długi czas. Czy masz również przykłady kodu, które możesz udostępnić do modyfikowania funkcji fswrite, aby umożliwić zapisywanie całych sektorów?
PICyourBrain
Ponadto, jeśli zapiszesz wszystkie zera do pliku. Jak śledzisz, gdzie jest koniec twoich danych? Czy po prostu czytasz wszystkie dane na początku i znajdujesz ciąg zer?
PICyourBrain
1
Jeśli korzystasz z FAT16, uważam, że jesteś ograniczony do 2 GB. Uważam, że karta SD / MMC ma funkcję „wymazywania bloków”, która nie wydaje się być zaimplementowana w bibliotece MDDFS. Użyłem zastrzeżonej biblioteki kodów dla mojego projektu karty SD, więc nie mogę udostępniać żadnych przykładów kodu. Aby znaleźć ostatnie dane, musisz przeczytać, dopóki nie znajdziesz wszystkich zer w rekordzie danych. Jeśli twój rekord danych może zawierać wszystkie zera, radzę dodać jakieś niezerowe dane lub pewnego rodzaju separator.
W5VO,
6

Jednym z problemów nie wspomnianych jeszcze w przypadku kart SD (lub MMC, CompactFlash itp.) Jest to, że chociaż karta SD może wydawać się hostowi jako prosty zbiór 512-bajtowych sektorów, które można odczytywać i zapisywać w dowolnej kolejności, urządzenia flash ogólnie przechowuj strony o długości 528 bajtów w grupach o wielkości 32 KB, jeśli nie są większe, a jedynymi obsługiwanymi operacjami są zapisywanie na pustej stronie lub usuwanie całej grupy. Aby poradzić sobie z tym ograniczeniem, kontroler na karcie SD będzie przechowywać tabelę, która pozwoli na mapowanie dowolnego sektora logicznego na dowolnej stronie fizycznej. Kiedy zostanie wysłane żądanie zapisu sektora, kontroler znajdzie gdzieś na chipie pustą stronę i zaktualizuje mapowanie nowym adresem danego sektora. Jeśli brakuje pustych stron lub w innym czasie,

Znaczenie tego polega na tym, że zapis do określonego sektora logicznego może wymagać przetasowania wokół danych z wielu sektorów logicznych. Jeśli coś pójdzie nie tak w tym procesie, może to doprowadzić do uszkodzenia dowolnego dowolnego sektora - nie tylko tego, który karta ma napisać. Dobry kontroler karty SD powinien być zaprojektowany do wykonywania operacji przetasowywania danych w taki sposób, aby w przypadku utraty zasilania podczas przetasowania danych był w stanie dowiedzieć się, które części operacji zostały zakończone, a które nie, oraz w konsekwencji być w stanie poprawnie zakończyć operację. Niestety nie mam pojęcia, jak można stwierdzić, czy karta SD o wartości 5 USD, którą odebrano w sklepie dyskontowym, będzie w tym względzie dobra.

Oczywiście, nawet jeśli karta SD jest absolutnie idealna z punktu widzenia zapewnienia, że ​​każda operacja zapisu, która została zgłoszona jako zakończona, w rzeczywistości przetrwa awarię zasilania (tj. Zapewni, że cała praca zapisu spowodowałoby, że jest zakończone, wystarczy, aby karta zakończyła operację po ponownym podłączeniu zasilania), co nie oznacza, że ​​system operacyjny hosta nie będzie miał problemów, jeśli wykona niektóre, ale nie wszystkie dane, które zamierza zapisać. Niemniej jednak należy pamiętać, że jeśli karta SD nie jest w stanie utrzymać końca „okazji”, nie można nic zrobić w oprogramowaniu po stronie hosta, aby zapobiec utracie danych z powodu awarii zasilania.

supercat
źródło
To bardzo wnikliwy komentarz.
fred basset
5

Sugerowałbym również użycie jakiejś sumy kontrolnej, aby sprawdzić, czy dane na karcie SD są poprawne, ilekroć trzeba ją odczytać.

sybreon
źródło
3

Być może ten superkondensator w Sparkfun rozwiązałby problem.

pingswept
źródło
2
Przechowuje pamięć PIC, ale ma maksymalny prąd znamionowy 10uA. Nie sądzę, żebyś mógł pisać na karcie SD przy tak dużym natężeniu.
W5VO,
1
Pomysł jest jednak dobry. Szybkie wyszukiwanie wykazało, że Illinois Capacitor ( illinoiscapacitor.com ) ma superkondensator do 8 F i jest w stanie obsłużyć prądy do 4 A. Dodanie jednego z nich lub baterii dałoby mikro szansę dokończenia zapisu i wyłączenia ładnie, jeśli główne źródło zasilania ulegnie awarii.
Photon
3

Ponieważ procedura zapisu nie zdarza się zbyt często, mogłem otworzyć plik, zapisać dane, a następnie zamknąć plik za każdym razem, gdy dane są rejestrowane. Czy takie podejście z czasem uszkodzi kartę SD?

Podobnie jak w przypadku każdego problemu inżynierskiego, tutaj musisz poradzić sobie z kompromisami.

Czy ważne jest, aby w ogóle nie utracić żadnych danych? Potem zrobiłbym powyższe. Gdybyś stracił dane, zniszczyłbyś więcej szkód niż zniszczenie karty. Możesz wykonać test warunków skrajnych, aby określić, ile razy możesz wykonać tę operację, zanim karta zostanie uszkodzona. Jeśli jesteś spoko z czasem, jaki upłynął, zanim karta stała się bezużyteczna, i wydaje się, że jest to akceptowalny czas do zmiany karty, wybrałbym tę drogę.

J. Polfer
źródło
1

Jeśli chcesz tylko przechowywać dane, nie potrzebujesz systemu plików. operacja zapisu zostanie wykonana bezpośrednio w interfejsie SPI poprzez wybranie adresu bloku. Dzięki temu minimalizujesz czas zapisu i ryzyko uszkodzenia danych.

Nawet w przypadku utraty zasilania i braku szczęścia stracisz tylko jeden wpis (co może być akceptowalne w niektórych systemach).

mba7
źródło