การทำงานกับระบบไฟล์¶
บทแนะนำนี้อธิบายวิธีที่ OpenMV Cam จัดเตรียมระบบไฟล์บนอุปกรณ์ ซึ่งช่วยให้สามารถใช้วิธีการอ่านเขียนไฟล์ Python มาตรฐานกับพื้นที่จัดเก็บข้อมูลถาวรได้
OpenMV Cam จะสร้างการกำหนดค่าเริ่มต้นและตรวจหาพร้อมเมานต์ระบบไฟล์หลักโดยอัตโนมัติเมื่อเปิดเครื่อง ดังนั้นบทแนะนำนี้จึงมีประโยชน์เป็นหลักหากคุณต้องการแบ่งพาร์ติชันแฟลชใหม่ เปลี่ยนประเภทระบบไฟล์ หรือใช้บล็อกดีไวซ์แบบกำหนดเอง
ระบบไฟล์ถูกสำรองด้วยหน่วยความจำแฟลชภายใน หรือโดย SD card เมื่อมีการติดตั้ง
VFS¶
MicroPython นำเลเยอร์ Virtual File System (VFS) แบบ Unix มาใช้งาน ระบบไฟล์ที่เมานต์ทั้งหมดจะถูกรวมเป็นระบบไฟล์เสมือนเดียวกัน โดยเริ่มต้นที่ root / ระบบไฟล์จะถูกเมานต์เข้าไปในไดเรกทอรีของโครงสร้างนี้ และเมื่อเริ่มต้นระบบ ไดเรกทอรีทำงานจะถูกตั้งค่าเป็นระบบไฟล์หลัก
บน OpenMV Cam แฟลชภายในจะถูกเมานต์ที่ /flash และเป็นไดเรกทอรีทำงาน หากติดตั้ง SD card จะถูกเมานต์ที่ /sdcard และกลายเป็นไดเรกทอรีทำงานแทน
บล็อกดีไวซ์¶
บล็อกดีไวซ์คืออินสแตนซ์ของคลาสที่ใช้งานโพรโทคอล vfs.AbstractBlockDev
เมื่อเปิดเครื่อง OpenMV Cam จะพยายามตรวจหาระบบไฟล์บนแฟลชภายใน (หรือ SD card) และกำหนดค่าพร้อมเมานต์โดยอัตโนมัติ หากไม่พบระบบไฟล์ จะสร้างระบบไฟล์ FAT ที่ครอบคลุมพื้นที่แฟลชทั้งหมด วิธีที่ง่ายที่สุดในการลบหรือฟอร์แมตระบบไฟล์บนบอร์ดใหม่คือใช้ OpenMV IDE หรือ factory reset ส่วน Python API ระดับล่างด้านล่างนี้มีไว้สำหรับการใช้งานขั้นสูงหรือแบบโปรแกรม
แฟลชภายใน¶
บน OpenMV Cam ที่ใช้ STM32 คลาส pyb.Flash ให้การเข้าถึงแฟลชภายใน สำหรับบอร์ดที่มีแฟลชภายนอกขนาดใหญ่กว่าจะใช้แฟลชนั้นแทน ควรระบุ kwarg start เสมอ เช่น pyb.Flash(start=0)
หมายเหตุ: เพื่อความเข้ากันได้แบบย้อนหลัง เมื่อสร้างโดยไม่มีอาร์กิวเมนต์ (เช่น pyb.Flash()) จะใช้งานเฉพาะอินเทอร์เฟซบล็อกแบบง่าย และสะท้อนอุปกรณ์เสมือนที่แสดงต่อ USB mass storage (กล่าวคือ รวมถึงตาราง partition เสมือนไว้ที่จุดเริ่มต้น)
บล็อกดีไวซ์แบบกำหนดเอง¶
คุณยังสามารถสร้างบล็อกดีไวซ์ของคุณเองใน Python และเมานต์ได้ เช่น RAM disk ต่อไปนี้คือคลาสที่ใช้งานบล็อกดีไวซ์แบบง่ายที่จัดเก็บข้อมูลใน RAM โดยใช้ bytearray
class RAMBlockDev:
def __init__(self, block_size, num_blocks):
self.block_size = block_size
self.data = bytearray(block_size * num_blocks)
def readblocks(self, block_num, buf):
for i in range(len(buf)):
buf[i] = self.data[block_num * self.block_size + i]
def writeblocks(self, block_num, buf):
for i in range(len(buf)):
self.data[block_num * self.block_size + i] = buf[i]
def ioctl(self, op, arg):
if op == 4: # get number of blocks
return len(self.data) // self.block_size
if op == 5: # get block size
return self.block_size
สามารถใช้งานได้ดังนี้:
import vfs
bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')
เมื่อเมานต์แล้ว ระบบไฟล์สามารถใช้งานได้ตามปกติจากโค้ด Python เช่น:
with open('/ramdisk/hello.txt', 'w') as f:
f.write('Hello world')
print(open('/ramdisk/hello.txt').read())
ระบบไฟล์¶
OpenMV Cam ฟอร์แมตแฟลชภายในเป็น FAT เพื่อให้บอร์ดที่เปิดเผยระบบไฟล์ผ่าน USB mass storage สามารถให้ PC โฮสต์อ่านและเขียนได้โดยไม่ต้องติดตั้งไดรเวอร์เพิ่มเติม
FAT ไม่ทนต่อไฟดับระหว่างการเขียนข้อมูล ซึ่งอาจทำให้ระบบไฟล์เสียหายได้ ควร Eject/unmount ไดรฟ์บนโฮสต์ก่อนปิดกล้อง และควรใช้ SD card แทนแฟลชภายในสำหรับข้อมูลที่สคริปต์เขียนกลับ
บน OpenMV Cam ที่ใช้ STM32 สามารถฟอร์แมตแฟลชภายในใหม่จาก Python ได้:
import os, vfs, pyb
vfs.umount('/flash')
vfs.VfsFat.mkfs(pyb.Flash(start=0))
vfs.mount(pyb.Flash(start=0), '/flash')
os.chdir('/flash')