Lucrul cu sistemele de fișiere

Acest tutorial descrie cum oferă OpenMV Cam un sistem de fișiere pe dispozitiv, permițând utilizarea metodelor standard de I/O cu fișiere din Python pentru stocarea persistentă.

OpenMV Cam creează o configurație implicită și detectează automat și montează sistemul de fișiere principal la pornire, așa că acest tutorial este util în special dacă doriți să repartiționați memoria flash, să schimbați tipul sistemului de fișiere sau să folosiți un dispozitiv bloc personalizat.

Sistemul de fișiere este susținut de memoria flash internă sau de un card SD atunci când unul este instalat.

VFS

MicroPython implementează un strat Virtual File System (VFS) de tip Unix. Toate sistemele de fișiere montate sunt combinate într-un singur sistem de fișiere virtual, care începe la rădăcina /. Sistemele de fișiere sunt montate în directoare din această structură, iar la pornire directorul de lucru este setat la sistemul de fișiere principal.

Pe OpenMV Cam, memoria flash internă este montată la /flash și reprezintă directorul de lucru. Dacă este instalat un card SD, acesta este montat la /sdcard și devine în schimb directorul de lucru.

Dispozitive bloc

Un dispozitiv bloc este o instanță a unei clase care implementează protocolul vfs.AbstractBlockDev.

La pornire, OpenMV Cam încearcă să detecteze sistemul de fișiere de pe memoria flash internă (sau de pe cardul SD) și să îl configureze și monteze automat. Dacă nu se găsește niciun sistem de fișiere, se creează un sistem de fișiere FAT care acoperă întreaga memorie flash. Pentru a șterge sau a reformata sistemul de fișiere de pe placă, cea mai simplă cale este OpenMV IDE sau o resetare la valorile din fabrică; API-ul Python de nivel inferior de mai jos este destinat utilizării avansate/programatice.

Memoria flash internă

Pe OpenMV Cam bazate pe STM32, clasa pyb.Flash oferă acces la memoria flash internă. Pe plăcile care au o memorie flash externă mai mare, va folosi în schimb pe aceea. Argumentul start ar trebui specificat întotdeauna, adică pyb.Flash(start=0).

Notă: Din motive de compatibilitate retroactivă, atunci când este construit fără argumente (adică pyb.Flash()), implementează doar interfața simplă de bloc și reflectă dispozitivul virtual prezentat stocării în masă USB (adică include o tabelă de partiții virtuală la început).

Dispozitive bloc personalizate

Vă puteți crea, de asemenea, propriul dispozitiv bloc în Python și îl puteți monta — de exemplu un disc RAM. Următoarea clasă implementează un dispozitiv bloc simplu care își stochează datele în RAM folosind un 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

Poate fi folosit după cum urmează:

import vfs

bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')

Odată montat, sistemul de fișiere poate fi folosit așa cum ar fi folosit în mod normal din codul Python, de exemplu:

with open('/ramdisk/hello.txt', 'w') as f:
    f.write('Hello world')
print(open('/ramdisk/hello.txt').read())

Sisteme de fișiere

OpenMV Cam formatează memoria flash internă ca FAT, astfel încât, pe plăcile care expun sistemul de fișiere prin stocarea în masă USB, PC-ul gazdă să îl poată citi și scrie fără drivere suplimentare.

FAT nu tolerează căderile de tensiune în timpul scrierilor, ceea ce poate duce la coruperea sistemului de fișiere. Ejectați/demontați unitatea de pe gazdă înainte de a opri camera și preferați un card SD în locul memoriei flash interne pentru datele pe care scriptul le scrie înapoi.

Pe OpenMV Cam bazate pe STM32, memoria flash internă poate fi reformatată din 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')