Espruino: JavaScript en el microcontrolador

imagen

“¿Por qué?”, “¿Qué tonterías?”, “¡Perversión!”, “Fu-Fu-Fu”: estas son algunas de las muchas declaraciones que escuchamos cuando lanzamos el tablero de Iskra JS en el núcleo de Espruino .

Porque


Cuando el ingeniero electrónico adecuado se entera de que se ha hecho algo en el Arduino, la temperatura de su cuerpo aumenta aproximadamente medio grado: "tomaron un microcontrolador adecuado y, en lugar de figak figak y registros, exprimieron todos los jugos, vulgarizaron todo ... no hay palabras, una odio ".

Pero puedes ir aún más lejos. Tome el microcontrolador Cortex M4, que es diez veces más rico que lo que está en el mismo Arduino Uno, ¡empuje el intérprete de JavaScript allí y haga los proyectos de JavaScript!

Creo que en este momento aquellos que no están listos para tal abuso de los microcircuitos sagrados ya han estallado. Continuaré por el resto.



En el hobby de la electrónica para la gran mayoría de los proyectos, el Arduino Uno es suficiente para la vista. Y ni siquiera importa si funciona a la frecuencia estándar de 16 MHz o 4 MHz: no importa si las luces de la cama se encienden o la bomba en la cabaña en 1 ms o 10 ms.

Lo que importa es que C ++ es complejo y de madera. Sí, está cerca del hierro, pero es por eso que requiere una comprensión profunda de este hierro y la informática. Agregue a esto la sintaxis con un montón de matices, que es la suma de los errores del desarrollo de 30 años del lenguaje. Luego privamos lo que resultaron ser matrices, cadenas, diccionarios e incluso mejores; en general, privamos la memoria dinámica. Aquí, finalmente, tenemos el Arduino.

Al ver preguntas en nuestro foro, veo que las personas pasan tiempo follando con el idioma, y ​​no con la esencia de sus proyectos. Entonces, ¿por qué no reducir la brecha entre el hierro y las personas? El hierro es barato y está en constante evolución, el tiempo de las personas es costoso y no proviene de ningún lado.

Observé un proceso similar durante muchos años mientras trabajaba en el desarrollo de juegos. En 2003, era imposible imaginar que el juego se pueda escribir en otra cosa que no sea C / C ++. Entonces el script incorporado de la máquina apareció en los motores. Y luego la creación de un producto completo se hizo posible sin una sola línea en C. Solo Java, C #, Ruby, Python, JavaScript. Esto es lógico, porque el hierro comenzó a extraer "lenguajes lentos", y debido al desarrollo más rápido y a la mayor cantidad de programadores disponibles, fue posible gastar más recursos en la diversión del juego y no en encontrar pérdidas de memoria.

Cómo se ve la programación de microcontroladores de JavaScript


La programación es como ... JavaScript. Para desarrollo para navegador o Node.js. Aquí hay un ejemplo:

// SMS
var sim = require('@amperka/Sim900r').connect();
sim.powerOn();
sim.on('sms', function(sms) {
    var rgb = sms.text.split(' ');
    var r = +rgb[0];
    var g = +rgb[1];
    var b = +rgb[2];
    if (isNaN(r + g + b)) return;
    fadeTo(r, g, b);
});

// 
SPI2.setup({baud:3200000, mosi:B15});
var LED_COUNT = 150;
var colors = new Uint8ClampedArray(LED_COUNT * 3);

function fadeTo(r, g, b) {
  var n = 0;
  var ivalID = setInterval(function() {
    colors[n*3 + 0] = b;
    colors[n*3 + 1] = r;
    colors[n*3 + 2] = g;
    SPI2.send4bit(colors, 0b0001, 0b0011);
    if (n++ >= LED_COUNT) {
      clearInterval(ivalID);
    }
  }, 50);
}


Este programa se compromete a recibir SMS'ki y, dependiendo de su texto, con una luz de marcha cambia el color de la cinta RGB conectada. Hicimos un proyecto para nuestro árbol de Año Nuevo, pero en el clásico Arduino. El código fue 4 veces más.

Kernel Espruino


Entonces, la computadora tiene motores V8 y SpiderMonkey para JavaScript. Y los microcontroladores tienen un motor Espruino.

En términos generales, el motor Espruino es firmware (boceto, boceto) para microcontroladores, que a su vez puede ejecutar el código JavaScript que transfiere a la placa a través de una conexión en serie, por ejemplo, a través de USB.

Espruino es un proyecto de código abierto patrocinado por Gordon Williams. La persona que por sí sola implementó la mayor parte del ecosistema completo y la acompañó con éxito en KickStarter.

