14.2.2.2. Tạo ảnh ROMFS¶
Một ảnh ROMFS là hệ thống tệp chỉ đọc trên flash mà runtime tự động gắn kết tại /rom. Nó giải quyết vấn đề tài nguyên mà trang trước kết thúc với: tệp mô hình (ML), bảng nhãn, cấu hình JSON, mẫu ảnh -- bất kỳ thứ gì ứng dụng mở và đọc nhưng không bao giờ ghi -- được đưa vào build mà không phải trả giá của việc nhúng dưới dạng Python literals.
Ba điều làm cho ROMFS là công cụ phù hợp cho tài nguyên xuất xưởng:
Hệ thống tệp là một phần của ảnh firmware. Người dùng cuối không thể xóa tệp khỏi
/rom, chỉnh sửa, hay thay thế bằng tệp của riêng họ.Các tệp trong
/romcó thể truy cập tại chỗ. Các consumer như modulemltải tệp mô hình có chế độ xem trực tiếp vào flash mà không cần sao chép RAM -- một mô hình nhiều megabyte trên/rom"tải" về cơ bản miễn phí, trong khi cùng tệp đó trên/sdcardđược đọc vào RAM tại thời điểm tải và ở đó suốt thời gian tham chiếu tồn tại.open()+readthông thường sao chép theo yêu cầu: mỗi lần gọiread(n)sao chépnbyte từ flash sang RAM tại thời điểm gọi, vớiread()không có tham số yêu cầu toàn bộ tệp./romvà/rom/libđược thêm vàosys.pathkhi khởi động. Các gói Python được đưa vào ảnh có thể import theo tên; không cần gì đặc biệt tại nơi gọi.
14.2.2.2.1. Tạo ảnh¶
Ảnh ROMFS được tạo, chỉnh sửa, và nạp qua IDE. Hãy sử dụng nó làm nguồn thông tin chính xác cho nội dung của mọi phân vùng ROMFS xuất xưởng.
Lý do điều này quan trọng: tệp mô hình đi kèm với yêu cầu căn chỉnh mà bộ nạp thực thi lúc runtime. Tệp .tflite phải được đệm đến ranh giới 16 byte, và NPU của N6 yêu cầu căn chỉnh 32 byte cho các mô hình đã biên dịch. IDE áp dụng đệm đó tự động khi ghi ảnh. Các công cụ duyệt cây nguồn mà không áp dụng đệm -- đặc biệt là mpremote romfs -- tạo ra ảnh gắn kết sạch nhưng các mô hình của nó thất bại tại lần gọi suy luận đầu tiên.
Trình soạn thảo ROMFS của IDE là chế độ xem tương tác về nội dung của ảnh. Các tệp và thư mục có thể được thêm, đổi tên, và xóa trong bộ nhớ; lưu sẽ ghi kết quả ra dưới dạng tệp .img sẵn sàng để nạp. Cấu trúc điển hình cho ứng dụng xuất xưởng một mô hình cùng với một số tài nguyên và gói Python trông như:
model.tflite
labels.txt
config.json
templates/
calibration.jpg
lib/
mylib/
__init__.py
helpers.py
Mẹo
Cả IDE và mpremote đều biên dịch chéo các tệp .py thành bytecode .mpy khi đưa vào ảnh ROMFS, nên camera import chúng mà không phải trả chi phí phân tích cú pháp tại thời điểm tải. Các tệp nguồn trong trình soạn thảo vẫn là .py; ảnh chứa .mpy.
Khi ảnh đã được nạp, cây tệp hiển thị từ MicroPython tại /rom/
>>> import os
>>> os.listdir('/rom')
['model.tflite', 'labels.txt', 'config.json', 'templates', 'lib']
>>> import mylib
>>> mylib.helpers
<module 'mylib.helpers' from '/rom/lib/mylib/helpers.mpy'>
14.2.2.2.2. Phần lớn ứng dụng nằm trong ROMFS¶
ROMFS là nơi phù hợp cho hầu hết mọi thứ một ứng dụng xuất xưởng: các thư viện nó import, các tệp mô hình nó tải, cấu hình nó đọc, bất kỳ tài nguyên nào mà đầu ra đến từ một công cụ build phát ra cây tệp (bộ chuyển đổi mô hình, pipeline ảnh, packer tài nguyên), và -- quan trọng -- bản thân mã ứng dụng.
Phần module đóng băng nên giữ nhỏ: boot.py cho thiết lập trước REPL, main.py là điểm vào mỏng, và chỉ những thư viện mà camera thực sự không thể khởi động mà không có. Mọi thứ khác vào ROMFS, nơi việc lặp lại trên đó chỉ là lưu .img mới từ IDE và reflash -- không cần rebuild firmware, không cần toolchain để làm điều đó.
Mẫu xuất hiện là một main.py không làm gì ngoài việc ủy quyền vào ứng dụng nằm trong ROMFS:
# main.py (frozen)
import app
app.run()
# /rom/app/__init__.py (in ROMFS)
def run():
...
Một thay đổi đối với app là một chỉnh sửa ROMFS và một lần reflash. Build firmware không thay đổi trong suốt vòng đời sản phẩm trừ khi thứ gì đó ở phía đóng băng thực sự cần thay đổi.