Bir Modülün Uygulanması

Bu bölüm, MicroPython’da bir çekirdek modülün nasıl uygulanacağını ayrıntılı olarak açıklar. MicroPython modülleri aşağıdakilerden biri olabilir:

  • Yerleşik modül: MicroPython deposunun bir parçası olan genel bir modül.

  • Kullanıcı modülü: Kendi deponuzda veya özel kod tabanınızda tuttuğunuz, belirli projeniz için yararlı olan bir modül.

  • Dinamik modül: Çalışma zamanında cihazınıza dağıtılabilen ve içe aktarılabilen bir modül.

MicroPython’da bir modül aşağıdaki konumlardan birinde uygulanabilir:

  • py/: Çekirdek CPython işlevselliğini yansıtan bir çekirdek kütüphane.

  • extmod/: Birden fazla port arasında paylaşılan, CPython’a veya MicroPython’a özgü bir modül.

  • ports/<port>/: Porta özgü bir modül.

Not

Bu bölüm, py/ içinde uygulanan modülleri veya çekirdek modülleri açıklar. Harici bir modülün uygulanmasına ilişkin ayrıntılar için MicroPython’u C ile Genişletme bölümüne bakın. Porta özgü modüllere ilişkin ayrıntılar için MicroPython’u Taşıma bölümüne bakın.

Bir çekirdek modülün uygulanması

CPython gibi, MicroPython’un da import deyimleri aracılığıyla erişilebilen çekirdek yerleşik modülleri vardır. Buna bir örnek, Bellek Yönetimi bölümünde ele alınan gc modülüdür.

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

MicroPython’un io, array vb. gibi başka birkaç yerleşik standart/çekirdek modülü daha vardır. Yeni bir çekirdek modül eklemek birkaç değişiklik gerektirir.

İlk olarak, py/ dizininde C dosyasını oluşturun. Bu örnekte, modsubsystem.c dosyasında varsayımsal yeni bir subsystem modülü ekliyoruz:

#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

Uygulama, modülle ilgili tüm fonksiyonların bir tanımını içerir ve fonksiyonları modülün mp_module_subsystem_globals_table içindeki global tablosuna ekler. Ayrıca mp_module_subsystem ile modül nesnesini oluşturur. Modül daha sonra MP_REGISTER_MODULE makrosu aracılığıyla daha geniş sisteme kaydedilir.

Değiştirilmiş MicroPython derlenip çalıştırıldıktan sonra, modül artık içe aktarılabilir olmalıdır:

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

info() fonksiyonumuz şu anda yalnızca tek bir sayı döndürüyor, ancak herhangi bir şey yapacak şekilde genişletilebilir. Benzer şekilde, bu yeni modüle daha fazla fonksiyon eklenebilir.