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的内置模块gc是一个用于控制垃圾收集器的模块,它可以用来管理和优化动态内存的使用。它的主要特点是:
1、它可以使用enable()、disable()、collect()等方法来启用、禁用或手动触发垃圾收集,释放不再使用的内存空间。
2、它可以使用mem_alloc()、mem_free()等方法来获取当前分配和可用的堆内存的字节数,监测内存的使用情况。
3、它可以使用threshold()方法来设置或查询额外的垃圾收集阈值,即在分配了一定数量的字节后自动触发垃圾收集,以防止内存碎片化。
gc模块的应用场景有:
1、用于提高内存的利用率和效率,避免内存泄漏和溢出,提升程序的性能和稳定性。
2、用于调试和测试程序的内存消耗和分配情况,发现和解决内存相关的问题。
3、用于实现一些特殊的功能,例如弱引用、循环引用、对象终结器等。
gc模块的注意事项有:
1、gc模块依赖于MicroPython的垃圾收集器,它是一种标记-清除算法1,与CPython的垃圾收集器有所不同23,因此不能完全兼容CPython的gc模块。
2、gc模块使用的回调函数是硬件中断,需要尽量简短和快速,避免执行复杂或耗时的操作,以免影响系统性能和稳定性。
3、gc模块使用的垃圾收集阈值是一种启发式度量,其效果会因应用程序而异,以及阈值参数的最佳值。需要根据实际情况进行调整和测试。
以下是MicroPython的内置模块gc几个实际运用程序案例:
案例一:释放不再使用的对象
# 导入gc模块
import gc
# 创建一个列表对象,并赋值给变量a
a = [1, 2, 3]
# 打印当前分配的堆内存字节数
print('Before:', gc.mem_alloc())
# 删除变量a,解除对列表对象的引用
del a
# 手动触发垃圾收集,释放列表对象占用的内存空间
gc.collect()
# 打印当前分配的堆内存字节数
print('After:', gc.mem_alloc())
案例二:监测程序的内存消耗
# 导入gc模块
import gc
# 定义一个函数,用于创建一个大型字符串对象,并返回其长度
def create_string():
# 创建一个包含10000个字符'a'的字符串对象,并赋值给变量s
s = 'a' * 10000
# 返回字符串对象的长度
return len(s)
# 打印当前可用的堆内存字节数
print('Before:', gc.mem_free())
# 调用函数,并打印返回值
print('Length:', create_string())
# 打印当前可用的堆内存字节数
print('After:', gc.mem_free())
案例三:设置额外的垃圾收集阈值
# 导入gc模块
import gc
# 设置额外的垃圾收集阈值为1000字节
gc.threshold(1000)
# 打印当前阈值
print('Threshold:', gc.threshold())
# 创建一个列表对象,并赋值给变量a
a = [1, 2, 3]
# 打印当前分配的堆内存字节数
print('Before:', gc.mem_alloc())
# 循环10次,每次向列表对象追加一个元素
for i in range(10):
a.append(i)
# 打印当前分配的堆内存字节数
print('After:', gc.mem_alloc())
案例4:内存使用情况监控:
import gc
# 获取当前内存使用情况
mem_info = gc.mem_info()
# 输出内存使用信息
print("Total memory:", mem_info[0])
print("Used memory:", mem_info[1])
print("Free memory:", mem_info[2])
在这个示例中,我们使用gc模块的mem_info()函数获取当前的内存使用情况。该函数返回一个元组,包含总内存、已使用内存和可用内存的信息。我们通过索引访问元组的不同位置,并打印出内存使用信息。输出结果类似于:
Total memory: 123456
Used memory: 7890
Free memory: 116566
这样可以帮助我们监控和了解MicroPython程序的内存使用情况。
案例5:手动进行垃圾回收::
import gc
# 创建一些对象
a = [1, 2, 3]
b = "Hello, world!"
c = 12345
# 删除对象引用
del a, b, c
# 执行垃圾回收
gc.collect()
在这个示例中,我们使用gc模块的collect()函数手动触发垃圾回收。首先,我们创建了一些对象a、b和c,然后通过del语句删除了对这些对象的引用。最后,我们调用gc.collect()函数来执行垃圾回收操作,清理不再使用的内存空间。
案例六:禁用自动垃圾回收:
import gc
# 禁用自动垃圾回收
gc.disable()
# 创建一些对象
a = [1, 2, 3]
b = "Hello, world!"
c = 12345
# 删除对象引用
del a, b, c
# 启用自动垃圾回收
gc.enable()
在这个示例中,我们使用gc模块的disable()函数禁用了自动垃圾回收。然后,我们创建了一些对象a、b和c,并通过del语句删除了对这些对象的引用。最后,我们使用gc.enable()函数重新启用自动垃圾回收。禁用自动垃圾回收可以在某些情况下提高程序的性能,但需要注意及时手动进行垃圾回收,以避免内存泄漏和资源浪费。这些实际运用程序案例展示了使用MicroPython内置模块gc的功能。通过使用gc模块,可以监控内存使用情况、手动触发垃圾回收以及控制自动垃圾回收的行为。这些功能可以帮助我们更好地管理和优化MicroPython程序的内存资源。
案例七:手动触发垃圾回收
import gc
# 创建一些对象
obj1 = [1, 2, 3]
obj2 = "Hello, World!"
# 手动触发垃圾回收
gc.collect()
# 打印内存使用情况
print("内存使用情况:", gc.mem_free())
在这个例子中,我们导入了 gc 模块,并创建了两个对象 obj1 和 obj2。通过调用 gc.collect() 方法,我们手动触发了垃圾回收。最后,我们使用 gc.mem_free() 函数打印了内存的可用空间。
案例八:. 禁用自动垃圾回收
import gc
# 禁用自动垃圾回收
gc.disable()
# 创建一些对象
obj1 = [1, 2, 3]
obj2 = "Hello, World!"
# 手动触发垃圾回收
gc.collect()
# 打印内存使用情况
print("内存使用情况:", gc.mem_free())
在这个例子中,我们导入了 gc 模块,并通过调用 gc.disable() 方法禁用了自动垃圾回收。然后,我们创建了两个对象 obj1 和 obj2。即使我们手动调用了 gc.collect() 方法,由于禁用了自动垃圾回收,对象并不会被回收。最后,我们使用 gc.mem_free() 函数打印了内存的可用空间。
案例九:追踪内存分配和释放
import gc
# 追踪内存分配和释放
gc.set_debug(gc.DEBUG_STATS)
# 创建一些对象
obj1 = [1, 2, 3]
obj2 = "Hello, World!"
# 手动触发垃圾回收
gc.collect()
# 打印内存分配和释放的统计信息
print("内存分配和释放统计信息:", gc.garbage)
在这个例子中,我们导入了 gc 模块,并通过调用 gc.set_debug(gc.DEBUG_STATS) 方法设置了调试模式,以追踪内存的分配和释放。然后,我们创建了两个对象 obj1 和 obj2。通过手动调用 gc.collect() 方法,我们触发了垃圾回收。最后,我们使用 gc.garbage 查看垃圾收集器收集的对象列表,以打印内存分配和释放的统计信息。
这些示例展示了在 MicroPython 中使用 gc 模块的实际应用。gc 模块提供了一些函数和方法,用于手动触发垃圾回收、禁用自动垃圾回收以及追踪内存分配和释放的情况。通过利用 gc 模块,你可以更好地控制和管理内存资源。