Làm việc với hệ thống tệp¶
Hướng dẫn này mô tả cách OpenMV Cam cung cấp hệ thống tệp trên thiết bị, cho phép sử dụng các phương thức I/O tệp Python chuẩn với bộ nhớ lưu trữ bền vững.
OpenMV Cam tạo cấu hình mặc định và tự động phát hiện, gắn kết hệ thống tệp chính khi khởi động, vì vậy hướng dẫn này chủ yếu hữu ích nếu bạn muốn phân vùng lại bộ nhớ flash, thay đổi loại hệ thống tệp, hoặc sử dụng thiết bị khối tùy chỉnh.
Hệ thống tệp được hỗ trợ bởi bộ nhớ flash nội bộ, hoặc bởi thẻ SD khi một thẻ được lắp vào.
VFS¶
MicroPython triển khai lớp Hệ thống Tệp Ảo (VFS) kiểu Unix. Tất cả các hệ thống tệp được gắn kết được kết hợp thành một hệ thống tệp ảo duy nhất, bắt đầu từ thư mục gốc /. Các hệ thống tệp được gắn kết vào các thư mục trong cấu trúc này, và khi khởi động, thư mục làm việc được đặt thành hệ thống tệp chính.
Trên OpenMV Cam, bộ nhớ flash nội bộ được gắn kết tại /flash và là thư mục làm việc. Nếu thẻ SD được lắp vào, nó được gắn kết tại /sdcard và trở thành thư mục làm việc thay thế.
Thiết bị khối¶
Thiết bị khối là một thực thể của lớp triển khai giao thức vfs.AbstractBlockDev.
Khi khởi động, OpenMV Cam cố gắng phát hiện hệ thống tệp trên bộ nhớ flash nội bộ (hoặc thẻ SD) và tự động cấu hình và gắn kết nó. Nếu không tìm thấy hệ thống tệp, một hệ thống tệp FAT trải dài toàn bộ flash sẽ được tạo. Để xóa hoặc định dạng lại hệ thống tệp trên bo mạch, cách đơn giản nhất là dùng OpenMV IDE hoặc đặt lại về trạng thái gốc; API Python cấp thấp bên dưới dành cho sử dụng nâng cao hoặc lập trình.
Bộ nhớ flash nội bộ¶
Trên các OpenMV Cam dựa trên STM32, lớp pyb.Flash cung cấp quyền truy cập vào bộ nhớ flash nội bộ. Trên các bo mạch có flash ngoài lớn hơn, nó sẽ sử dụng flash đó thay thế. Tham số từ khóa start luôn phải được chỉ định, tức là pyb.Flash(start=0).
Lưu ý: Để đảm bảo tương thích ngược, khi được khởi tạo không có đối số (tức là pyb.Flash()), nó chỉ triển khai giao diện khối đơn giản và phản ánh thiết bị ảo được trình bày cho lưu trữ khối USB (tức là nó bao gồm bảng phân vùng ảo ở đầu).
Thiết bị khối tùy chỉnh¶
Bạn cũng có thể tạo thiết bị khối của riêng mình bằng Python và gắn kết nó — ví dụ như đĩa RAM. Lớp sau đây triển khai một thiết bị khối đơn giản lưu trữ dữ liệu trong RAM bằng cách sử dụng 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
Nó có thể được sử dụng như sau:
import vfs
bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')
Sau khi gắn kết, hệ thống tệp có thể được sử dụng như bình thường từ mã Python, ví dụ:
with open('/ramdisk/hello.txt', 'w') as f:
f.write('Hello world')
print(open('/ramdisk/hello.txt').read())
Hệ thống tệp¶
OpenMV Cam định dạng bộ nhớ flash nội bộ dưới dạng FAT để các bo mạch hiển thị hệ thống tệp qua lưu trữ khối USB, máy tính chủ có thể đọc và ghi mà không cần trình điều khiển bổ sung.
FAT không chịu được sự cố mất điện trong khi ghi, điều này có thể dẫn đến hỏng hệ thống tệp. Hãy đẩy ra/ngắt kết nối ổ đĩa trên máy chủ trước khi tắt camera, và ưu tiên sử dụng thẻ SD thay vì bộ nhớ flash nội bộ cho dữ liệu mà tập lệnh ghi lại.
Trên các OpenMV Cam dựa trên STM32, bộ nhớ flash nội bộ có thể được định dạng lại từ 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')