Triển Khai Module¶
Chương này trình bày chi tiết cách triển khai một module lõi trong MicroPython. Các module MicroPython có thể là một trong các loại sau:
Module tích hợp: Một module chung là một phần của kho lưu trữ MicroPython.
Module người dùng: Một module hữu ích cho dự án cụ thể của bạn mà bạn duy trì trong kho lưu trữ của riêng mình hoặc cơ sở mã riêng tư.
Module động: Một module có thể được triển khai và nhập vào thiết bị của bạn lúc runtime.
Một module trong MicroPython có thể được triển khai ở một trong các vị trí sau:
py/: Một thư viện lõi phản chiếu chức năng CPython lõi.
extmod/: Một module dành riêng cho CPython hoặc MicroPython được chia sẻ trên nhiều port.
ports/<port>/: Một module dành riêng cho port.
Ghi chú
Chương này mô tả các module được triển khai trong py/ hoặc các module lõi. Xem Mở rộng MicroPython bằng C để biết chi tiết về triển khai module bên ngoài. Để biết chi tiết về các module dành riêng cho port, xem Chuyển MicroPython sang nền tảng mới.
Triển khai module lõi¶
Giống như CPython, MicroPython có các module tích hợp lõi có thể được truy cập qua các câu lệnh import. Ví dụ là module gc được thảo luận trong Quản lý Bộ nhớ.
>>> import gc
>>> gc.enable()
>>>
MicroPython có một số module tiêu chuẩn/lõi tích hợp khác như io, array, v.v. Thêm một module lõi mới liên quan đến một số sửa đổi.
Đầu tiên, tạo tệp C trong thư mục py/. Trong ví dụ này, chúng ta đang thêm một module mới giả định subsystem trong tệp modsubsystem.c:
#include "py/builtin.h"
#include "py/runtime.h"
#if MICROPY_PY_SUBSYSTEM
// info()
static mp_obj_t py_subsystem_info(void) {
return MP_OBJ_NEW_SMALL_INT(42);
}
MP_DEFINE_CONST_FUN_OBJ_0(subsystem_info_obj, py_subsystem_info);
static const mp_rom_map_elem_t mp_module_subsystem_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_subsystem) },
{ MP_ROM_QSTR(MP_QSTR_info), MP_ROM_PTR(&subsystem_info_obj) },
};
static MP_DEFINE_CONST_DICT(mp_module_subsystem_globals, mp_module_subsystem_globals_table);
const mp_obj_module_t mp_module_subsystem = {
.base = { &mp_type_module },
.globals = (mp_obj_dict_t *)&mp_module_subsystem_globals,
};
MP_REGISTER_MODULE(MP_QSTR_subsystem, mp_module_subsystem);
#endif
Triển khai bao gồm định nghĩa của tất cả các hàm liên quan đến module và thêm các hàm vào bảng toàn cục của module trong mp_module_subsystem_globals_table. Nó cũng tạo đối tượng module với mp_module_subsystem. Module sau đó được đăng ký với hệ thống rộng hơn thông qua macro MP_REGISTER_MODULE.
Sau khi xây dựng và chạy MicroPython đã được sửa đổi, module bây giờ có thể được nhập:
>>> import subsystem
>>> subsystem.info()
42
>>>
Hàm info() của chúng ta hiện tại chỉ trả về một số đơn nhưng có thể được mở rộng để làm bất cứ điều gì. Tương tự, có thể thêm nhiều hàm hơn vào module mới này.