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

目录

一、gc垃圾回收

1、gc粗略原理

2、gc堆初始化

​编辑

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

1、打开相关宏

2、编译报错问题

三、MicroPython gc功能接口调用

1、运行结果

四、总结


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

如下:

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

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

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

一、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模块可以被成功调用。

四、总结

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

<think>好的,用户想了解如何将MicroPython移植到其他硬件平台,特别是硬件平台的适配步骤。我需要根据提供的引用资料,整理出一个清晰的移植流程。首先,用户提供的引用中有个相关资源,其中引用1提到了源码裁剪,引用2和3提到了移植STM32的具体步骤,包括解决编译错误和修改配置文件,引用4讨论了垃圾回收移植。 首先,我需要确定移植的主要步骤。根据引用3,移植STM32的过程包括准备硬件、获取源码、配置编译环境、解决编译错误、修改配置文件、集成FreeRTOS,以及测试和优化。这些步骤应该可以推广到其他硬件平台,但可能需要调整具体细节。 接下来,用户的问题是关于通用的硬件平台适配,所以需要将这些步骤抽象化。例如,硬件准备阶段需要确认目标平台的处理器架构、外设支持等。源码获取和裁剪可能需要根据目标平台的功能需求来调整,比如移除不需要的模块以节省空间。 编译环境的配置可能因平台而异,比如使用不同的交叉编译工具链。解决编译错误时,可能需要修改与硬件相关的底层驱动代码,如GPIO、时钟配置等。引用3中提到需要调整引脚映射和时钟初始化代码,这可能是一个通用步骤。 修改配置文件方面,引用3提到需要修改mpconfigport.h和mpconfigboard.h,这应该是MicroPython移植的标准步骤,用于启用或禁用特定功能,以及定义板级特定的设置。集成实时操作系统如FreeRTOS可能适用于需要多任务处理的平台,但如果是裸机环境,可能需要调整任务调度部分。 测试阶段需要验证基本功能,如GPIO控制,如引用2中提到的点亮LED灯,这是一个常见的起点。性能优化可能涉及内存管理和垃圾回收,引用4提到需要根据硬件调整GC参数,比如堆大小和回收策略。 此外,引用1提到MicroPython是专为微控制器设计的,所以移植时要考虑资源限制,合理裁剪模块。引用2中的教程建议从简单应用开始,逐步深入,这也是一个实用的建议。 需要确保回答结构清晰,分步骤说明,并引用相关的参考资料。同时,生成的相关问题应围绕移植的难点、优化方法、调试工具和应用场景展开,帮助用户进一步了解。</think>### MicroPython移植到其他硬件平台的步骤指南 #### 一、硬件平台准备 1. **确认处理器架构** MicroPython支持ARM Cortex-M、RISC-V、Xtensa等架构。需确认目标平台的CPU类型、内存容量(建议≥256KB Flash/16KB RAM)及外设(如GPIO、UART、SPI)兼容性[^3]。 2. **搭建开发环境** 安装交叉编译工具链(如arm-none-eabi-gcc),克隆MicroPython源码仓库: ```bash git clone https://github.com/micropython/micropython.git ``` #### 二、源码裁剪与配置 1. **模块裁剪** 在`ports/`目录下新建目标平台子目录(如`myboard`),通过修改`mpconfigport.h`关闭不需要的功能: ```c // 禁用网络模块 #define MICROPY_PY_NETWORK 0 // 启用GPIO基础功能 #define MICROPY_HW_ENABLE_GPIO 1 ``` 2. **板级定义** 创建`mpconfigboard.h`定义硬件参数,例如STM32F407的时钟配置: ```c #define MICROPY_HW_CLK_PLLM (25) #define MICROPY_HW_CLK_PLLN (336) ``` #### 三、驱动层移植 1. **外设驱动实现** - **GPIO**:在`modmachine.c`中实现`machine.Pin`类的底层读写函数 - **定时器**:重写`mphalport.h`中的延时函数`mp_hal_delay_ms()` ```c void mp_hal_delay_ms(uint32_t ms) { HAL_Delay(ms); // 调用HAL库实现 } ``` 2. **内存管理适配** 修改`gc_collect()`函数实现垃圾回收,根据硬件调整堆大小(引用[^4]): ```c #define HEAP_SIZE (16 * 1024) static char heap[HEAP_SIZE]; ``` #### 、编译与调试 1. **编译命令配置** 编写Makefile指定编译器与链接脚本: ```makefile CROSS_COMPILE = arm-none-eabi- LDSCRIPT = stm32f405.ld ``` 2. **烧录与测试** 使用OpenOCD或ST-Link工具烧录固件,通过REPL测试基础功能: ```python >>> import machine >>> led = machine.Pin(25, machine.Pin.OUT) >>> led.toggle() # 应观察到LED状态变化 ``` #### 五、高级功能集成 1. **实时系统支持** 若需支持FreeRTOS,需在`port.c`中实现任务调度接口,并修改`mpthreadport.h`。 2. **性能优化** - 启用编译器优化选项`-O2` - 使用`-fsingle-precision-constant`减少浮点运算开销
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值