العمل مع أنظمة الملفات

يشرح هذا الدرس كيف توفر OpenMV Cam نظام ملفات على الجهاز، مما يتيح استخدام طرق إدخال/إخراج الملفات القياسية في Python مع التخزين الدائم.

تنشئ OpenMV Cam تكوينًا افتراضيًا وتكتشف نظام الملفات الأساسي وتثبّته تلقائيًا عند التشغيل، لذا فإن هذا الدرس مفيد في الغالب إذا أردت إعادة تقسيم ذاكرة الفلاش، أو تغيير نوع نظام الملفات، أو استخدام جهاز كتل مخصص.

يستند نظام الملفات إلى ذاكرة الفلاش الداخلية، أو إلى بطاقة SD عند تركيب واحدة.

VFS

تطبّق MicroPython طبقة نظام ملفات افتراضي (VFS) شبيهة بأنظمة Unix. تُدمج جميع أنظمة الملفات المثبّتة في نظام ملفات افتراضي واحد، يبدأ من الجذر /. تُثبّت أنظمة الملفات في أدلة ضمن هذه البنية، وعند بدء التشغيل يُضبط دليل العمل على نظام الملفات الأساسي.

على OpenMV Cam تُثبّت ذاكرة الفلاش الداخلية عند /flash وتكون دليل العمل. وإذا رُكّبت بطاقة SD فإنها تُثبّت عند /sdcard وتصبح دليل العمل بدلًا من ذلك.

أجهزة الكتل

جهاز الكتل هو نسخة من فئة تطبّق بروتوكول vfs.AbstractBlockDev.

عند التشغيل تحاول OpenMV Cam اكتشاف نظام الملفات على ذاكرة الفلاش الداخلية (أو بطاقة SD) وتكوينه وتثبيته تلقائيًا. وإذا لم يُعثر على نظام ملفات، يُنشأ نظام ملفات FAT يمتد عبر ذاكرة الفلاش بالكامل. ولمسح أو إعادة تهيئة نظام الملفات المدمج، فإن أسهل طريقة هي OpenMV IDE أو إعادة الضبط لإعدادات المصنع؛ أما واجهة برمجة التطبيقات منخفضة المستوى في Python أدناه فهي مخصصة للاستخدام المتقدم/البرمجي.

ذاكرة الفلاش الداخلية

على أجهزة OpenMV Cam المبنية على STM32 توفّر الفئة pyb.Flash الوصول إلى ذاكرة الفلاش الداخلية. وعلى الألواح التي تحتوي على ذاكرة فلاش خارجية أكبر ستستخدم تلك بدلًا من ذلك. ينبغي دائمًا تحديد الوسيط المسمى start، أي pyb.Flash(start=0).

ملاحظة: للتوافق مع الإصدارات السابقة، عند الإنشاء دون أي وسائط (أي pyb.Flash())، فإنها تطبّق فقط واجهة الكتل البسيطة وتعكس الجهاز الافتراضي المقدَّم لتخزين 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 بحيث، على الألواح التي تعرض نظام الملفات عبر تخزين USB الكتلي، يستطيع الحاسوب المضيف قراءته والكتابة عليه دون أي برامج تشغيل إضافية.

إن نظام FAT غير متسامح مع انقطاع التيار أثناء عمليات الكتابة، مما قد يؤدي إلى تلف نظام الملفات. أخرِج/أزِل تثبيت محرك الأقراص على المضيف قبل إيقاف تشغيل الكاميرا، وفضّل بطاقة SD على ذاكرة الفلاش الداخلية للبيانات التي يكتبها البرنامج النصي.

على أجهزة 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')