FROGFS (ระบบไฟล์อเนกประสงค์ทั่วไปอ่านอย่างรวดเร็ว) เป็นระบบไฟล์แบบอ่านอย่างเดียวที่ออกแบบมาสำหรับการใช้งานแบบฝังตัว สามารถใช้งานได้ง่ายกับโครงการ CMake-รวมถึง ESP-IDF มันมีตัวกรองในตัวเพื่อประหยัดพื้นที่ ไฟล์ใน frogfs-clockwise-demo จะลดลงประมาณครึ่งหนึ่งโดยใช้ตัวกรองเริ่มต้น นี่คือลิงค์ไปยังที่เก็บตัวอย่าง:
การแปลงตัวกรองรวมถึง:
ตัวกรองการบีบอัดรวมถึง:
ตัวกรองแปลงมีจุดประสงค์เพื่อ รวบรวมเวลา การดำเนินงานที่ไม่ต้องเสียค่าใช้จ่ายในเวลาทำงานในขณะที่ตัวกรองการบีบอัด คาดว่า จะต้องเสียค่าใช้จ่ายในการบีบ อัดเวลา
ซึ่งหมายความว่าสำหรับเซิร์ฟเวอร์ HTTP, zlib (deflate), brotli (br) หรือไฟล์ที่บีบอัด GZIP สามารถส่งผ่านไม่ถูกแตะต้อง! สิ่งนี้จะช่วยประหยัดเวลาในการประมวลผลและแบนด์วิดท์ ระวังอย่างไรก็ตามเบราว์เซอร์บางตัวไม่ยอมรับเนื้อหา Brotli อื่น ๆ HTTP (HTTPS เท่านั้น)
หากต้องการใช้ส่วนประกอบนี้กับ ESP-IDF ภายในไดเรกทอรีโครงการของคุณ
idf.py add-dependency jkent/frogfs
ฝัง frogfs ภายในโครงการไบนารีโครงการของคุณด้วยฟังก์ชั่น cmake folowing:
target_add_frogfs(<target> [CONFIG yaml] [NAME name])
หากไม่ได้ระบุ การกำหนดค่า frogfs.yaml จะถูกใช้ หากไม่ได้ระบุ ชื่อ จะเป็นค่าเริ่มต้นเป็น frogfs
เป็นตัวอย่างสำหรับ ESP-IDF ใน CMakelists Toplevelists.txt:
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
นี่คือตัวอย่างของสิ่งที่คุณสามารถเพิ่มลงใน toplevel cmakelists.txt:
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 ส่วนที่แตกต่างกัน: กำหนดรวบรวมและกรอง ทั้งหมดยกเว้นการรวบรวมเป็นทางเลือก
กำหนดเป็นรายการหรือคำจำกัดความของคำจำกัดความตัวแปร มีตัวแปรที่กำหนดไว้ล่วงหน้า 2 ตัว: $cwd และ $frogfs นอกจากนี้คุณยังสามารถอ้างอิงตัวแปรสภาพแวดล้อมด้วยไวยากรณ์ ${ENV:varname}
รวบรวมไฟล์และการรวบรวม 'และไดเรกทอรีและวางไว้ในรูท Frogfs รูปแบบ GLOB ได้รับอนุญาตในส่วนประกอบ 'basename' ของเส้นทาง มี 3 วิธีในการระบุแหล่งที่มา พวกเขาเป็นสตริงรายการหรือพจนานุกรม หากเป็นสตริงพา ธ (S) จะกลายเป็นไดเรกทอรีรูท หากรายการเส้นทางจะถูกรวมเข้าด้วยกันและกลายเป็นไดเรกทอรีราก หากมีการใช้ dict เส้นทางจะถูกรวมเข้ากับปลายทางของทางเลือก สตริงว่างเป็นไดเรกทอรีราก ตัวแปรถูกขยายสำหรับทั้งแหล่งที่มาและปลายทาง
ตัวกรองช่วยให้คุณสามารถโพสต์ในไฟล์ก่อนที่จะรวมเข้าด้วยกัน ตัวกรองเป็นรายการหรือคำสั่งของ dicts; ด้วยรูปแบบลูกโลกในรายการคำกริยา Varibales มีการขยายและรูปแบบทั้งหมดจะถูกประเมินสำหรับแต่ละไฟล์หรือไดเรกทอรีจากบนลงล่าง การแปลงจะถูกนำไปใช้ก่อนจากนั้นเป็นการบีบอัดขั้นสุดท้ายที่เป็นตัวเลือกก่อนที่จะแคชไฟล์
คำกริยาถูกนำไปใช้ตามลำดับจากมากไปน้อย คุณสามารถนำหน้าการแปลงหรือคำ compress โดย no การปิดการใช้งาน มีคำกริยาพิเศษสองสามคำ: discard ซึ่งป้องกันการรวมและ cache (ค่าเริ่มต้น) ซึ่งแคชไฟล์ในแคชบิลด์ ดู frogfs_example.yaml ตัวอย่างการใช้งาน
มีสองอินเทอร์เฟซ: API เปลือยหรือเมื่อใช้ IDF มีอินเทอร์เฟซ VFS ซึ่งสร้างขึ้นด้านบนของ API เปลือย คุณควรใช้อินเทอร์เฟซ 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 );ภายใต้ฮูดมีตารางแฮชประกอบด้วย Hash. Path DJB2 ไปยัง Offsets รายการซึ่งอนุญาตให้ทำการค้นหาอย่างรวดเร็วโดยใช้อัลกอริทึมการค้นหาแบบไบนารี รายการทั้งหมดยกเว้นรายการรูทมีการชดเชยตัวระบุตำแหน่งหลัก รายการไดเรกทอรีมีรายการที่จัดเรียงของการชดเชยสำหรับรายการเด็ก
Frogfs Binaries สามารถฝังอยู่ในแอปพลิเคชันของคุณหรือเข้าถึงโดยใช้ I/O ที่แมปหน่วยความจำ เป็นไปไม่ได้ (ในเวลานี้) ที่จะใช้ frogfs โดยไม่มีระบบไฟล์ไบนารีที่มีอยู่ในพื้นที่ที่อยู่ข้อมูล
การสร้างระบบไฟล์ frogfs ได้รับการจัดการโดยเครื่องมือเดียว tools/mkfrogfs.py มันใช้การแปลงในไดเรกทอรี tools หรือคุณสามารถเพิ่มการแปลงของคุณเองได้โดยการสร้างไดเรกทอรี tools ในไดเรกทอรีรากของโครงการของคุณโดยมีชื่อไฟล์เริ่มต้นด้วย transform- และสิ้นสุดด้วย .js หรือ .py เครื่องมือแปลงใช้ข้อมูลเกี่ยวกับ stdin และสร้างเอาต์พุตบน stdout
ทั้งการแปลงและการรวมกันสามารถยอมรับข้อโต้แย้ง ดูตัวอย่าง frogfs_example.yaml
Frogfs ถูกแยกออกจากโครงการ Libesphttpd ของ Chris Morgan (Chmorgan) (MPL 2.0) ซึ่งเป็นส้อมของ Jeroen Domburg (Sprite_TM) ของ Libesphttpd (เครื่องเบียร์) โครงการนี้จะไม่มีอยู่จริงหากไม่มีพวกเขา
ขอขอบคุณผู้มีส่วนร่วมทุกคนในโครงการนี้!