Saat ini saya sedang mengerjakan proyek yang melibatkan pencatatan cepat dan terus-menerus dari metrik khusus aplikasi selama masa pakai yang panjang. Untuk melakukan ini saya akhirnya menggunakan NXP M0 dan chip 32MiB SPI. Penebangan terus menerus dan perlu bertahan bertahun-tahun di lapangan (10+), dan secara berkala diperiksa oleh manusia untuk melihat kecenderungan tren. Akhirnya buffer terisi dan mulai menimpa data lama yang baik-baik saja. Saya datang dengan algoritma sederhana untuk berjalan di seluruh perangkat flash untuk menemukan kepala saat ini setelah power-up (perangkat dimatikan agak sering di luar kendali saya) sehingga logging hanya dapat melanjutkan di mana ia tinggalkan. Saya hanya bisa dengan kasar memaksa melalui jalan ini dan melakukannya dengan ~ 4 sebagai skenario terburuk.
Ini membuat saya berpikir, apakah ada sistem file log terstruktur yang melayani perangkat flash dan mikrokontroler? JFFS dan semua FS Terstruktur Log terkenal lainnya yang saya bayangkan akan sedikit berat untuk mikrokontroler sederhana (tergantung pada aplikasi tentu saja). Untuk lebih spesifik, saya ingin mengetahui algoritma apa pun yang dirancang untuk secara khusus menjadi log bundar dengan waktu pencarian cepat dan / atau apa pun yang dirancang untuk sistem file "tradisional" pada perangkat flash yang dapat dijalankan pada mikrokontroler. Tradisional dalam pengertian ini setara dengan sesuatu seperti JFFS di mana ada struktur data yang mewakili kumpulan file akses acak yang bisa berubah dalam ruang nama hierarkis.
Jawaban:
struktur data tali
Saya terpesona dengan struktur data tali. Saya memiliki proyek hobi yang mencoba mengadaptasinya ke mikrokontroler dengan hanya beberapa byte RAM yang terhubung ke memori Flash yang besar, sehingga saya dapat memasukkan dan menghapus dan dengan cara lain mengubah teks panjang variabel dalam file teks berukuran besar. File teks terlalu besar untuk masuk ke dalam RAM. Menghapus bagian terakhir file dan menulisnya kembali ke flash, digeser satu byte, setiap kali saya memasukkan atau menghapus karakter di tengah file teks multi-megabyte, akan terlalu lambat, tetapi struktur data tali dapat melakukan ini lebih cepat. Karena struktur data tali dapat mewakili file panjang variabel akses acak yang dapat berubah seperti potongan panjang tetap yang tidak dapat diubah, tampaknya cocok untuk memori flash - semua pengeditan ditulis dengan cara seperti log bundar. Sayangnya, semua bug belum berhasil di kode saya. :-(
log kronologis tetap-panjang
Saya memang membuat sistem log bundar yang sama bekerja, untuk produk yang saya bantu kembangkan.
Saya hanya menulis catatan panjang tetap satu demi satu, mengisi flash sebagai array melingkar.
(Dengan flash yang benar-benar kosong, saya mulai menulis catatan sekitar 3 blok sebelum akhir array, sehingga saya dapat menguji bungkus melingkar setelah hanya beberapa catatan data yang disimpan, daripada mulai dari catatan nol dan menunggu nilai data sebulan untuk ditulis sebelum mengetahui bahwa ada bug dalam kode bungkus saya).
Saya memastikan selalu ada setidaknya 2 "blok terhapus" yang siap untuk ditulis. Setelah menulis catatan, jika hanya ada 2 "blok terhapus" setelah itu kosong, saya tanpa syarat menghapus blok data tertua - blok ke-3 data tertua setelah 2 "blok dihapus". (Mendekati akhir memori flash, "setelah" berarti "membungkus ke awal memori flash). (Mungkin satu blok terhapus akan memadai - Saya lupa mengapa saya pikir saya perlu setidaknya 2 dan kadang-kadang 3) .
Saya lupa persis berapa banyak catatan yang saya masukkan ke dalam setiap "blok hapus", tetapi saya memastikan bahwa saya tidak pernah memiliki catatan yang mengangkangi dua blok hapus - 2 byte pertama dari setiap blok hapus flash adalah nilai "terhapus" 0xFFFF, atau dua byte pertama dari checksum Fletcher-16 (yang tidak pernah 0xFFFF) di header setiap record.
Itu membuatnya cepat untuk memindai pada saat itu dihidupkan dan menemukan kepala log melingkar - Saya hanya harus melihat dua byte pertama dari setiap blok hapus untuk membedakan antara blok "dihapus" dan "data". (Saya sedikit khawatir tentang "kegagalan daya di tengah menghapus blok" yang menyebabkan dua byte pertama dihapus ke 0xFFFF tetapi meninggalkan byte yang tidak terhapus di tengah blok, jadi saya menulis kode untuk mikrokontroler untuk memeriksa untuk ini dan mulai ulang proses "hapus blok").
Tolong beritahu saya jika Anda menemukan struktur data flash-friendly lain atau sistem file.
sumber
Sudah beberapa tahun tetapi saya ingin menindaklanjuti hal ini kalau-kalau ada yang berkeliaran. Sepertinya ada beberapa proyek saat ini, yang dikelola secara aktif (per Januari 2020) yang merupakan filesystem yang ditujukan untuk mikrokontroler yang ditargetkan pada flash NOR SPI.
Perhatikan bahwa saya belum menguji ini dalam kapasitas apa pun, tetapi mereka melakukan persis apa yang dicari oleh pertanyaan aslinya: "... struktur data yang mewakili kumpulan file akses acak yang dapat diubah ..."
https://github.com/ARMmbed/littlefs - Dibuat oleh ARM, berlisensi BSD
https://github.com/joembedded/JesFs - Tampaknya tidak berlisensi, tetapi sangat khusus dirancang untuk SPI NOR flash.
sumber