FROGFS (Sistem File General-hanya-baca-Hanya-Bacaan) adalah sistem file hanya-baca yang dirancang untuk penggunaan tertanam. Ini dapat dengan mudah digunakan dengan proyek CMake-termasuk ESP-IDF. Ini memiliki filter bawaan untuk menghemat ruang. File dalam frogfs-clockwise-demo dikurangi sekitar setengah menggunakan filter default. Berikut adalah tautan ke contoh repositori:
Mengubah filter meliputi:
Filter kompresi meliputi:
Transform filter dimaksudkan untuk menjadi operasi waktu kompilasi yang tidak dikenakan biaya run-time sementara filter kompresi diharapkan untuk mengeluarkan biaya dekompresi waktu run-time .
Ini berarti untuk server HTTP, zlib (deflate), brotli (BR) atau file terkompresi GZIP dapat dilewati tanpa tersentuh! Ini menghemat waktu pemrosesan dan bandwidth. Namun berhati -hatilah bahwa beberapa browser tidak menerima konten brotli http lainnya (hanya https).
Untuk menggunakan komponen ini dengan ESP-IDF, di dalam Direktori Proyek Anda
idf.py add-dependency jkent/frogfs
Embed Frogfs dalam biner proyek Anda dengan fungsi cmake yang terus berjalan:
target_add_frogfs(<target> [CONFIG yaml] [NAME name])
Jika konfigurasi tidak ditentukan, frogfs.yaml akan digunakan. Jika nama tidak ditentukan, itu akan default ke frogfs .
Sebagai contoh untuk ESP-IDF, dalam cmakelists.txt proyek Anda: Proyek Anda:
cmake_minimum_required ( VERSION 3.16)
include ( $ENV{IDF_PATH} /tools/cmake/project.cmake)
project (my_project)
target_add_frogfs( ${PROJECT_NAME} .elf)Di C, ini menghasilkan dua simbol global ini tersedia untuk aplikasi Anda:
extern const uint8_t frogfs_bin [];
extern const size_t frogfs_bin_len ; Anda memiliki opsi untuk membuat biner tanpa menautkannya dengan aplikasi Anda. Fungsi CMake disediakan untuk mengeluarkan biner dengan target generate_${name} .
declare_frogfs_bin(path [CONFIG yaml] [NAME name])
Jika konfigurasi tidak ditentukan, frogfs.yaml digunakan. Jika nama tidak ditentukan, frogfs digunakan.
Berikut adalah contoh dari apa yang dapat Anda tambahkan ke cmakelists toplevel Anda.
set (FROGFS_NAME frogfs)
declare_frogfs_bin( NAME ${FROGFS_NAME} )
idf_component_get_property(main_args esptool_py FLASH_ARGS)
idf_component_get_property(sub_args esptool_py FLASH_SUB_ARGS)
esptool_py_flash_target( ${FROGFS_NAME} -flash " ${main_args} " " ${sub_args} " ALWAYS_PLAINTEXT)
esptool_py_flash_to_partition( ${FROGFS_NAME} -flash storage ${BUILD_DIR} /CMakeFiles/ ${FROGFS_NAME} .bin)
add_dependencies ( ${FROGFS_NAME} -flash generate_ ${FROGFS_NAME} _bin) Anda dapat memohon proses flash dengan menjalankan idf.py frogfs-flash .
Frogfs mengharapkan file konfigurasi YAML. Ada 3 bagian yang berbeda: Tentukan, kumpulkan dan filter. Semua kecuali mengumpulkan adalah opsional.
Tentukan adalah daftar atau dikte definisi variabel. Ada 2 variabel yang telah ditentukan: $cwd dan $frogfs . Anda juga dapat merujuk variabel lingkungan dengan sintaks ${ENV:varname} .
Kumpulkan file dan direktori 'kumpulan' dan tempatkan di root Frogfs. Pola Glob diperbolehkan dalam komponen 'nama' jalur. Ada 3 cara untuk menentukan sumber; Mereka dapat menjadi string, daftar, atau kamus. Jika itu adalah string, jalur menjadi direktori root. Jika daftar, jalur digabungkan secara berurutan dan menjadi direktori root. Jika dikte digunakan, jalur digabungkan ke tujuan pilihan; String kosong menjadi direktori root. Variabel diperluas untuk sumber dan tujuan.
Filter memungkinkan Anda untuk melakukan pasca pemrosesan pada file sebelum diintegrasikan. Filter adalah daftar atau dikte dikt; dengan pola glob ke daftar kata kerja. Varibales diperluas dan semua pola dievaluasi untuk setiap file atau direktori, top down. Transformasi diterapkan terlebih dahulu, kemudian kompresi akhir opsional sebelum caching file.
Kata kerja diterapkan dalam urutan menurun. Anda dapat mengawali transformasi atau kata kerja compress no menonaktifkannya. Ada beberapa kata kerja khusus: discard yang mencegah inklusi dan cache (default), yang menyimpan file dalam cache build. Lihat frogfs_example.yaml misalnya penggunaan.
Tersedia dua antarmuka: API telanjang atau saat menggunakan IDF ada antarmuka VFS yang dibangun di atas API telanjang. Anda harus menggunakan antarmuka VFS dalam proyek IDF, karena menggunakan portabel dan familiar posix dan stdio C berfungsi dengannya. Namun, tidak ada yang mencegah Anda dari campuran dan mencocokkan keduanya pada saat yang sama.
Konfigurasi requries mendefinisikan struktur frogfs_config_t dan meneruskannya ke frogfs_init . Dua cara berbeda untuk menentukan sistem file:
addr : frogfs_config_t frogfs_config = {
. addr = frogfs_bin ,
};part_label : frogfs_config_t frogfs_config = {
. part_label = "storage" ,
}; Maka itu hanya masalah melewati fungsi frogfs_config ke frogfs_init dan memeriksa variabel pengembaliannya:
frogfs_fs_t * fs = frogfs_init ( & frogfs_config );
assert ( fs != NULL ); Setelah selesai, dan semua pegangan file ditutup, Anda dapat menghubungi frogfs_deinit :
frogfs_deinit ( fs ); Antarmuka VFS memiliki metode inisialisasi yang serupa; Anda mendefinisikan struktur frogfs_vfs_conf_t :
frogfs_fs_t frogfs_vfs_conf_t frogfs_vfs_conf = {
. base_path = "/frogfs" ,
. fs = fs ,
. max_files = 5 ,
};
frogfs_vfs_register ( & frogfs_vfs_conf );Di bawah tenda ada tabel hash yang terdiri dari hash hash DJB2 untuk masuk offset, yang memungkinkan pencarian cepat menggunakan algoritma pencarian biner. Semua entri kecuali entri root memiliki offset Parent Locator. Entri direktori memiliki daftar offset ke entri anak yang diurutkan.
Binari FROGFS dapat disematkan dalam aplikasi Anda, atau diakses menggunakan I/O yang dipetakan memori. Tidak mungkin (saat ini) menggunakan FROGF tanpa biner sistem file yang ada di ruang alamat data.
Pembuatan sistem file Frogfs ditangani oleh satu alat, tools/mkfrogfs.py . Ini menggunakan transformasi di direktori tools , atau Anda dapat menambahkan transformasi Anda sendiri dengan membuat direktori tools di direktori root proyek Anda, dengan nama file dimulai dengan transform- dan berakhir dengan .js atau .py . Ubah alat mengambil data pada stdin dan menghasilkan output pada stdout.
Baik transformasi dan kompresor dapat menerima argumen. Lihat frogfs_example.yaml Sebagai contoh.
FROGFS terpecah dari proyek Libesphttpd dari Chris Morgan (Chmorgan), yang merupakan garpu dari Jeroen Domburg (Sprite_TM) libesphttpd (Ware Beer-ware). Proyek ini tidak akan pernah ada tanpa mereka.
Terima kasih untuk semua kontributor untuk proyek ini!