คลาส Flash -- เข้าถึงพื้นที่จัดเก็บแฟลชในตัว

คลาส Flash ช่วยให้เข้าถึงอุปกรณ์แฟลชหลักโดยตรงบน OpenMV Cam ที่ใช้ STM32

ในกรณีส่วนใหญ่ หากต้องการจัดเก็บข้อมูลถาวรบนอุปกรณ์ คุณจะต้องการใช้การสรุปนามธรรมระดับสูงกว่า เช่น ระบบไฟล์ผ่าน Python's standard file API แต่อินเทอร์เฟซนี้มีประโยชน์สำหรับ ปรับแต่งการกำหนดค่าระบบไฟล์ หรือใช้งานระบบจัดเก็บข้อมูลระดับต่ำสำหรับแอปพลิเคชันของคุณ

Note

OpenMV Cam H7 Plus, Pure Thermal และ N6 ใช้ชิปแฟลช SPI/QSPI/XSPI ภายนอกสำหรับที่จัดเก็บหลัก ส่วน OpenMV Cam อื่นๆ ที่ใช้ STM32 ใช้แฟลชภายในที่อยู่ใน MCU อินเทอร์เฟซ Python เหมือนกันทั้งสองกรณี

คอนสตรักเตอร์

class pyb.Flash
class pyb.Flash(*, start: int = -1, len: int = -1)

สร้างอุปกรณ์บล็อกที่เข้ากันได้กับ vfs.AbstractBlockDev สำหรับแฟลชบนบอร์ด มีสองรูปแบบ:

  • Flash() (ไม่มีอาร์กิวเมนต์): คืนค่าออบเจ็กต์ singleton แบบเดิมที่เปิดเผยแฟลชทั้งหมดโดยมีตารางพาร์ติชันเสมือนแนบไว้ข้างหน้า ข้อมูลแฟลชจริงเริ่มต้นที่บล็อก 0x100 รูปแบบนี้เลิกใช้แล้ว และจะถูกลบออกในรุ่น MicroPython ในอนาคต

  • Flash(start=..., len=...): คืนค่าอุปกรณ์บล็อกใหม่ที่เข้าถึงแฟลชโดยเริ่มจากออฟเซ็ตไบต์ start (ค่าเริ่มต้น 0) เป็นระยะเวลา len ไบต์ (ค่าเริ่มต้น: ส่วนที่เหลือของอุปกรณ์) ทั้งสองค่าต้องเป็นทวีคูณของขนาดบล็อกพื้นฐาน (โดยทั่วไป 512 ไบต์สำหรับแฟลชภายใน ส่วนชิ้น SPI/QSPI/XSPI ภายนอกใช้ขนาดเซกเตอร์การลบที่ใหญ่กว่า)

เมธอด

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

อ่านไบต์จากแฟลชลงใน buf มีสองโอเวอร์โหลดที่เปิดเผยอินเทอร์เฟซแบบง่ายและแบบขยาย:

รูปแบบง่าย (readblocks(block_num, buf)): อ่านบล็อกทั้งหมดโดยเริ่มจากดัชนีบล็อก block_num len(buf) ต้องเป็นทวีคูณของขนาดบล็อกแฟลช

รูปแบบขยาย (readblocks(block_num, buf, offset)): อ่าน len(buf) ไบต์ -- ไม่จำเป็นต้องเป็นจำนวนบล็อกทั้งหมด -- โดยเริ่มจากไบต์ offset ภายในบล็อก block_num len(buf) ไม่มีข้อจำกัดด้านการจัดแนว รองรับเฉพาะออบเจ็กต์ที่สร้างด้วยอาร์กิวเมนต์ start / len ที่ชัดเจน ไม่ใช่ singleton ที่เลิกใช้

writeblocks(block_num: int, buf: bytes | bytearray) None
writeblocks(block_num: int, buf: bytes | bytearray, offset: int) None

เขียนไบต์จาก buf ไปยังแฟลช มีสองโอเวอร์โหลดที่เปิดเผยอินเทอร์เฟซแบบง่ายและแบบขยาย:

รูปแบบง่าย (writeblocks(block_num, buf)): เขียนบล็อกทั้งหมดโดยเริ่มจากดัชนีบล็อก block_num len(buf) ต้องเป็นทวีคูณของขนาดบล็อกแฟลช แต่ละบล็อกที่ได้รับผลกระทบจะถูกลบโดยอัตโนมัติก่อนการเขียน

รูปแบบขยาย (writeblocks(block_num, buf, offset)): เขียน len(buf) ไบต์ -- ไม่จำเป็นต้องเป็นจำนวนบล็อกทั้งหมด -- โดยเริ่มจากไบต์ offset ภายในบล็อก block_num len(buf) ไม่มีข้อจำกัดด้านการจัดแนว และ ไม่มีการลบโดยปริยาย -- ผู้เรียกต้องตรวจสอบให้แน่ใจว่าบล็อกที่ได้รับผลกระทบถูกลบแล้วผ่านการเรียก ioctl(6, block_num) ก่อนหน้า รองรับเฉพาะออบเจ็กต์ที่สร้างด้วยอาร์กิวเมนต์ start / len ที่ชัดเจน

ioctl(cmd: int, arg: int) int | None

จุดเข้า ioctl มาตรฐานของ vfs.AbstractBlockDev ดู vfs.AbstractBlockDev.ioctl() สำหรับรายการค่า cmd ทั้งหมด cmd=5 คืนค่าขนาดบล็อกแฟลชในหน่วยไบต์ cmd=6 ลบบล็อกที่มีดัชนี arg