Este ecosistema consta de varias partes principales:

  • Espruino Web IDE: un entorno de programación;
  • Espruino Firmware: máquina JavaScript que se ejecuta en un microcontrolador;
  • Hierro: las tablas que son compatibles con Espruino;
  • Biblioteca estándar y bibliotecas externas;
  • Documentación


Lo primero es lo primero.

Entorno de programación


Escribir código JavaScript, descargarlo en el tablero y monitorear la salida se lleva a cabo en el IDE web de Espruino. Esta aplicación es para Google Chrome, por lo que se pone en 1 clic y funciona en todos los sistemas operativos de escritorio.

Para el usuario, este entorno reemplaza el IDE de Arduino.

De acuerdo con la funcionalidad del Espruino IDE, por supuesto, es mucho más simple que Eclipse completo o Visual Studio, pero es más avanzado que el Arduino IDE.

imagen


Si mira alrededor de la ventana del entorno de un vistazo, verá el editor de código (a la derecha), el panel de la consola (a la izquierda) y el botón para descargar el código en el tablero.

La consola es como un monitor serie en el IDE de Arduino, pero a diferencia de ella, no solo muestra, sino que también acepta: puede llamar a una función directamente, sin reiniciar y cargar un nuevo programa, ver el valor de la variable, interrumpir el ciclo, etc.

Después de haber trabajado más estrechamente, se encontrará con un depurador (sí, ejecución paso a paso, puntos de interrupción), sugerencias del editor, errores intermitentes sobre la marcha y otros buenos trucos.

Además, directamente desde el IDE, puede actualizar la versión del firmware Espruino a la última. El entorno mismo descarga la última versión disponible y la carga a través de USB.

Firmware


El corazón del sistema es el firmware que gira en el microcontrolador. Está escrito en C puro, se carga una vez en un lugar separado en la memoria flash del microcontrolador y se compromete a ejecutar el código JS del usuario que viene a través de una conexión en serie o se encuentra en el área de usuario de la memoria flash.

Si representamos esquemáticamente el diseño de la memoria flash para Iskra JS, obtenemos la siguiente imagen:

imagen

Cargador de arranque


Primero viene el gestor de arranque, que nunca se actualiza (condicionalmente). Este es un pequeño programa, cuya ejecución siempre comienza la vida del microcontrolador después de encender o reiniciar.

El gestor de arranque hace una cosa bastante simple:

  • Si no se presiona el botón de usuario BTN1, inmediatamente transfiere el control al intérprete.
  • Si el botón se presionó al inicio, se repite y espera hasta que se presione nuevamente el botón para salir al intérprete, o espera hasta que la nueva versión del intérprete se descargue a través de USB. En este caso, el gestor de arranque sobrescribirá el área de memoria flash con el firmware Espruino, y obtendremos la última versión del intérprete en la pizarra.


Intérprete


Entonces, el cargador es seguido por un intérprete, que hace el trabajo principal.

Cuando comienza, comprueba al comprobar el byte mágico si hay algún código JavaScript almacenado en la memoria flash del usuario. Si lo hay, se acepta ejecutarlo.

Si no hay código, o si salimos manualmente del gestor de arranque usando BTN1, no se ejecutará nada en la reunión, solo tenemos una máquina JS lista para trabajar.

Memoria libre


Después del intérprete hay un área de memoria extraíble que puede usar para el almacenamiento no volátil de sus datos. Este es un tipo de reemplazo para EEPROM por Arduino, pero con sus propios detalles, así como sus decenas a cientos de veces más.

Código personalizado


Aquí es donde se almacena el programa JS que ejecuta el intérprete. El programa está allí en texto plano, en una briqueta, como es.

Para que muchas bibliotecas conectadas con sus dependencias y su propio programa se conviertan en una briqueta fundida y minificada, se monitorea al cargar el IDE.

Más bien, todo el trabajo no lo realiza el IDE, sino su componente independiente de la GUI de EspruinoTools, que tiene una interfaz de línea de comando y un punto de entrada para usar como módulo Node.js. Por lo tanto, si lo desea, puede usar Vim, Atom, Eclipse o lo que sea más conveniente para su desarrollo.

En lugar del código, en lugar de una briqueta de texto, puede haber un reparto binario almacenado de RAM, que refleja completamente el estado del intérprete al momento de guardar. Pero estos ya son detalles técnicos, no para una descripción rápida.

Bibliotecas


Las bibliotecas se pueden dividir en 3 tipos: estándar, incorporado y externo.

Biblioteca estándar


La biblioteca estándar son funciones y objetos que se pueden usar. Entre ellos, tanto los familiares como los prescritos en el lenguaje estándar `Fecha`,` JSON`, `Matemáticas`,` Objeto`, `setInterval`,` setTimeout` y otros, así como funciones específicas de Espruino para trabajar con pines, interfaces de memoria

