【雕爷学编程】MicroPython手册之内存优化 frozen模块

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述
MicroPython的frozen是一种将Python代码“冻结”到固件中的功能,作为从文件系统加载代码的一种替代方案。这样做有以下好处:

代码被预编译为字节码,避免了在加载时编译Python源代码的需要。
字节码可以直接从ROM(即闪存)执行,而不需要复制到RAM中。同样,任何常量对象(如字符串、元组等)也从ROM加载。这可以使得更多的内存可用于应用程序。
在没有文件系统的设备上,这是加载Python代码的唯一方式。

MicroPython的frozen的主要特点是:

它可以通过一个“清单”文件来列出要冻结到固件中的Python文件,清单文件是一个包含一系列函数调用的Python文件,可以在板子定义中编写,也可以编写一个独立的清单文件,并与现有的板子定义一起使用。
它可以定义对来自micropython-lib的库以及文件系统上的Python文件的依赖关系,以及对其他清单文件的依赖关系。
它可以让用户在Python中创建和操作各种类型的对象,如数字、字符串、列表、字典、函数、模块等。

MicroPython的frozen的应用场景是:

在MicroPython中实现与硬件设备的交互,如控制LED灯、电机、传感器等。
在MicroPython中实现基于硬件设备的应用,如物联网设备、远程控制、消息推送等。
在MicroPython中编写一些复杂或不常变化的模块,以减少加载时间和内存占用。

MicroPython的frozen需注意事项是:

使用frozen时要注意固件大小的限制,避免超出闪存容量或影响其他功能。
使用frozen时要注意固件编译和更新的时间,避免在开发过程中降低效率。
使用frozen时要注意不同端口之间的差异和兼容性问题,避免在移植代码时出现错误或异常。

以下是MicroPython的frozen几个实际运用程序案例:

案例一:使用frozen将micropython-lib中的urequests模块冻结到ESP8266固件中,并使用它向IFTTT发送Webhook事件触发通知。

# 创建一个清单文件manifest.py,内容如下:
freeze("$MPY_LIB_DIR/urequests", opt=3)

# 在make命令行中指定清单文件:
$ make BOARD=ESP8266 FROZEN_MANIFEST=/path/to/manifest.py

# 在ESP8266上运行以下代码:
import urequests

# IFTTT Webhook事件名称
event = 'test'
# IFTTT Webhook密钥
key = 'your_key'
# IFTTT Webhook URL
url = 'https://maker.ifttt.com/trigger/{}/with/key/{}'.format(event, key)
# IFTTT Webhook数据(可选)
data = {'value1': 'Hello', 'value2': 'World'}
# 发送POST请求
response = urequests.post(url, json=data)
# 打印响应状态码和原因
print(response.status_code, response.reason)

案例二:使用frozen将自定义的温度传感器类冻结到pyboard固件中,并使用它读取温度值。2

# 创建一个自定义类temperature_sensor.py,内容如下:
import machine

class TemperatureSensor:
    # 定义初始化方法
    def __init__(self, pin):
        # 创建一个ADC对象,并保存为属性
        self.adc = machine.ADC(pin)
    # 定义读取温度方法
    def read_temperature(self):
        # 读取ADC值,并转换为摄氏度
        value = self.adc.read()
        return value * 0.1 - 50

# 创建一个清单文件manifest.py,内容如下:
freeze("/path/to/temperature_sensor.py", opt=3)

# 在make命令行中指定清单文件:
$ make BOARD=PYBV11 FROZEN_MANIFEST=/path/to/manifest.py

# 在pyboard上运行以下代码:
import temperature_sensor

# 创建一个温度传感器对象,连接到X1引脚
sensor = temperature_sensor.TemperatureSensor('X1')
# 读取温度值,并打印
temp = sensor.read_temperature()
print(temp)

案例三:使用frozen将micropython-lib中的math模块冻结到WiPy固件中,并使用它计算圆周率的近似值。

# 创建一个清单文件manifest.py,内容如下:
freeze("$MPY_LIB_DIR/math", opt=3)

# 在make命令行中指定清单文件:
$ make BOARD=WIPY FROZEN_MANIFEST=/path/to/manifest.py

# 在WiPy上运行以下代码:
import math

# 定义一个函数,使用莱布尼茨级数计算圆周率的近似值
def pi_approx(n):
    # 初始化和
    s = 0
    # 循环n次
    for k in range(n):
        # 计算每一项的值,并累加到和中
        s += (-1)**k / (2*k + 1)
    # 返回和乘以4的结果
    return s * 4

# 调用函数,计算1000项的圆周率近似值,并打印
pi = pi_approx(1000)
print(pi)
# 打印math模块中的圆周率常量,并比较误差
print(math.pi)
print(abs(pi - math.pi))

案例四:内置资源文件:

> # 导入frozen模块 import frozen
> 
> # 打开并读取内置资源文件 with open(frozen.get("data.txt"), "r") as file:
>     data = file.read()
> 
> # 输出资源文件内容 print(data)

在这个例子中,我们使用"frozen"模块导入了内置的资源文件。通过使用"frozen.get()"函数,我们可以获取内置资源文件的路径。然后,我们使用标准的文件操作函数打开并读取了资源文件的内容。最后,我们将资源文件的内容打印出来。

案例五:内置字体文件:

# 导入frozen模块
import frozen

# 加载内置字体文件
font = frozen.Font("font.ttf")

# 使用字体文件绘制文本
display.draw_text("Hello, World!", 0, 0, font)

# 显示文本
display.show()

在这个例子中,我们使用"frozen"模块导入了内置的字体文件。通过使用"frozen.Font()"函数,我们可以加载内置字体文件。然后,我们使用加载的字体文件在显示设备上绘制了文本。最后,我们通过"display.show()"函数将绘制的文本显示出来。

案例六:内置图像文件:

# 导入frozen模块
import frozen

# 加载内置图像文件
image = frozen.Image("image.bmp")

# 显示图像
display.show(image)

在这个例子中,我们使用"frozen"模块导入了内置的图像文件。通过使用"frozen.Image()"函数,我们可以加载内置图像文件。然后,我们通过"display.show()"函数将加载的图像显示出来。

icroPython中的"frozen"是一个特殊的功能,用于将Python代码和资源文件编译成固化的字节码,以便在MicroPython设备上运行。以下是三个实际运用程序案例,展示了"frozen"功能的使用:

  1. 冻结模块和库

通过将常用的模块和库固化到固件中,可以减少运行时的内存占用,并加快代码的执行速度。例如,您可以将常用的网络库、传感器库或者自定义的功能模块冻结到固件中。这样,在MicroPython设备上运行代码时,这些模块和库将直接从固件中加载,而无需额外的存储空间和加载时间。

  1. 冻结配置文件

如果您的应用程序需要使用配置文件来存储参数和设置,您可以将配置文件编译为固化的字节码。这样,您可以避免在设备上读取和解析外部文件的开销,并确保配置文件在运行时始终可用。

  1. 冻结资源文件

如果您的应用程序需要使用特定的资源文件(如图像、音频文件等),您可以将这些资源文件编译为固化的字节码。这样,您可以将资源文件嵌入到固件中,并在运行时直接访问这些资源,而无需依赖外部文件系统。

以上是三个实际运用程序案例,展示了MicroPython中"frozen"功能的使用。通过将代码和资源固化到固件中,您可以提高代码的性能和可移植性。

请注意,"frozen"功能的具体实现方式可能因不同的MicroPython版本和设备而有所不同。详细的使用方法和步骤,请参考您所使用的MicroPython版本和设备的文档或指南。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值