microPython的源码解析之 modgc.c

本文详细介绍了MicroPython的垃圾回收模块modgc.c,包括关键函数的功能,如手动触发垃圾回收、启用/禁用自动回收,以及查询内存使用情况。通过对这些功能的解析,有助于理解MicroPython内存管理及Python解析器的核心逻辑。此外,文中还提到了一些C语言在NI-Motion运动控制中的应用示例。
摘要由CSDN通过智能技术生成

MicroPython 是一种适用于微控制器和其他受限环境的 Python 编程语言的实现。它旨在提供与 Python 3 语言的紧密兼容,同时考虑到内存和计算资源的限制。MicroPython 库是这门语言的核心组成部分,提供了一系列的模块和函数,使得开发者能够在硬件上执行各种任务。
下面将通过系列文章,逐一解读microPython,以便让读者了解掌握microPython的整个核心逻辑.,以便读者可以透过这个Python的最小内核,掌握Python解析器的核心实现逻辑,学习世界上最优秀的源码设计之一.

microPython 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);
    }
  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

openwin_top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值