Entre las funciones encontrará `pinMode`,` digitalRead`, `digitalWrite`,` analogRead`, `analogWrite`, familiar para el arduino y no tan familiar` setWatch` para observar los pines de entrada,` digitalPulse` para la generación precisa de una secuencia de pulsos digitales y muchas más cosas diferentes para trabajar con periféricos.

Por cierto, a pesar del hecho de que hay una función `pinMode` en la plataforma, por defecto funciona por sí sola, detrás de escena, por lo que en la mayoría de los escenarios no puedes recordarlo (el último ingeniero electrónico explotó en voz alta en este punto).

Lo que no encontrará en la biblioteca estándar es `delay '. Mamma Mia, ¡qué agradecida estoy por eso! Es suficiente reorganizar un poco el pensamiento y queda claro que todo se resuelve mediante `setInterval`,` setTimeout` sin ningún `retraso`.

En agradecimiento, obtienes una ejecución asincrónica: puedes parpadear veinte LED de forma independiente, cada uno con su propia frecuencia. Y obtienes eficiencia energética: `delay 'está quemando el tiempo del procesador, y sin` delay' el procesador puede dormir tranquilo mientras no hay nada que hacer. En Espruino, mientras no hay trabajo, el procesador se queda dormido y consume docenas de veces menos corriente.

Bibliotecas incorporadas


Las bibliotecas integradas son la misma parte de la biblioteca estándar en el sentido de que están codificadas en el firmware Espruino, pero el acceso a su funcionalidad requiere conectarlas sintácticamente utilizando la función `require` familiar para los programadores de JavaScript.

Entre estas bibliotecas encontrará, por ejemplo, `fs` para trabajar con sistemas de archivos de tarjetas SD,` http` para crear una interfaz web para su dispositivo, `Waveform` para grabar / reproducir señales de audio y otros.

Las bibliotecas estándar e integradas se implementan en C puro, y el usuario solo cuenta con una interfaz JavaScript en forma de un conjunto de objetos, funciones y módulos. Esto le permite lograr la máxima eficiencia para la implementación de algoritmos complejos, mientras deja la posibilidad de acceder a ellos desde un código de alto nivel.

Usted mismo puede implementar algo en C que JavaScript diga "no, gracias", y sacar solo algunas colas necesarias para ejecutarse.

Bibliotecas externas


Las bibliotecas externas son las que dan forma a la riqueza del ecosistema. Están escritos en JavaScript por autores de Espruino, nosotros escribimos, los usuarios de Espruino escriben.

Pueden almacenarse en un disco local, en el entorno limitado del proyecto actual, pueden estar en el repositorio de Internet, pueden estar en GitHub, pueden estar en NPM.

Las bibliotecas están conectadas, tradicionalmente, usando `require`.

Cuando el entorno ve "require", los descarga de forma recursiva desde una fuente remota y, al cargar un boceto, pega sus contenidos al comienzo de su programa. Por lo tanto, para el microcontrolador, se forma una briqueta integral con el código del que hablé anteriormente.

Este enfoque también significa que, a diferencia de Arduino, el usuario no necesita tropezar con el hecho de que, para empezar, la biblioteca debe ser encontrada, descargada y puesta donde necesita. Es suficiente con cerrar el boceto que te gusta desde algún lugar y el entorno mismo se ocupará de las dependencias de la biblioteca.

Hierro


Entonces llegamos al componente más tangible del ecosistema Espruino. Estas son las placas que pueden ejecutar el firmware Espruino.

imagen


Estos incluyen el tablero original de Espruino , Espruino Pico , así como Iskra JS lanzado por Amperka . Todo ya está instalado en la fábrica en los tableros enumerados, están listos de inmediato para el trabajo.

Puede tocar la pandereta varias veces e instalar independientemente el núcleo Espruino en el STM32 Discovery, Nucleo y, de repente, en el ESP8266.

La documentación


No hay nada más triste que algo muy genial y poderoso, pero sin documentación.

Espruino tiene bastante buena documentación. En www.espruino.com/Reference encontrará muchos artículos de referencia y capacitación.

Queremos hacer más y mejor. Por lo tanto, creamos una sección separada: js.amperka.ru , graba videos tutoriales. El trabajo está en progreso, pero ya se ha cubierto mucho.

Y tradicionalmente para los amantes de las soluciones en caja, hemos creado un conjunto de " Iodo ". Contiene Iskra JS, módulos y un libro de colores.

Aquí hay un perejil. El único misterio es si al menos un ingeniero electrónico correcto podría leer hasta esta línea.

Source: https://habr.com/ru/post/es392399/


All Articles