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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
pyboard是一个紧凑而强大的电子开发板,运行MicroPython。它通过USB连接到您的PC,为您提供一个USB闪存驱动器来保存Python脚本,以及用于即时编程的串行Python提示符(REPL)。需要微型 USB 电缆。适用于 Windows、Mac 和 Linux。
MicroPython是对Python(版本3.4)编程语言的完全重写,因此它适合并在微控制器上运行。它包括许多优化,因此它可以高效运行并使用很少的 RAM。
MicroPython在pyboard上运行裸机,本质上是一个Python操作系统。内置 pyb 模块包含用于控制板上可用外设的函数和类,例如 UART、I2C、SPI、ADC 和 DAC。观看此视频,了解 pyboard 的概述。
MicroPython的pyb.fault_debug(value)是一个用来启用或禁用硬故障调试的函数。它的主要特点、应用场景和需注意事项如下:
主要特点:pyb.fault_debug(value)函数可以控制当电路板出现硬故障时的行为。硬故障是指底层系统中存在致命错误,例如无效的内存访问。如果value参数是False,则电路板将在出现硬故障时自动重置。如果value是True,则当电路板出现硬故障时,它将打印寄存器和堆栈跟踪,并且无限期地循环LED。默认值是禁用的,即自动重置。
应用场景:pyb.fault_debug(value)函数可以用来在开发或调试时检查程序中是否有潜在的错误或异常。例如,可以使用pyb.fault_debug(value)函数来开启硬故障调试,然后尝试执行一些可能出错的操作,观察电路板的反应和输出。
需注意事项:pyb.fault_debug(value)函数只能在启动时调用一次,之后不能更改。另外,pyb.fault_debug(value)函数可能会影响某些外设的工作,例如SD卡或LCD屏幕,因此在使用之前应该确保外设处于安全的状态。
下面给出三个使用pyb.fault_debug(value)函数的实际运用程序案例:
案例一:使用pyb.fault_debug(value)函数开启硬故障调试,并尝试执行除以零的操作
# 导入所需模块
import pyb
# 开启硬故障调试
pyb.fault_debug(True)
# 尝试执行除以零的操作
result = 1 / 0
print(result)
案例二:使用pyb.fault_debug(value)函数关闭硬故障调试,并尝试执行无效的内存访问
# 导入所需模块
import pyb
# 关闭硬故障调试
pyb.fault_debug(False)
# 尝试执行无效的内存访问
ptr = 0x12345678 # 一个无效的地址
result = ptr[0] # 读取该地址的内容
print(result)
案例三:使用pyb.fault_debug(value)函数开启硬故障调试,并尝试执行一个死循环
# 导入所需模块
import pyb
# 开启硬故障调试
pyb.fault_debug(True)
# 尝试执行一个死循环
while True:
pass # 不做任何事情
这个程序的目的是演示当电路板出现硬故障时的行为。硬故障是指底层系统中存在致命错误,例如无效的内存访问。如果开启了硬故障调试,当电路板出现硬故障时,它将打印寄存器和堆栈跟踪,并且无限期地循环LED。这可以帮助开发者或调试者找出错误的原因和位置。
在这个程序中,由于执行了一个死循环,电路板将无法正常运行,导致硬故障。因此,电路板将显示如下的输出,并且LED将不断闪烁:
HardFault
r0 : 00000000 r1 : 00000000 r2 : 00000000 r3 : 00000000
r12: 00000000 lr : 0800a9c9 pc : 0800a9ca psr: 61000000
bfar: e000ed38 cfsr: 00008200 hfsr: 40000000 dfsr: 0000000a
afsr: 00000000
Stack:
2001ff90: 0800a9c9 0800a9c9 fffffffd fffffffd fffffffd fffffffd fffffffd fffffffd
2001ffb0: fffffffd fffffffd fffffffd fffffffd fffffffd fffffffd fffffffd fffffffd
2001ffd0: fffffffd fffffffd fffffffd fffffffd fffffffd fffffffd fffffffd fffffffd
2001fff0: fffffffd fffffffd fffffffd ffffffff
案例四:设置故障监测点:
import pyb
pyb.fault_debug(1)
#在这里设置监测点
if something_wrong:
pyb.hard_reset()
案例五:调试脚本过程:
import pyb
pyb.fault_debug(1)
for i in range(10):
print(i)
if i == 5:
pyb.hard_reset()
案例六:监测软件故障:
import pyb
pyb.fault_debug(1)
try:
do_something_risky()
except Exception as e:
print("Error:", e)
pyb.hard_reset()
通过设置监测点并触发硬复位,可以debug程序和检查错误点。这些例子演示了它在调试和错误监测上的用法。
案例七:故障调试日志记录:
import pyb
# 设置故障调试模式为1,启用日志记录
pyb.fault_debug(1)
# 执行一些可能引发故障的代码
# 例如,访问不存在的变量或模块
# 查看故障调试日志
print(pyb.fault_debug_info())
在这个例子中,我们使用pyb.fault_debug()函数将故障调试模式设置为1,启用日志记录。然后,我们执行一些可能引发故障的代码,例如访问不存在的变量或模块。最后,我们使用pyb.fault_debug_info()函数查看故障调试日志,以了解故障的详细信息。
案例八:远程故障调试:
import pyb
import urequests
# 检查远程调试命令
response = urequests.get("http://example.com/debug")
if response.status_code == 200 and response.text == "enable":
pyb.fault_debug(1)
else:
pyb.fault_debug(0)
# 执行一些代码
# 查看故障调试日志
print(pyb.fault_debug_info())
在这个例子中,我们使用urequests模块来发送HTTP请求并获取远程调试命令。我们通过检查远程服务器上的命令来决定是否启用故障调试模式。如果收到有效的“enable”命令,我们使用pyb.fault_debug()函数将故障调试模式设置为1,启用日志记录。否则,我们将故障调试模式设置为0,禁用日志记录。然后,我们执行一些代码并使用pyb.fault_debug_info()函数查看故障调试日志。
案例九:条件性故障调试:
import pyb
# 执行一些代码
# 检查是否需要进行故障调试
if some_condition:
pyb.fault_debug(1)
# 执行更多代码
# 查看故障调试日志
print(pyb.fault_debug_info())
在这个例子中,我们在执行一些代码后检查是否需要进行故障调试。如果某个条件满足,我们使用pyb.fault_debug()函数将故障调试模式设置为1,启用日志记录。然后,我们执行更多的代码并使用pyb.fault_debug_info()函数查看故障调试日志。