Frogfs (نظام الملفات السريع للقراءة العامة فقط) هو نظام ملفات للقراءة فقط مصمم للاستخدام المدمج. يمكن استخدامه بسهولة مع مشروع CMAKE-بما في ذلك ESP-IDF. لديها مرشحات مدمجة لتوفير المساحة. يتم تقليل الملفات الموجودة في frogfs-clockwise-demo بحوالي النصف باستخدام المرشحات الافتراضية. فيما يلي روابط إلى مستودعات المثال:
تشمل مرشحات التحويل:
تشمل مرشحات الضغط:
من المقرر أن تكون مرشحات التحويل هي عمليات التجميع التي لا تتحمل تكلفة وقت التشغيل بينما من المتوقع أن تتحمل عوامل تصفية الضغط تكلفة إلغاء الضغط في وقت التشغيل .
هذا يعني بالنسبة لخادم HTTP أو ZLIB (DEFLATE) أو BROTLI (BR) أو GZIP مضغوطة يمكن تمرير ملفات مضغوطة! هذا يوفر وقت المعالجة وعرض النطاق الترددي. احذر من أن بعض المتصفحات لا تقبل محتوى Brotli HTTP (HTTPS فقط).
لاستخدام هذا المكون مع ESP-IDF ، ضمن تشغيل دليل المشاريع الخاصة بك
idf.py add-dependency jkent/frogfs
تضمين الضفادع داخل مشروعك الثنائي مع وظيفة cmake العليا:
target_add_frogfs(<target> [CONFIG yaml] [NAME name])
إذا لم يتم تحديد التكوين ، فسيتم استخدام frogfs.yaml . إذا لم يتم تحديد الاسم ، فسوف يفتقر إلى frogfs .
كمثال على ESP-IDF ، في Cmakelists toplevel.
cmake_minimum_required ( VERSION 3.16)
include ( $ENV{IDF_PATH} /tools/cmake/project.cmake)
project (my_project)
target_add_frogfs( ${PROJECT_NAME} .elf)في C ، ينتج عن هذين الرموبين العالميين متاحين لتطبيقك:
extern const uint8_t frogfs_bin [];
extern const size_t frogfs_bin_len ; لديك خيار إنشاء ثنائي دون ربطه بتطبيقك. يتم توفير وظيفة CMake لإخراج ثنائي مع الهدف generate_${name} .
declare_frogfs_bin(path [CONFIG yaml] [NAME name])
إذا لم يتم تحديد التكوين ، يتم استخدام frogfs.yaml . إذا لم يتم تحديد الاسم ، يتم استخدام frogfs .
إليك مثال على ما يمكنك إضافته إلى cmakelists.txt toplevel:
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) يمكنك استدعاء عملية الفلاش عن طريق تشغيل idf.py frogfs-flash .
يتوقع Frogfs ملف تكوين Yaml. هناك 3 أقسام مختلفة: تحديد وجمع وتصفية. كل ما عدا التجميع اختياري.
DEFINE هي قائمة أو مقرون من التعاريف المتغيرة. هناك 2 متغيرات محددة مسبقا: $cwd و $frogfs . يمكنك أيضًا الرجوع إلى متغيرات البيئة باستخدام بناء الجملة ${ENV:varname} .
جمع ملفات "تجمع" وأدلة وأضعها في جذر Frogfs. يُسمح بأنماط الكرة الأرضية في مكون "الاسم الأساسي" للمسار. هناك 3 طرق لتحديد المصادر ؛ هم cn يكون سلسلة أو قائمة أو قاموس. إذا كانت سلسلة ، فإن المسار (المسار) يصبح الدليل الجذر. إذا تم دمج قائمة ، يتم دمج المسارات بالترتيب وتصبح الدليل الجذر. إذا تم استخدام dict ، يتم دمج المسارات في الوجهة المفضلة ؛ سلسلة فارغة كونها دليل الجذر. يتم توسيع المتغيرات لكل من المصدر والوجهة.
يتيح لك Filter القيام بالمعالجة بعد المعالجة على الملفات قبل دمجها. المرشح هو قائمة أو مقرات من الرسوم. مع نمط الكرة الأرضية إلى قائمة الأفعال. يتم توسيع المتغيرات ويتم تقييم جميع الأنماط لكل ملف أو دليل ، من أعلى إلى أسفل. يتم تطبيق التحويلات أولاً ، ثم ضغط نهائي اختياري قبل تخزين الملف.
يتم تطبيق الأفعال بترتيب تنازلي. يمكنك بادئة التحويلات أو الفعل compress مع no لتعطيله. هناك اثنين من الأفعال الخاصة: discard مما يمنع التضمين وذاكرة cache (الافتراضي) ، والذي يخبئ الملف في ذاكرة التخزين المؤقت للبناء. انظر frogfs_example.yaml على سبيل المثال الاستخدام.
تتوفر واجهتان: واجهة برمجة التطبيقات العارية أو عند استخدام IDF هناك واجهة VFS التي تبني أعلى واجهة برمجة التطبيقات العارية. يجب عليك استخدام واجهة VFS في مشاريع IDF ، حيث تستخدم وظائف posix و stdio C المحمولة والمألوفة معها. لا يوجد شيء يمنعك من مزيج ومطابقة كليهما في نفس الوقت.
تكوين requries تحدد بنية frogfs_config_t وتمريرها إلى frogfs_init . طريقتان مختلفتان لتحديد نظام الملفات:
addr : frogfs_config_t frogfs_config = {
. addr = frogfs_bin ,
};part_label : frogfs_config_t frogfs_config = {
. part_label = "storage" ,
}; ثم إنها مجرد مسألة تمرير وظيفة frogfs_config إلى frogfs_init والتحقق من متغير إرجاعها:
frogfs_fs_t * fs = frogfs_init ( & frogfs_config );
assert ( fs != NULL ); عند الانتهاء ، وجميع مقابض الملفات مغلقة ، يمكنك استدعاء frogfs_deinit :
frogfs_deinit ( fs ); واجهة VFS لها طريقة مماثلة للتهيئة ؛ يمكنك تحديد هيكل 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 );تحت الغطاء ، يوجد جدول تجزئة يتكون من تجزئة مسار DJB2 إلى إزاحة الدخول ، والتي تسمح بإجراء بحث سريع باستخدام خوارزمية بحث ثنائية. جميع الإدخالات باستثناء إدخال الجذر لها إزاحة محدد الأمد. إدخالات الدليل لها قائمة مرتبة من الإزاحة إلى إدخالات الأطفال.
يمكن تضمين ثنائيات Frogfs في تطبيقك ، أو الوصول إليها باستخدام I/O للذاكرة. ليس من الممكن (في هذا الوقت) استخدام Frogfs دون وجود نظام ثنائي نظام الملفات الموجودة في مساحة عنوان البيانات.
يتم التعامل مع نظام ملفات Frogfs بواسطة أداة واحدة ، tools/mkfrogfs.py . يستخدم التحويلات في دليل tools ، أو يمكنك إضافة التحويلات الخاصة بك عن طريق إنشاء دليل tools في دليل جذر المشاريع الخاصة بك ، مع اسم ملف يبدأ transform- وينتهي بـ .js أو .py . تأخذ أدوات التحويل بيانات عن stdin وإنتاج الإخراج على stdout.
يمكن لكل من التحويل و compresors قبول الحجج. انظر frogfs_example.yaml للحصول على مثال.
تم تقسيم Frogfs عن مشروع Libesphtpd من كريس مورغان (Chmorgan) (MPL 2.0) ، وهو شوكة من Jeroen Domburg (Sprite_TM) ل Libesphttpd (البيرة). هذا المشروع لم يكن موجودًا بدونهم.
شكرا لجميع المساهمين في هذا المشروع!