MicroPython是用于微控制器的Python编程语言的实现,它使使用熟悉的语法和编程原理的该语言的读者可以与小型计算设备一起工作。
在我的工作中,我使用MicroPython进行原型设计,快速测试想法并创建小型支架。 得益于REPL和简单的语法,MicroPython也非常适合DIY项目和教学编程。
当涉及到计算机与现实世界的交互时,我总是对它们交互的速度感兴趣。 在某些情况下,例如在物联网领域中使用微处理器技术,设备的反应速度并不那么重要。 警报警铃打开的时间没有太大区别:运动检测后10微秒或10毫秒。
但是在某些方面,速度和反应时间很重要,因此是否应该使用MicroPython的问题就出现了。 因此,我进行了一些研究,该研究的灵感
来自 MicroPython Damien George
的创建者
的演讲视频 。 我想知道用Micropython编写的程序对输入影响的响应速度有多快。
实验设备将是NodeMcu板上的ESP8266微控制器,板上带有MicroPython版本esp8266-2018511-v1.9.4。

我将按下按钮并在示波器上注册按下与微处理器另一端出现3.3 V电压之间的时间差。 每次测量进行15次,取平均值(在图表中说明),并计算标准偏差(在图表中显示黑条)。
测试编号1。
如果您“直接”解决此问题,则该程序看起来非常简单:
import machine import time o = machine.Pin(5, machine.Pin.OUT)
具有此类程序的典型波形如下所示:

在此以及其他波形上,“蓝色”信号是带有按钮的引脚,即“绿色”响应引脚。 通过15次重复,可以得到以下图片:

平均而言,反应时间约为310微秒,最大值为356μs,不是很快,但是对于某些应用程序来说是完全可以接受的。
测试编号2
您可以通过中断处理来加速“开箱即用”的标准代码。
import machine import time o = machine.Pin(5, machine.Pin.OUT)
并且图片如下:


最大响应时间为306μs。
使用中断可使速度提高约20%,但同时会在响应时间上产生相当大的扩展。
测试编号3
如果获得的速度不够快,那么下一步是使用@ micropython.native构造,这使得将Python代码转换为本地机器代码成为可能。 但是有一些
限制 。
代码选项:
import machine import time o = machine.Pin(5, machine.Pin.OUT)
波形上的典型响应模式:

与以前的方法相比,加速度几乎提高了一倍:

最长的响应时间为128μs。
测试编号4
寻找“快速” MicroPython的下一步是使用@ micropython.viper构造并直接访问微处理器寄存器(可以在
此处找到寄存器地址)。
import time @micropython.viper def f(): O = ptr32(0x60000300)
结果,响应明显加快了:

响应时间非常短,无法与其他方法进行比较(最大820 ns):


如果这还不够,那么您可以通过@ micropython.asm_thumb装饰器使用汇编程序插入。 使用这种方法,python不会特别保留(并且丧失了Python的高级优势),并且如果需要更高的速度,则最好使用其他硬件,例如FPGA(在Python也有用的地方,请参见
此处和
此处 )。
串口
如果在某些事件后需要传输大量信息,则可以使用串行UART接口。
以两个实现选项为例。
首先是通过中断处理:
import machine i = machine.Pin(4, machine.Pin.IN)
以及响应波形:

最大响应时间为248μs。
通过毒蛇的第二次测试:
import machine import time i = machine.Pin(4, machine.Pin.IN)
和第二次测试中的波形:

该代码的最大响应时间为71μs。
两次测试中的平均反应时间:

由于在第二次测试中更快地检测到输入效果,因此可以加快反应速度。
结论
MicroPython允许您在对微控制器进行编程时使用高级语言的特征(OOP,异常处理,列表和dict兼容性等),并且在必要时可以显着加速“经典” Python代码。