การดำเนินการโมดูล

บทนี้อธิบายรายละเอียดวิธีดำเนินการโมดูลหลักใน MicroPython โมดูล MicroPython สามารถเป็นหนึ่งในประเภทต่อไปนี้:

  • โมดูล Built-in: โมดูลทั่วไปที่เป็นส่วนหนึ่งของที่เก็บข้อมูล MicroPython

  • โมดูลผู้ใช้: โมดูลที่มีประโยชน์สำหรับโปรเจกต์เฉพาะของคุณที่คุณดูแลในที่เก็บข้อมูลของตัวเองหรือ codebase ส่วนตัว

  • โมดูล Dynamic: โมดูลที่สามารถนำไปใช้และนำเข้าได้ที่ runtime บนอุปกรณ์ของคุณ

โมดูลใน MicroPython สามารถดำเนินการได้ในหนึ่งในตำแหน่งต่อไปนี้:

  • py/: ไลบรารีหลักที่สะท้อนฟังก์ชันการทำงานหลักของ CPython

  • extmod/: โมดูลเฉพาะ CPython หรือ MicroPython ที่แชร์ข้ามพอร์ตหลายรายการ

  • ports/<port>/: โมดูลเฉพาะพอร์ต

Note

บทนี้อธิบายโมดูลที่ดำเนินการใน py/ หรือโมดูลหลัก ดู การขยาย MicroPython ด้วย C สำหรับรายละเอียดการดำเนินการโมดูลภายนอก สำหรับรายละเอียดเกี่ยวกับโมดูลเฉพาะพอร์ต ดู การพอร์ต MicroPython

การดำเนินการโมดูลหลัก

เช่นเดียวกับ CPython, MicroPython มีโมดูล builtin หลักที่สามารถเข้าถึงได้ผ่าน import statements ตัวอย่างคือโมดูล gc ที่กล่าวถึงใน การจัดการหน่วยความจำ

>>> import gc
>>> gc.enable()
>>>

MicroPython มีโมดูลมาตรฐาน/หลัก builtin อื่น ๆ อีกหลายตัวเช่น io, array เป็นต้น การเพิ่มโมดูลหลักใหม่เกี่ยวข้องกับการปรับเปลี่ยนหลายอย่าง

ขั้นแรก สร้างไฟล์ C ในไดเรกทอรี py/ ในตัวอย่างนี้เรากำลังเพิ่มโมดูลใหม่สมมุติ subsystem ในไฟล์ 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

การดำเนินการรวมถึงนิยามของฟังก์ชันทั้งหมดที่เกี่ยวข้องกับโมดูลและเพิ่มฟังก์ชันไปยังตารางทั่วโลกของโมดูลใน mp_module_subsystem_globals_table นอกจากนี้ยังสร้างอ็อบเจกต์โมดูลด้วย mp_module_subsystem โมดูลจะถูกลงทะเบียนกับระบบที่กว้างกว่าผ่าน macro MP_REGISTER_MODULE

หลังจากสร้างและรัน MicroPython ที่ปรับเปลี่ยนแล้ว โมดูลควรนำเข้าได้ตอนนี้:

>>> import subsystem
>>> subsystem.info()
42
>>>

ฟังก์ชัน info() ของเราตอนนี้คืนค่าเพียงตัวเลขเดียว แต่สามารถขยายให้ทำอะไรก็ได้ ในทำนองเดียวกัน สามารถเพิ่มฟังก์ชันเพิ่มเติมในโมดูลใหม่นี้ได้