四、MicroPython移植到任意平台(GC垃圾回收)

目录

一、gc垃圾回收

1、gc粗略原理

2、gc堆初始化

​编辑

二、MicroPython 打开gc垃圾回收功能和接口

1、打开相关宏

2、编译报错问题

三、MicroPython gc功能接口调用

1、运行结果

四、总结


note:本章内容依赖本专栏前几篇文章,若有疑问请先阅读本专栏前几篇文章。

如下:

一、MicroPython移植到任意平台(简介以及源码裁剪)_BIN-XYB的博客-CSDN博客

二、MicroPython移植到任意平台(PC上编译)_BIN-XYB的博客-CSDN博客

三、MicroPython移植到任意平台(编译篇)_BIN-XYB的博客-CSDN博客

一、gc垃圾回收

1、gc粗略原理

Python解释器,在执行python脚本时,会将一些变量或者方法保存在运行堆中,当运行一段时间后,此变量或者方法不会被使用,那么就需要将此变量或者方法从运行堆中删除,这个过程叫做垃圾回收,以达到释放内存的目的。

MicPython释放内存的原理比较粗暴,是将当前任务栈中数据和运行堆中变量或者方法做对比,如果在任务栈中有当前变量或者方法的引用地址,那么表示此变量或者方法仍将被使用,不需要回收,反之则进行内存回收。

MicroPython垃圾回收源码主要集中在py\gc.c中,调用void gc_collect(void)或者在创建python对象的时候 触发垃圾回收。

2、gc堆初始化

gc堆主要是用来存放Python运行过程中变量和方法,垃圾回收就是从标记这里的已用空间为未用状态,堆的大小很重要,决定了能运行的脚本量的大小,堆大小要根据脚本代码量调整,太大会造成空间浪费,太小会导致堆内存不足。

ports/minimal源码最开始是用大数组开辟堆空间,我对他进行了改造,使用系统malloc(系统底层定义接口,根据不同系统变化),示例如下:

    #define PY_HEAP_SIZE (1024 * 3)
    py_heap = (char *)b_hal_malloc(PY_HEAP_SIZE);
    if(py_heap == NULL)
    {
        LOG_ERROR("malloc py_heap fail\r\n");
    }
    gc_init(py_heap, py_heap + PY_HEAP_SIZE);

修改位置如下图

二、MicroPython 打开gc垃圾回收功能和接口

1、打开相关宏

#define MICROPY_ENABLE_GC                 (1)//该宏表示GC支持功能,默认打开

#define MICROPY_PY_GC                     (1)//该宏表示GC功能接口打开,默认关闭,打开后通过python脚本可触发垃圾回收,也可使能和失能垃圾回收功能。

2、编译报错问题

打开宏后,编译报错如下:错误描述为,MP_QSTR_gc等 gc接口相关功能QSTR字符未定义,QSTR字符全部定义在genhdr\qstrdefs.generated.h文件中

解决办法:在genhdr\qstrdefs.generated.h中增加gc相关QSTR字符串的定义,如下,关于字符串如何生成接下来章节会讲到,这里先用现成的

QDEF(MP_QSTR_gc, 28257, 2, "gc")
QDEF(MP_QSTR_collect, 26011, 7, "collect")
QDEF(MP_QSTR_disable, 30353, 7, "disable")
QDEF(MP_QSTR_enable, 56836, 6, "enable")
QDEF(MP_QSTR_isenabled, 58778, 9, "isenabled")
QDEF(MP_QSTR_mem_free, 25291, 8, "mem_free")
QDEF(MP_QSTR_mem_alloc, 11090, 9, "mem_alloc")

添加后如下

3、注册模块

在文件 genhdr\moduledefs.h 注册gc模块

三、MicroPython gc功能接口调用

1、运行结果

编译通过后上机运行,结果如下:

如上图可见,gc模块可以被成功调用。

四、总结

有问题请指出,如遇解决不了的问题请评论或私信,感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值