MicroPython es una implementación del lenguaje de programación Python para microcontroladores que permite a la audiencia de este lenguaje usar la sintaxis familiar y los principios de programación para trabajar con dispositivos informáticos pequeños.
En mi trabajo, uso MicroPython para crear prototipos, probar ideas rápidamente y crear pequeños stands. Gracias a REPL y sintaxis simple, MicroPython también es ideal para proyectos de bricolaje y para la programación de enseñanza.
Cuando se trata de la interacción de las computadoras con el mundo real, siempre estoy interesado en la velocidad de su interacción. En algunos casos, el uso de la tecnología de microprocesador, por ejemplo en el campo de Internet de las cosas, la velocidad de reacción del dispositivo no es tan importante. No hay mucha diferencia cuando se enciende la sirena de alarma: 10 microsegundos después de la detección de movimiento o 10 milisegundos.
Pero en algunos aspectos, la velocidad y el tiempo de reacción son importantes y surge la pregunta sobre la conveniencia de usar MicroPython. Así que hice una pequeña investigación, inspirada en el
video del discurso del creador de MicroPython Damien George. Me preguntaba qué tan rápido respondería un programa escrito en Micropython al impacto de entrada.
El dispositivo experimental será el microcontrolador ESP8266, en la placa NodeMcu con la versión MicroPython esp8266-2018511-v1.9.4 a bordo.

Presionaré el botón y registraré en el osciloscopio la diferencia de tiempo entre presionar y la aparición de 3.3 V en la otra pata del microprocesador. Cada medición se realiza 15 veces, se toma el promedio (ilustrado en los gráficos) y se calcula la desviación estándar (barra negra en los gráficos).
Prueba número 1.
Si resuelve este problema "de frente", el programa parece bastante trivial:
import machine import time o = machine.Pin(5, machine.Pin.OUT)
Una forma de onda típica con dicho programa se ve así:

Aquí y en otras formas de onda, la señal "azul" es el pin con el botón, el pin de respuesta "verde". Con 15 repeticiones, se obtiene la siguiente imagen:

En promedio, el tiempo de reacción es de aproximadamente 310 microsegundos, el máximo es de 356 μs, no muy rápido, pero para algunas aplicaciones es bastante aceptable.
Prueba número 2
Puede acelerar el código estándar "listo para usar" a través del manejo de interrupciones.
import machine import time o = machine.Pin(5, machine.Pin.OUT)
Y la imagen es la siguiente:


y el tiempo de respuesta máximo es de 306 μs.
El uso de interrupciones da un aumento en la velocidad de aproximadamente el 20%, pero al mismo tiempo da una extensión bastante grande en el tiempo de respuesta.
Prueba número 3
Si las velocidades obtenidas no son suficientes, entonces el siguiente paso es usar la construcción @ micropython.native, que hace posible convertir el código Python en código máquina nativo. Pero hay algunas
limitaciones .
Opción de código:
import machine import time o = machine.Pin(5, machine.Pin.OUT)
Patrón de respuesta típico en la forma de onda:

En comparación con el método anterior, la aceleración casi se duplica:

El tiempo de respuesta más largo es de 128 μs.
Prueba número 4
El siguiente paso en la búsqueda de un MicroPython "rápido" es utilizar la construcción @ micropython.viper y acceder a los registros del microprocesador directamente (las direcciones de registro se pueden encontrar
aquí .
import time @micropython.viper def f(): O = ptr32(0x60000300)
Y como resultado, la respuesta se aceleró notablemente:

El tiempo de respuesta es muy pequeño y no se puede comparar con otros métodos (máximo 820 ns):


Si esto no es suficiente, puede usar insertos de ensamblador a través del decorador @ micropython.asm_thumb. Con este método, python no permanece particularmente (y se pierden las ventajas de alto nivel de Python), y si se necesitan velocidades más altas, es mejor usar otro hardware, por ejemplo FPGA (donde Python también puede ser útil, ver
aquí y
aquí ).
UART
Si es necesario transmitir mucha información después de algún evento, puede usar la interfaz serial UART.
Tomemos, por ejemplo, dos opciones de implementación.
El primero es a través del manejo de interrupciones:
import machine i = machine.Pin(4, machine.Pin.IN)
Y la forma de onda de respuesta:

El tiempo de respuesta máximo es de 248 μs.
Y la segunda prueba a través de viper:
import machine import time i = machine.Pin(4, machine.Pin.IN)
Y la forma de onda en la segunda prueba:

El tiempo de respuesta máximo con este código es de 71 μs.
El tiempo de reacción promedio en dos pruebas:

La aceleración de la reacción se logra debido a una detección más rápida del efecto de entrada en la segunda prueba.
Conclusión
MicroPython le permite usar elementos que son característicos de los lenguajes de alto nivel (OOP, manejo de excepciones, lista y dictar compras de pensiones, etc.) al programar microcontroladores y, si es necesario, acelerar significativamente el código Python "clásico".