Spiffs (ระบบไฟล์ SPI Flash)
v0.3.7
ลิขสิทธิ์ (c) 2013-2017 Peter Andersson (Pelleplutt1976 ที่ gmail.com)
สำหรับสิ่งที่ถูกกฎหมายดูใบอนุญาต โดยทั่วไปคุณอาจทำทุกอย่างที่คุณต้องการกับแหล่งที่มา ใช้แก้ไขขายพิมพ์ออกมาม้วนและสูบบุหรี่ - ตราบใดที่ฉันจะไม่รับผิดชอบ
ชอบที่จะได้ยินความคิดเห็น!
การแนะนำ
Spiffs เป็นระบบไฟล์ที่มีไว้สำหรับอุปกรณ์ SPI หรือ Flash บนเป้าหมายที่ฝังตัว
Spiffs ได้รับการออกแบบโดยคำนึงถึงลักษณะดังต่อไปนี้:
- เป้าหมายเล็ก ๆ
- สามารถลบข้อมูลพื้นที่ขนาดใหญ่ (บล็อก) ได้เท่านั้น
- การลบจะรีเซ็ตบิตทั้งหมดในบล็อกเป็นของ
- การเขียนดึงหนึ่งไปยังศูนย์
- Zeroes สามารถดึงไปยังที่ถูกลบได้เท่านั้น
- การสึกหรอ
อาคาร
mkdir build; make
มิฉะนั้นกำหนดค่าตัวแปร builddir ไปทางด้านบนของ makefile เป็นสิ่งที่ต่อต้าน build เริ่มต้น การตรวจสอบสติบนโฮสต์ผ่าน make test และอ้างอิง .travis.yml สำหรับขั้นตอนการทดสอบเชิงลึกอย่างเป็นทางการ ดูวิกิสำหรับการรวม spiffs เข้ากับโครงการและ Spiffsimg จาก Nodemcu เป็นตัวอย่างที่ดีในเรื่องนี้
คุณสมบัติ
Spiffs ทำอะไร:
- ออกแบบมาโดยเฉพาะสำหรับการใช้ RAM ต่ำ
- ใช้บัฟเฟอร์ RAM ขนาดคงที่เป็นอิสระจากจำนวนไฟล์
- Posix-like API: เปิด, ปิด, อ่าน, เขียน, ค้นหา, สถิติ, ฯลฯ
- มันสามารถทำงานบนแฟลชใด ๆ ไม่เพียง แต่ SPI Flash - ในทางทฤษฎีแล้วในแฟลชฝังตัวของไมโครโปรเซสเซอร์
- การกำหนดค่า spiffs หลายตัวสามารถทำงานบนเป้าหมายเดียวกัน - และแม้แต่ในอุปกรณ์ SPI Flash เดียวกัน
- ใช้การปรับระดับการสึกหรอแบบคงที่
- สร้างในการตรวจสอบความสอดคล้องของระบบไฟล์
- กำหนดค่าได้สูง
สิ่งที่ Spiffs ทำไม่ได้:
- ปัจจุบัน Spiffs ไม่สนับสนุนไดเรกทอรี มันสร้างโครงสร้างแบน การสร้างไฟล์ด้วย PATH TMP/MyFile.txt จะสร้างไฟล์ที่เรียกว่า TMP/MyFile.txt แทน myFile.txt ภายใต้ไดเรกทอรี TMP
- มันไม่ใช่สแต็กเรียลไทม์ การดำเนินการเขียนหนึ่งครั้งอาจใช้เวลานานกว่าอีกครั้ง
- ความสามารถในการปรับขนาดได้ไม่ดี Spiffs มีไว้สำหรับอุปกรณ์หน่วยความจำขนาดเล็ก - ขนาดปกติสำหรับ SPI กะพริบ นอกเหนือจาก ~ 128mbyte อาจเป็นความคิดที่ไม่ดี นี่คือผลข้างเคียงของเป้าหมายการออกแบบที่จะใช้ RAM น้อยที่สุดเท่าที่จะทำได้
- ในปัจจุบันมันไม่ได้ตรวจจับหรือจัดการบล็อกที่ไม่ดี
- หนึ่งการกำหนดค่าหนึ่งไบนารี ไม่มีไบนารี Spiffs ทั่วไปที่จัดการกับการกำหนดค่าทุกประเภท
สังเกต
0.4.0 อยู่ระหว่างการก่อสร้าง นี่คือการเขียนใหม่เต็มรูปแบบและจะเปลี่ยนโครงสร้างพื้นฐาน ดังนั้นจึงไม่สามารถใช้งานได้กับระบบไฟล์รุ่นก่อนหน้า API เหมือนกันโดยมีการดัดแปลงเล็กน้อย ธงกำหนดค่าบางอย่างจะถูกลบออก (ตามที่บังคับใช้ใน 0.4.0) และคุณสมบัติบางอย่างอาจหายไปจนถึง 0.4.1 หากคุณมีความกังวลหรือคำถามใด ๆ ก็สามารถพูดคุยได้ในปัญหา #179
ข้อมูลเพิ่มเติม
ดูวิกิสำหรับการกำหนดค่าการรวมการใช้และการเพิ่มประสิทธิภาพ Spiffs
สำหรับการออกแบบดูเอกสาร/tech_spec
สำหรับไดรเวอร์ SPI Flash ทั่วไปดูสิ่งนี้
ประวัติศาสตร์
0.3.7
- แก้ไขป้องกันการแสวงหาการชดเชยเชิงลบ #158
- คงที่ไฟล์ออฟเซ็ต descriptor ไม่ได้อัปเดตสำหรับ FD หลายตัวในไฟล์เดียวกัน #157
- แก้ไขหน้าแคชไม่ปิดสำหรับไฟล์ที่ถูกลบ #156
- แก้ไขข้อผิดพลาด lseek เมื่อค้นหาอย่างแน่นอนถึงจุดสิ้นสุดของ LUT ระดับแรกที่จัดทำดัชนีอย่างสมบูรณ์ #148
- แก้ไขปัญหาการปรับระดับการสึกหรอ #145
- แก้ไขความพยายามในการเขียนออกจากขอบเขตในแฟลช #130
- ตั้งค่าการชดเชยไฟล์เมื่อมองหา Over End #121 (ขอบคุณ @sensslen)
- แก้ไขการค้นหาในไฟล์ Virgin #120 (ขอบคุณ @Sensslen)
- เมตาดาต้าไฟล์เสริม #128 (ขอบคุณ @cesanta)
- กรอบการทดสอบ AFL #100 #143 (ขอบคุณ @PJSG)
- การอัปเดต TestFrame
ฟังก์ชั่น API ใหม่:
-
SPIFFS_update_meta, SPIFFS_fupdate_meta - อัปเดตข้อมูลเมตาสำหรับไฟล์
กำหนดค่าใหม่กำหนด:
-
SPIFFS_OBJ_META_LEN - เปิดใช้งานความเป็นไปได้ในการเพิ่มข้อมูลเมตาเพิ่มเติมลงในไฟล์
0.3.6
- แก้ไขข้อบกพร่องช่วงในการแมปหน่วยความจำดัชนี #98
- เพิ่มการแมปหน่วยความจำดัชนี #97
- เพิ่มประสิทธิภาพ spiffs_read สำหรับไฟล์ขนาดใหญ่ #96
- เพิ่มแคชชั่วคราวสำหรับการเปิดไฟล์ #95
- GC #93 ที่แข็งแกร่งยิ่งขึ้น (ขอบคุณ @dismirlian)
- แก้ไขการเขียนข้อมูลเดียวกันสองครั้งในบางสถานการณ์แคช
- แก้ไขข้อผิดพลาดแบบเปิดใน read_only builds
- ไฟล์ที่ไม่สามารถมองเห็นได้ใน spiffs_readdir #90 (ขอบคุณ @benpicco-tmp)
- การทำความสะอาดรหัสโหลดแคช #92 (ขอบคุณ @niclash)
- แก้ไขล็อค/ปลดล็อค Asymmetry #88 #87 (ขอบคุณ @jackjefferson, @dpruessner)
- การอัปเดต TestFrame
ฟังก์ชั่น API ใหม่:
-
SPIFFS_ix_map - ดัชนีแผนที่ข้อมูลเมตาไปยังหน่วยความจำสำหรับไฟล์ -
SPIFFS_ix_unmap - UNMAPS ดัชนีข้อมูลเมตาดาต้าสำหรับไฟล์ -
SPIFFS_ix_remap - เปลี่ยนไฟล์ออฟเซ็ตสำหรับแผนที่ข้อมูลเมตาดัชนี -
SPIFFS_bytes_to_ix_map_entries - ยูทิลิตี้รับความยาวของเวกเตอร์ที่จำเป็นสำหรับจำนวนไบต์ที่กำหนด -
SPIFFS_ix_map_entries_to_bytes - ยูทิลิตี้รับจำนวนไบต์ที่เวกเตอร์สามารถแสดงความยาวที่กำหนด
กำหนดค่าใหม่กำหนด:
-
SPIFFS_IX_MAP - เปิดใช้งานความเป็นไปได้ในการแมปข้อมูลอภิมาของดัชนีกับหน่วยความจำสำหรับการอ่านเร็วขึ้น -
SPIFFS_TEMPORAL_FD_CACHE - เปิดใช้งานแคชชั่วคราวสำหรับการเปิดไฟล์ได้เร็วขึ้น -
SPIFFS_TEMPORAL_CACHE_HIT_SCORE - สำหรับการปรับแต่งแคชชั่วคราว
0.3.5
- แก้ไขข้อผิดพลาดในการตรวจสอบ FS
- API ส่งคืนรหัสข้อผิดพลาดจริง #84) (ขอบคุณ @nails)
- แก้ไขคำเตือนคอมไพเลอร์สำหรับไม่ใช่ GCC #83 #81 (ขอบคุณ @nails)
- ไม่สามารถกู้คืนได้จาก FS FS FS FS FS FS 82 (ขอบคุณ @ROJER)
- กำหนด spiffs_o_* ธง #80
- ปัญหาเกี่ยวกับชื่อไฟล์ยาว #79 (ขอบคุณ @PSJG)
- ชื่อไฟล์ที่ซ้ำกันแก้ไขข้อบกพร่อง #74 (ขอบคุณ @igrr)
- spiffs_eof และ spiffs_tell ส่งคืนค่าผิด #72 (ขอบคุณ @artempisarenko)
- พวงของการอัปเดต TestFrame #77 #78 #86 (ขอบคุณ @dpreussner, @PSJG AO)
0.3.4
- เพิ่มไฟล์โทรกลับผู้ใช้ func
- แก้ไขข้อบกพร่อง STAT ด้วย OBJ ID
- เพิ่ม spiffs_probe_fs
- เพิ่มความเป็นไปได้ในการรวบรวม Spiffs รุ่นอ่านอย่างเดียว
- ทำให้เวทมนตร์ขึ้นอยู่กับความยาวของ FS ถ้าจำเป็น (ดู #59 & #66) (ขอบคุณ @hreintke)
- Exposed Spiffs_open_by_page_function
- ไฟล์ขนาดศูนย์ไม่สามารถค้นหา #57 (ขอบคุณ @lishen2)
- เพิ่มฟังก์ชั่น Tell และ EOF #54 (ขอบคุณ @Raburton)
- ทำ API String params const #53 (ขอบคุณ @Raburton)
- เก็บรักษา user_data ระหว่างการเมานต์ () #51 (ขอบคุณ @rojer)
ฟังก์ชั่น API ใหม่:
-
SPIFFS_set_file_callback_func - ลงทะเบียนการโทรกลับแจ้งเกี่ยวกับเหตุการณ์ไฟล์ -
SPIFFS_probe_fs - โพรบ spi flash พยายามหาขนาดของ FS -
SPIFFS_open_by_page - เปิดไฟล์ทีละไฟล์ -
SPIFFS_eof - ตรวจสอบว่าสิ้นสุดไฟล์หรือไม่ -
SPIFFS_tell - ส่งคืนไฟล์ปัจจุบันชดเชย
กำหนดค่าใหม่กำหนด:
-
SPIFFS_READ_ONLY -
SPIFFS_USE_MAGIC_LENGTH
0.3.3
อาจไม่เข้ากันได้กับโครงสร้าง 0.3.2 ดูปัญหา #40
- ความเป็นไปได้ที่จะเพิ่มการชดเชยจำนวนเต็มในที่จับไฟล์
- ฟังก์ชั่นการตัดทอนสันนิษฐานว่าหน้าฟรีน้อยเกินไป #49
- Bug in truncate function #48 (ขอบคุณ @paweldefee)
- อัปเดต spiffs_gc.c - ลบพารามิเตอร์ที่ไม่จำเป็น (ขอบคุณ @paweldefee)
- อัปเดตเอกสารการรวม (ขอบคุณ @paweldefee)
- แก้ไขการตัดทอนตัวชี้ในแพลตฟอร์ม 64 บิต (ขอบคุณ @igrr)
- ไฟล์ขนาดศูนย์ไม่สามารถอ่านได้ #44 (ขอบคุณ @rojer)
- (เพิ่มเติม) แก้ไขการคำนวณ max_id ใน obj_lu_find #42 #41 (ขอบคุณ @lishen2)
- ตรวจสอบรหัสข้อผิดพลาดที่ถูกต้องใน obj_lu_find_free #41 (ขอบคุณ @lishen2)
- ความคิดเห็นของ Moar สำหรับ spiffs_lseek (ขอบคุณ @igrr)
- แก้ไขช่องว่างใน spiffs_page_object_ix #40 (ขอบคุณ @jmattsson @lishen2)
- แก้ไขการทดสอบ GC_Quick (ขอบคุณ @JMATTSSON)
- เพิ่ม spiffs_excl flag #36
- Spiffs_close อาจล้มเหลวอย่างเงียบ ๆ หากเปิดใช้งานแคช #37
- ข้อมูลผู้ใช้ในการโทรกลับ #34
- ไม่สนใจ Singleton Build ในการตั้งค่าแคช (ขอบคุณ Luca)
- การรวบรวมข้อผิดพลาดแก้ไข #32 (ขอบคุณ @chotasanjiv)
- Align Cand_Scores (ขอบคุณ @hefloryd)
- แก้ไขคำเตือนบิลด์เมื่อ spiffs_cache เป็น 0 (ขอบคุณ @ajaybhargav)
กำหนดค่าใหม่กำหนด:
0.3.2
- จำกัด ขนาดแคชหากได้รับแคชมากเกินไป (ขอบคุณ pgeiem)
- คุณสมบัติใหม่ - การลบควบคุม #23
- spiffs_rename descriptors ไฟล์รั่วไหล #28 (ขอบคุณ Benpicco)
- ย้าย dbg print กำหนดในกรอบทดสอบไปที่ params_test.h
- Lseek ควรคืนค่าชดเชยที่เกิดขึ้น (ขอบคุณ hefloryd)
- แก้ไขประเภทบน dbg ifdefs
- คำเตือนความเงียบเกี่ยวกับการเปรียบเทียบที่ลงนาม/ไม่ได้ลงนามเมื่อ spiffs_obj_id คือ 32 บิต (ขอบคุณ Benpicco)
- ข้อผิดพลาดที่เป็นไปได้ใน test_spiffs.c #21 (ขอบคุณ yihcdaso-yeskela)
- แคชอาจเขียนบ่อยเกินไป #16
- แม้แต่การอัปเดตของ Moar Testrunner
- การอัพเดท Framework Test และการทดสอบเพิ่มเติมบางอย่าง
- ความคิดบางอย่างสำหรับ gen ถัดไป
- ทดสอบ Sigsevs เมื่อมีภาคส่วนมากเกินไป #13 (ขอบคุณ AlonewolfX2)
- GC อาจจะไม่ดี #11
- แก้ไข Eternal Readdir เมื่อ objheader ที่บล็อกสุดท้ายรายการสุดท้าย
ฟังก์ชั่น API ใหม่:
-
SPIFFS_gc_quick - เรียก GC ที่ไม่รบกวน -
SPIFFS_gc - เรียก GC ที่ล่วงล้ำเต็มรูปแบบ
0.3.1
- ลบคำเตือนการส่งคืนสองครั้งออกไปแล้ว
0.3.0
- เพิ่ม nameCheck ที่มีอยู่เมื่อสร้างไฟล์
- ข้อบกพร่องในการวิเคราะห์แบบคงที่จำนวนมาก #6
- เพิ่มการเปลี่ยนชื่อ func
- แก้ไขความยาว spiffs_read เมื่ออ่านเกินขนาดไฟล์
- เพิ่มการอ่านเกินกว่าไฟล์ทดสอบความยาวไฟล์
- สร้างการสร้างที่กำหนดค่าได้มากขึ้นเล็กน้อย
- เปลี่ยนชื่อใน Spiffs จาก "errno" เป็น "err_code" เนื่องจากความขัดแย้งที่รวบรวมใน Mingw
- ปรับปรุงการตรวจสอบ GC, แก้ไขข้อผิดพลาดของภาคผนวก, การตัดทอนที่แข็งแกร่งมากขึ้นสำหรับกรณีพิเศษมาก
- GC ตรวจสอบการจองล่วงหน้า GC ตัดทอนแม้แต่พิถีพิถันน้อยกว่า
- การจัดตำแหน่งโครงสร้างที่จำเป็นสำหรับบางเป้าหมายกำหนดใน spiffs config #10
- SPIFFS FILESYSTEM MAGIC สามารถกำหนดได้ในการกำหนดค่า
กำหนดค่าใหม่กำหนด:
-
SPIFFS_USE_MAGIC - เปิดใช้งานหรือปิดการตรวจสอบเวทมนตร์เมื่อเมานต์ -
SPIFFS_ALIGNED_OBJECT_INDEX_TABLES - การจัดตำแหน่งสำหรับเป้าหมายบางอย่าง
ฟังก์ชั่น API ใหม่:
-
SPIFFS_rename - เปลี่ยนชื่อไฟล์ -
SPIFFS_clearerr - ล้าง errno ล่าสุด -
SPIFFS_info - ส่งคืนข้อมูลเกี่ยวกับการใช้งานและไบต์ทั้งหมดใน FS -
SPIFFS_format - จัดรูปแบบระบบไฟล์ -
SPIFFS_mounted - ตรวจสอบว่าระบบไฟล์ติดตั้งหรือไม่