עבודה עם מערכות קבצים¶
מדריך זה מתאר כיצד ה-OpenMV Cam מספקת מערכת קבצים על ההתקן, המאפשרת להשתמש בשיטות קלט/פלט סטנדרטיות של Python לקבצים מול אחסון קבוע.
ה-OpenMV Cam יוצרת תצורת ברירת מחדל ומזהה ומעגנת אוטומטית את מערכת הקבצים הראשית בעת ההפעלה, ולכן מדריך זה שימושי בעיקר אם ברצונך לחלק מחדש את זיכרון הפלאש (flash) למחיצות, לשנות את סוג מערכת הקבצים, או להשתמש בהתקן בלוקים מותאם אישית.
מערכת הקבצים מגובה על ידי זיכרון הפלאש (flash) הפנימי, או על ידי כרטיס SD כאשר מותקן כזה.
VFS¶
MicroPython מממשת שכבת מערכת קבצים וירטואלית (VFS) בסגנון Unix. כל מערכות הקבצים המעוגנות משולבות למערכת קבצים וירטואלית אחת, המתחילה בשורש /. מערכות קבצים מעוגנות לתוך תיקיות במבנה זה, ובעת האתחול תיקיית העבודה מוגדרת למערכת הקבצים הראשית.
ב-OpenMV Cam זיכרון הפלאש הפנימי מעוגן ב-/flash והוא תיקיית העבודה. אם מותקן כרטיס SD, הוא מעוגן ב-/sdcard והופך לתיקיית העבודה במקום זאת.
התקני בלוקים¶
התקן בלוקים הוא מופע של מחלקה המממשת את פרוטוקול vfs.AbstractBlockDev.
בעת ההפעלה ה-OpenMV Cam מנסה לזהות את מערכת הקבצים בזיכרון הפלאש הפנימי (או בכרטיס ה-SD) ולהגדיר ולעגן אותה אוטומטית. אם לא נמצאת מערכת קבצים, נוצרת מערכת קבצים מסוג FAT המשתרעת על פני כל זיכרון הפלאש. הדרך הקלה ביותר למחוק או לפרמט מחדש את מערכת הקבצים המובנית היא דרך OpenMV IDE או איפוס למצב היצרן; ממשק ה-Python ברמה הנמוכה יותר שלהלן מיועד לשימוש מתקדם/תכנותי.
זיכרון פלאש פנימי¶
ב-OpenMV Cams מבוססות STM32 המחלקה pyb.Flash מספקת גישה לזיכרון הפלאש הפנימי. בלוחות בעלי זיכרון פלאש חיצוני גדול יותר היא תשתמש בו במקום זאת. תמיד יש לציין את ארגומנט המילה המפתחית start, כלומר pyb.Flash(start=0).
הערה: לצורך תאימות לאחור, כאשר היא נבנית ללא ארגומנטים (כלומר pyb.Flash()), היא מממשת רק את ממשק הבלוקים הפשוט ומשקפת את ההתקן הווירטואלי המוצג לאחסון ההמוני (mass storage) של USB (כלומר היא כוללת טבלת מחיצות וירטואלית בהתחלה).
התקני בלוקים מותאמים אישית¶
ניתן גם ליצור התקן בלוקים משלך ב-Python ולעגן אותו — למשל דיסק RAM. המחלקה הבאה מממשת התקן בלוקים פשוט המאחסן את הנתונים שלו ב-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 כך שבלוחות החושפים את מערכת הקבצים מעל אחסון המוני (mass storage) של USB, מחשב המארח יכול לקרוא ולכתוב אותה ללא צורך בדרייברים נוספים.
FAT אינה עמידה לכשל חשמלי במהלך כתיבות, מה שעלול להוביל לשיבוש של מערכת הקבצים. הוצא/בטל את עיגון הכונן במארח לפני כיבוי המצלמה, והעדף כרטיס SD על פני זיכרון הפלאש הפנימי עבור נתונים שהסקריפט כותב בחזרה.
ב-OpenMV Cams מבוססות 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')