Bagaimana cara melindungi kartu SD dari kegagalan daya yang tidak terduga?

18

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?

PICYourBrain
sumber
2
Jika Anda beralih ke flash NAND mentah dengan sistem file minimal, Anda dapat menelusuri banyak lapisan abstraksi yang saat ini menghambat kemampuan Anda untuk melakukan penulisan kecil, dan kemungkinan mendapatkan kemampuan untuk melakukan penulisan blok parsial segera setelah data tersedia. Anda juga akan memiliki perlindungan terhadap pengguna akhir yang mengganti kartu dengan detail kinerja yang berbeda (bahkan mungkin pasar abu-abu marjinal) di ujung jalan.
Chris Stratton

Jawaban:

16

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

  • Tutup catu daya besar akan memberi Anda 10 ms atau lebih untuk menyelesaikan semuanya dengan kartu SD, tetapi jangan tekan keberuntungan Anda. Gunakan pin pada mikrokontroler Anda untuk melihat apakah sumber listrik Anda masih bagus, dan jangan mulai menulis jika sumber Anda mati.
W5VO
sumber
Terimakasih atas infonya. Sangat membantu. Saya akan lihat apa yang bisa saya lakukan dengan itu ...
PICyourBrain
Menurut Anda, berapa lama yang dibutuhkan untuk menulis semua nol ke kartu 4GB? Sepertinya sudah lama sekali. Juga, apakah Anda memiliki contoh kode yang dapat Anda bagikan untuk memodifikasi fungsi fswrite untuk memungkinkan seluruh penulisan ke seluruh sektor?
PICYourBrain
Juga, jika Anda menulis semua nol ke file. Bagaimana Anda melacak di mana akhir data aktual Anda? Apakah Anda baru saja membaca semua data di awal dan menemukan string nol?
PICYourBrain
1
Jika Anda menggunakan FAT16, saya yakin Anda terbatas pada 2GB. Saya percaya kartu SD / MMC memiliki fungsi "hapus blok", yang tampaknya tidak diterapkan di perpustakaan MDDFS. Saya menggunakan pustaka kode berpemilik untuk proyek kartu SD saya, jadi saya tidak bisa membagikan contoh kode apa pun. Untuk menemukan data terakhir, Anda harus membaca sampai Anda menemukan semua 0 dalam catatan data. Jika catatan data Anda semua 0, saya sarankan menambahkan beberapa data bukan nol, atau semacam pembatas.
W5VO
6

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.

supercat
sumber
Itu komentar yang sangat mendalam.
fred basset
5

Saya juga menyarankan menggunakan semacam checksum untuk memverifikasi data pada SD sudah benar setiap kali perlu dibaca.

sybreon
sumber
3

Mungkin supercapacitor di Sparkfun ini akan menyelesaikan masalah.

pingswept
sumber
2
Itu akan menyimpan memori dari PIC, tetapi memiliki peringkat arus 10uA max. Saya tidak berpikir Anda bisa menulis ke kartu SD pada saat ini.
W5VO
1
Konsepnya bagus. Sebuah pencarian cepat menemukan Illinois Capacitor ( illinoiscapacitor.com ) memiliki supercapacitor hingga 8 F dan mampu mendukung arus hingga 4 A. Menambahkan salah satu dari ini, atau baterai, akan memberikan mikro kesempatan untuk menyelesaikan menulis dan menutup semuanya. baik jika sumber daya utama gagal.
The Photon
3

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?

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.

J. Polfer
sumber
1

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)

mba7
sumber