Saya bekerja pada perangkat yang menggunakan perpustakaan Microchip MDDFS untuk menyimpan data ke kartu SD. Logger akan mencatat data pada kecepatan maksimum 1 entri (56bytes) setiap menit. Masalahnya adalah perangkat dapat kehilangan daya setiap saat, berpotensi di tengah urutan penulisan. Saya bertanya-tanya apa cara terbaik untuk melindungi data saya dari korupsi. Saya telah menemukan bahwa jika file terbuka ketika daya hilang, semua data yang ditulis ke file setelah penutupan file terakhir hilang. Saya tidak tahu apakah hal yang sama berlaku jika daya hilang di tengah urutan penulisan.
Karena prosedur penulisan tidak sering terjadi, saya dapat membuka file, menulis data, dan kemudian menutup file, setiap kali data dicatat. Apakah pendekatan ini akan merusak kartu sd dari waktu ke waktu?
Pendekatan lain mungkin untuk menjaga file tetap terbuka tetapi setelah setiap 10 atau 50 menulis saya bisa menutup file dan kemudian buka kembali.
Saya juga bisa buffer data dalam memori, kemudian menyiram data sesekali mungkin setelah sekitar satu kbyte.
Ide terakhir yang saya miliki adalah, di sirkuit saya, saya bisa menambahkan kapasitor besar yang akan memberikan daya ke kartu pic / sd saya cukup lama setelah daya terputus untuk dengan cepat menutup file. Masalah dengan pendekatan ini adalah waktu yang diperlukan untuk menutup file dan / atau menyimpan data sangat tidak konsisten. Dari pemahaman saya, kali ini bisa sangat tergantung pada tempat saat ini di halaman flash tempat file tersebut berada.
Ngomong-ngomong, apa yang akan kalian sarankan?
Jawaban:
Beberapa hal dapat terjadi ketika Anda menulis data ke file. Saya akan menjelaskan urutan yang perlu terjadi agar data aman, belum tentu panggilan perpustakaan.
Saat Anda menulis, dan menambahkan ke akhir file (mode tulis normal), Anda membaca blok terakhir file ke dalam memori, memodifikasinya dengan data tulis Anda, dan kemudian menulis seluruh blok kembali ke kartu SD . Jika blok sudah penuh, maka blok baru harus ditemukan di Tabel Alokasi File (FAT). Setelah menemukan blok baru, FAT harus diperbarui, yang merupakan siklus baca-modifikasi-tulis. Jika kita selesai dengan file, maka kita perlu memperbarui atribut file (seperti panjang file) di direktori root, yang menyebabkan siklus baca-modifikasi-tulis yang lain.
Meminimalkan waktu menulis Anda
Pastikan file sudah memegang data Anda saat Anda menulis sektor. Jika Anda memulai dengan file besar dan menimpa data alih-alih menambahkan data, data akan aman segera setelah penulisan sektor kartu SD selesai. Anda dapat menghilangkan satu hingga dua siklus baca-modifikasi-tulis dengan cara itu. Kode permulaan saya akan menulis 0 ke file dalam peningkatan sektor sampai kartu SD penuh, dan kemudian mundur ke awal file.
Buat ukuran entri data Anda sedemikian rupa sehingga jumlah entri integer cocok di suatu sektor. Saya akan menambah entri Anda menjadi 64 byte. Walaupun ini kurang efisien, ini akan mencegah Anda dari perlu membaca-memodifikasi-menulis dua sektor.
Buat varian fungsi FSwrite yang memungkinkan Anda untuk menulis seluruh sektor. Jika Anda menyimpan seluruh sektor dalam SRAM, maka siklus Anda berubah dari "baca-modifikasi-tulis" menjadi "modifikasi-tulis"
Tetap aktifkan daya PIC dan SD Anda selama mungkin
Kapasitor besar baik. 470uF harus memberi Anda kekuatan lebih dari cukup untuk menyelesaikan siklus tulis.
Pastikan sumber listrik Anda tidak akan menyedot daya dari kapasitor cadangan Anda! Tambahkan dioda jika perlu.
Ketahui kapan Anda kehabisan daya
sumber
Salah satu masalah yang belum disebutkan dengan kartu SD (atau MMC, CompactFlash, dll.) Adalah bahwa sementara kartu SD mungkin muncul ke host sebagai kumpulan sederhana sektor 512-byte yang dapat dibaca dan ditulis dalam urutan acak, perangkat flash umumnya menyimpan 528 byte halaman dalam grup yang 32KB jika tidak masing-masing lebih besar, dan satu-satunya operasi yang didukung adalah menulis ke halaman yang kosong, atau menghapus seluruh grup. Untuk mengatasi batasan ini, pengontrol pada kartu SD akan menyimpan tabel yang akan memungkinkan setiap sektor logis untuk dipetakan ke halaman fisik apa pun. Ketika permintaan dibuat untuk menulis suatu sektor, pengontrol akan menemukan halaman kosong di suatu tempat di chip dan memperbarui pemetaan dengan alamat baru dari sektor tersebut. Jika halaman kosong menjadi langka, atau di berbagai waktu lain,
Arti penting dari ini adalah bahwa tindakan menulis ke sektor logis tertentu mungkin memerlukan pengocokan data dari banyak sektor logis. Jika ada yang tidak beres dalam proses itu, hal itu dapat mengakibatkan korupsi pada sektor apa pun yang sewenang-wenang - bukan hanya sektor yang diminta untuk ditulis oleh kartu. Pengontrol kartu SD yang baik harus dirancang untuk melakukan operasi pengocokan data sedemikian rupa sehingga jika daya hilang selama pengocokan data, ia akan dapat mengetahui bagian mana dari operasi yang telah selesai dan yang belum, dan akibatnya dapat menyelesaikan operasi dengan benar. Sayangnya, saya tidak tahu bagaimana orang dapat mengetahui apakah kartu SD $ 5 yang diambil di toko diskon akan ada gunanya dalam hal itu.
Yang pasti, bahkan jika kartu SD benar-benar sempurna dari sudut pandang memastikan bahwa setiap operasi penulisan yang dilaporkan telah selesai akan, pada kenyataannya, selamat dari kegagalan daya (yaitu memastikan apakah semua pekerjaan menulis atau tidak akan menyebabkan selesai, cukup telah menyelesaikan bahwa kartu akan menyelesaikan operasi ketika daya diterapkan kembali) itu tidak berarti sistem operasi host tidak akan mengalami masalah jika melakukan beberapa tetapi tidak semua data yang ditulisnya bermaksud. Meskipun demikian, penting untuk diingat bahwa jika kartu SD tidak dapat menegakkan akhir dari "tawar-menawar", tidak ada yang dapat dilakukan pada perangkat lunak sisi host untuk mencegah kehilangan data dari kegagalan daya.
sumber
Saya juga menyarankan menggunakan semacam checksum untuk memverifikasi data pada SD sudah benar setiap kali perlu dibaca.
sumber
Mungkin supercapacitor di Sparkfun ini akan menyelesaikan masalah.
sumber
Seperti halnya masalah teknik, Anda harus berurusan dengan pertukaran di sini.
Apakah penting agar tidak ada data yang hilang sama sekali? Maka saya akan melakukan di atas. Anda akan mengalami lebih banyak kerusakan dengan kehilangan data daripada dengan merusak kartu. Anda mungkin ingin melakukan tes stres, semacamnya, untuk menentukan berapa kali Anda dapat melakukan operasi itu sebelum kartu menjadi rusak. Jika Anda keren dengan lamanya waktu yang dibutuhkan sebelum kartu menjadi tidak dapat digunakan, dan tampaknya menjadi waktu yang dapat diterima sebelum mengganti kartu, saya akan pergi dengan rute itu.
sumber
Jika Anda hanya ingin menyimpan data, tidak perlu sistem file. operasi penulisan akan dilakukan secara langsung melalui SPI dengan memilih alamat blok. dengan melakukan itu Anda meminimalkan waktu menulis dan Anda risiko korupsi data.
Bahkan dalam kasus kehilangan daya dan tidak beruntung, Anda akan kehilangan hanya satu entri (yang mungkin diterima pada beberapa sistem)
sumber