MicroPython 是一种适用于微控制器和其他受限环境的 Python 编程语言的实现。它旨在提供与 Python 3 语言的紧密兼容,同时考虑到内存和计算资源的限制。MicroPython 库是这门语言的核心组成部分,提供了一系列的模块和函数,使得开发者能够在硬件上执行各种任务。
下面将通过系列文章,逐一解读microPython,以便让读者了解掌握microPython的整个核心逻辑.,以便读者可以透过这个Python的最小内核,掌握Python解析器的核心实现逻辑,学习世界上最优秀的源码设计之一.
这段代码是MicroPython中垃圾回收模块的一部分,它定义了垃圾回收的相关函数和模块。通过这些函数,用户可以手动触发垃圾回收,启用或禁用自动垃圾回收,查询垃圾回收器的状态,以及获取内存的使用情况等。这些功能对于管理MicroPython运行时的内存使用非常重要,可以帮助提高程序的性能和稳定性。
#include "py/mpstate.h" // 导入MicroPython的状态管理模块
#include "py/obj.h" // 导入MicroPython的对象处理模块
#include "py/gc.h" // 导入MicroPython的垃圾回收模块
#if MICROPY_PY_GC && MICROPY_ENABLE_GC
// 垃圾回收相关的函数定义和模块注册
// collect(): 执行一次垃圾回收操作
static mp_obj_t py_gc_collect(void) {
gc_collect(); // 调用垃圾回收函数
#if MICROPY_PY_GC_COLLECT_RETVAL
// 如果定义了MICROPY_PY_GC_COLLECT_RETVAL,则返回回收的内存大小
return MP_OBJ_NEW_SMALL_INT(MP_STATE_MEM(gc_collected));
#else
// 否则返回None
return mp_const_none;
#endif
}
MP_DEFINE_CONST_FUN_OBJ_0(gc_collect_obj, py_gc_collect); // 定义collect函数的对象
// disable(): 关闭垃圾回收器
static mp_obj_t gc_disable(void) {
MP_STATE_MEM(gc_auto_collect_enabled) = 0; // 设置自动垃圾回收使能标志为0,即关闭
return mp_const_none; // 返回None
}
MP_DEFINE_CONST_FUN_OBJ_0(gc_disable_obj, gc_disable); // 定义disable函数的对象
// enable(): 启用垃圾回收器
static mp_obj_t gc_enable(void) {
MP_STATE_MEM(gc_auto_collect_enabled) = 1; // 设置自动垃圾回收使能标志为1,即启用
return mp_const_none; // 返回None
}
MP_DEFINE_CONST_FUN_OBJ_0(gc_enable_obj, gc_enable); // 定义enable函数的对象
// isenabled(): 判断垃圾回收器是否启用
static mp_obj_t gc_isenabled(void) {
return mp_obj_new_bool(MP_STATE_MEM(gc_auto_collect_enabled)); // 返回垃圾回收器的启用状态
}
MP_DEFINE_CONST_FUN_OBJ_0(gc_isenabled_obj, gc_isenabled); // 定义isenabled函数的对象
// mem_free(): 返回可用堆内存的大小
static mp_obj_t gc_mem_free(void) {
gc_info_t info; // 定义垃圾回收信息结构体
gc_info(&info); // 获取垃圾回收信息
#if MICROPY_GC_SPLIT_HEAP_AUTO
// 如果定义了MICROPY_GC_SPLIT_HEAP_AUTO,则返回更多有用的信息
return MP_OBJ_NEW_SMALL_INT(info.free + info.max_new_split);
#else
return MP_OBJ_NEW_SMALL_INT(info.free); // 否则只返回空闲内存大小
#endif
}
MP_DEFINE_CONST_FUN_OBJ_0(gc_mem_free_obj, gc_mem_free); // 定义mem_free函数的对象
// mem_alloc(): 返回已分配的堆内存大小
static mp_obj_t gc_mem_alloc(void) {
gc_info_t info; // 定义垃圾回收信息结构体
gc_info(&info); // 获取垃圾回收信息
return MP_OBJ_NEW_SMALL_INT(info.used); // 返回已使用的内存大小
}
MP_DEFINE_CONST_FUN_OBJ_0(gc_mem_alloc_obj, gc_mem_alloc); // 定义mem_alloc函数的对象
#if MICROPY_GC_ALLOC_THRESHOLD
// threshold(): 设置或获取垃圾回收的分配阈值
static mp_obj_t gc_threshold(size_t n_args, const mp_obj_t *args) {
if (n_args == 0) {
// 如果没有参数,则返回当前的分配阈值
if (MP_STATE_MEM(gc_alloc_threshold) == (size_t)-1) {
return MP_OBJ_NEW_SMALL_INT(-1);
}
return mp_obj_new_int(MP_STATE_MEM(gc_alloc_threshold) * MICROPY_BYTES_PER_GC_BLOCK);
}