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?
Odpowiedzi:
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
źródło
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.
źródło
Sugerowałbym również użycie jakiejś sumy kontrolnej, aby sprawdzić, czy dane na karcie SD są poprawne, ilekroć trzeba ją odczytać.
źródło
Być może ten superkondensator w Sparkfun rozwiązałby problem.
źródło
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ę.
źródło
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).
źródło