Робота з файловими системами

Цей посібник описує, як OpenMV Cam забезпечує файлову систему на пристрої, дозволяючи використовувати стандартні методи Python для роботи з файлами разом зі збереженням даних.

OpenMV Cam створює конфігурацію за замовчуванням і автоматично виявляє та монтує основну файлову систему при увімкненні живлення, тому цей посібник здебільшого корисний, якщо ви хочете перерозбити розділи флеш-пам’яті, змінити тип файлової системи або використати власний блочний пристрій.

Файлова система підтримується внутрішньою флеш-пам’яттю або SD-карткою, якщо вона встановлена.

VFS

MicroPython реалізує рівень Virtual File System (VFS) у стилі Unix. Усі змонтовані файлові системи об’єднуються в єдину віртуальну файлову систему, що починається з кореневого каталогу /. Файлові системи монтуються в директорії цієї структури, а під час запуску робочий каталог встановлюється на основну файлову систему.

На OpenMV Cam внутрішня флеш-пам’ять монтується в /flash і є робочим каталогом. Якщо встановлена SD-картка, вона монтується в /sdcard і стає робочим каталогом замість попереднього.

Блочні пристрої

Блочний пристрій — це екземпляр класу, що реалізує протокол vfs.AbstractBlockDev.

При увімкненні живлення OpenMV Cam намагається виявити файлову систему у внутрішній флеш-пам’яті (або на SD-картці) та автоматично налаштувати і змонтувати її. Якщо файлову систему не знайдено, створюється FAT-файлова система, що охоплює всю флеш-пам’ять. Найпростіший спосіб стерти або переформатувати вбудовану файлову систему — скористатись OpenMV IDE або виконати скидання до заводських налаштувань; наведений нижче низькорівневий Python API призначений для поглибленого або програмного використання.

Внутрішня флеш-пам’ять

На OpenMV Cams на базі STM32 клас pyb.Flash надає доступ до внутрішньої флеш-пам’яті. На платах із більшою зовнішньою флеш-пам’яттю буде використовуватися вона. Іменований аргумент start слід завжди вказувати, наприклад pyb.Flash(start=0).

Примітка: для зворотної сумісності, якщо об’єкт створено без аргументів (тобто pyb.Flash()), реалізується лише простий блочний інтерфейс, що відображає віртуальний пристрій, який надається USB-сховищу (тобто включає віртуальну таблицю розділів на початку).

Власні блочні пристрої

Ви також можете створити власний блочний пристрій на Python і змонтувати його — наприклад, 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-сховище, комп’ютер-хост міг читати та записувати її без додаткових драйверів.

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')