Espruino: JavaScript dans le microcontrôleur

image

"Pourquoi?", "Quelle absurdité?", "Perversion!", "Fu-Fu-Fu" - ce sont quelques-unes des nombreuses déclarations que nous avons entendues lorsque nous avons publié la carte Iskra JS sur le noyau Espruino .

Pourquoi


Lorsque le bon ingénieur en électronique entend que quelque chose a été fait sur l'Arduino, sa température corporelle augmente d'environ un demi-degré: «ils ont pris un microcontrôleur approprié et au lieu de figak figak et les registres en extraient tous les jus, tout vulgarisé ... il n'y a pas de mots, un la haine. "

Mais vous pouvez aller encore plus loin. Prenez le microcontrôleur Cortex M4, qui est dix fois plus riche que ce qui se trouve sur le même Arduino Uno, poussez-y l'interpréteur JavaScript et faites les projets JavaScript!

Je pense qu'en ce moment, ceux qui ne sont pas prêts pour un tel abus de saints microcircuits ont déjà éclaté. Je vais continuer pour le reste.



Dans le passe-temps électronique pour la grande majorité des projets, l'Arduino Uno est suffisant pour les yeux. Et cela n'a même pas d'importance si cela fonctionne à la fréquence standard de 16 MHz ou 4 MHz: peu importe si les lumières du lit s'allument ou la pompe du chalet en 1 ms ou 10 ms.

Ce qui compte, c'est que C ++ est complexe et boisé. Oui, il est proche du fer, mais c'est pourquoi il nécessite une connaissance approfondie de ce fer et de l'informatique. Ajoutez à cela la syntaxe avec un tas de nuances, qui est la somme des erreurs du développement du langage sur 30 ans. Ensuite, nous privons ce qui s'est avéré être des tableaux, des chaînes, des dictionnaires adéquats et encore mieux - en général, nous privons la mémoire dynamique. Ici, enfin, nous avons eu l'Arduino.

En regardant les questions sur notre forum, je vois que les gens passent du temps à baiser avec la langue, et non sur l'essence de leurs projets. Alors pourquoi ne pas réduire l'écart entre le fer et les gens? Le fer est bon marché et en constante évolution, le temps des gens est cher et ne vient de nulle part.

J'ai observé un processus similaire pendant de nombreuses années tout en travaillant dans le développement de jeux. En 2003, il était impossible d'imaginer que le jeu puisse être écrit sur autre chose que C / C ++. Ensuite, le script intégré de la machine est apparu dans les moteurs. Et puis la création d'un produit à part entière est devenue possible sans une seule ligne en C. Uniquement Java, C #, Ruby, Python, JavaScript. C'est logique, car le fer a commencé à tirer des "langages lents", et en raison du développement plus rapide et des programmeurs plus disponibles, il est devenu possible de consacrer plus de ressources à l'intérêt du jeu et non à la recherche de fuites de mémoire.

À quoi ressemble la programmation du microcontrôleur JavaScript


La programmation est comme ... JavaScript. Pour le développement de navigateur ou Node.js. Voici un exemple:

// 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);
}


Ce programme s'engage à recevoir des SMS'ki et en fonction de leur texte avec un feu de circulation change la couleur de la bande RVB connectée. Nous avons fait un tel projet pour notre arbre du Nouvel An, mais sur l'Arduino classique. Le code était 4 fois plus.

Noyau Espruino


Ainsi, l'ordinateur dispose de moteurs V8 et SpiderMonkey pour JavaScript. Et les microcontrôleurs ont un moteur Espruino.

En gros, le moteur Espruino est un micrologiciel (croquis, croquis) pour microcontrôleurs, qui à son tour peut exécuter du code JavaScript que vous transférez à la carte via une connexion série, par exemple via USB.

Espruino est un projet open source parrainé par Gordon Williams. La personne qui a implémenté à elle seule la majeure partie de l'écosystème entier et l'a accompagnée avec succès sur KickStarter.

Cet écosystème se compose de plusieurs parties principales:

  • Espruino Web IDE - un environnement de programmation;
  • Firmware Espruino - Machine JavaScript qui fonctionne sur un microcontrôleur;
  • Fer - les planches elles-mêmes qui sont compatibles avec Espruino;
  • Bibliothèque standard et bibliothèques externes;
  • La documentation


Tout d'abord.

Environnement de programmation


L'écriture de code JavaScript, son téléchargement sur la carte et la surveillance de la sortie ont lieu dans l'ESP Web Espruino. Cette application est pour Google Chrome, elle est donc mise en 1 clic et fonctionne sous tous les OS de bureau.

Pour l'utilisateur, cet environnement remplace l'IDE Arduino.

Selon les fonctionnalités de l'ESpruino IDE, bien sûr, il est beaucoup plus simple que Eclipse ou Visual Studio à part entière, mais il est plus avancé que l'IDE Arduino.

image


Si vous regardez autour de la fenêtre d'environnement en un coup d'œil, vous verrez l'éditeur de code (à droite), le panneau de la console (à gauche) et le bouton pour télécharger le code sur la carte.

La console est comme un moniteur série dans l'IDE Arduino, mais contrairement à elle, non seulement elle s'affiche, mais elle accepte également: vous pouvez appeler une fonction directement, sans réinitialiser et charger un nouveau programme, voir la valeur de la variable, interrompre le cycle, etc.

Après avoir travaillé plus étroitement, vous rencontrerez un débogueur (ouais, exécution étape par étape, points d'arrêt), des conseils d'éditeur, des erreurs clignotantes à la volée et d'autres astuces intéressantes.

De plus, directement à partir de l'EDI, vous pouvez mettre à jour la version du microprogramme Espruino elle-même vers la dernière version. L'environnement lui-même télécharge la dernière version disponible et la télécharge via USB.

Firmware


Le cœur du système est le firmware qui tourne sur le microcontrôleur. Il est écrit en C pur, il est chargé une fois dans un endroit séparé de la mémoire flash du microcontrôleur et s'engage à exécuter le code JS utilisateur qui passe par une connexion série ou se trouve dans la zone utilisateur de la mémoire flash.

Si nous décrivons schématiquement la disposition de la mémoire flash pour Iskra JS, nous obtenons l'image suivante:

image

Bootloader


Vient d'abord le chargeur de démarrage, qui n'est jamais mis à jour (conditionnellement). Il s'agit d'un petit programme dont l'exécution est toujours toujours démarrée après la mise sous tension ou la réinitialisation du microcontrôleur.

Le chargeur de démarrage fait une chose assez simple:

  • Si le bouton utilisateur BTN1 n'est pas enfoncé, il transfère immédiatement le contrôle à l'interpréteur.
  • Si le bouton a été enfoncé au démarrage, il se boucle sur lui-même et attend soit que le bouton soit à nouveau enfoncé pour quitter l'interpréteur, soit il attend que la nouvelle version de l'interpréteur soit téléchargée via USB. Dans ce cas, le chargeur de démarrage remplacera la zone de mémoire flash avec le microprogramme Espruino et nous obtiendrons la dernière version de l'interpréteur sur la carte.


Interprète


Ainsi, le chargeur est suivi d'un interprète, qui fait le travail principal.

Lorsqu'il démarre, il vérifie en vérifiant l'octet magique s'il y a du code JavaScript stocké dans la mémoire flash de l'utilisateur. S'il y en a, il est accepté de l'exécuter.

S'il n'y a pas de code, ou si nous avons quitté manuellement le chargeur de démarrage à l'aide de BTN1, rien ne sera exécuté à la réunion, nous obtenons simplement une machine JS prête pour le travail.

Mémoire libre


Après l'interpréteur, il existe une zone de mémoire que vous pouvez utiliser pour le stockage non volatile de vos données. C'est une sorte de remplacement de l'EEPROM par Arduino, mais avec ses propres spécificités, ainsi que ses dizaines à des centaines de fois plus.

Code personnalisé


C'est là que le programme JS exécuté par l'interpréteur est stocké. Le programme est là en clair, en une seule briquette, comme ça.

Pour qu'un grand nombre de bibliothèques connectées avec leurs dépendances et votre propre programme se transforment en une seule briquette cast et minifiée, il surveille le chargement de l'EDI.

Au contraire, tout le travail n'est pas effectué par l'IDE, mais par son composant indépendant de l'interface graphique d'EspruinoTools, qui possède une interface de ligne de commande et un point d'entrée à utiliser comme module Node.js. Par conséquent, si vous le souhaitez, vous pouvez utiliser Vim, Atom, Eclipse ou tout ce qui vous convient le mieux.

Au lieu du code, au lieu d'une briquette de texte, il peut y avoir une distribution binaire stockée de RAM, qui reflète pleinement l'état de l'interpréteur au moment de l'enregistrement. Mais ce sont déjà des détails techniques pas pour un aperçu rapide.

Bibliothèques


Les bibliothèques peuvent être divisées en 3 types: standard, intégré et externe.

Bibliothèque standard


La bibliothèque standard comprend des fonctions et des objets qui peuvent être utilisés. Parmi eux, à la fois familier et prescrit dans le langage standard `Date`,` JSON`, `Math`,` Object`, `setInterval`,` setTimeout` et d'autres-autres, ainsi que des fonctions spécifiques à Espruino pour travailler avec des broches, des interfaces par mémoire.

Parmi les fonctions, vous trouverez le familier de l'arduino `pinMode`,` digitalRead`, `digitalWrite`,` analogRead`, `analogWrite`, ainsi que le pas si familier` setWatch` pour surveiller les broches d'entrée,` digitalPulse` pour la génération exacte d'une séquence d'impulsions numériques et beaucoup plus de choses différentes pour travailler avec des périphériques.

Soit dit en passant, malgré le fait qu'il existe une fonction `pinMode` sur la plate-forme, par défaut, elle fonctionne d'elle-même, dans les coulisses, donc dans la plupart des scénarios, vous ne vous en souvenez pas (le dernier ingénieur en électronique a éclaté fort à ce stade).

Ce que vous ne trouverez pas dans la bibliothèque standard est «delay». Mamma Mia, comme je suis reconnaissante pour ça! Il suffit de réorganiser un peu la pensée et il devient clair que tout est résolu via `setInterval`,` setTimeout` sans aucun `delay`.

En reconnaissance, vous obtenez une exécution asynchrone: vous pouvez faire clignoter vingt LED indépendamment, chacune avec sa propre fréquence. Et vous obtenez une efficacité énergétique: «retard» brûle le temps du processeur, et sans «retard» le processeur peut dormir paisiblement alors qu'il n'y a rien à faire. À Espruino, alors qu'il n'y a pas de travail, le processeur s'endort et consomme des dizaines de fois moins de courant.

Bibliothèques intégrées


Les bibliothèques intégrées sont la même partie de la bibliothèque standard dans le sens où elles sont codées en dur dans le microprogramme Espruino, mais l'accès à leurs fonctionnalités nécessite de les connecter syntaxiquement à l'aide de la fonction `require 'familière aux programmeurs JavaScript.

Parmi ces bibliothèques, vous trouverez, par exemple, «fs» pour travailler avec les systèmes de fichiers des cartes SD, «http» pour créer une interface Web pour votre appareil, «Waveform» pour enregistrer / lire des signaux audio et autres.

Les bibliothèques standard et intégrées sont implémentées en C pur, et l'utilisateur ne dispose que d'une interface JavaScript sous la forme d'un ensemble d'objets, de fonctions et de modules. Cela vous permet d'atteindre une efficacité maximale pour la mise en œuvre d'algorithmes complexes, tout en laissant la possibilité d'y accéder à partir de code de haut niveau.

Vous pouvez vous-même implémenter quelque chose en C que JavaScript dirait «non, merci» et ne faire ressortir que quelques queues nécessaires à l'exécution.

Bibliothèques externes


Les bibliothèques externes sont ce qui façonne la richesse des écosystèmes. Ils sont écrits en JavaScript par les auteurs d'Espruino, nous écrivons, les utilisateurs d'Espruino écrivent.

Ils peuvent être stockés sur un disque local, dans le bac à sable du projet en cours, peuvent être dans le référentiel Internet, peuvent être sur GitHub, peuvent être sur NPM.

Les bibliothèques sont connectées, traditionnellement, en utilisant `require '.

Lorsque l'environnement voit `require ', il les télécharge récursivement à partir d'une source distante et, lors du chargement d'une esquisse, colle leur contenu au début de votre programme. Ainsi, pour le microcontrôleur, une briquette intégrale se forme avec le code dont j'ai parlé plus haut.

Cette approche signifie également que, contrairement à Arduino, l'utilisateur n'a pas besoin de trébucher sur le fait que pour commencer, la bibliothèque doit être trouvée, téléchargée, mise là où elle doit. Il suffit de claquer l'esquisse que vous aimez quelque part et l'environnement lui-même traitera les dépendances de la bibliothèque.

Le fer


Nous arrivons donc à la composante la plus tangible de l'écosystème Espruino. Ce sont les cartes qui peuvent exécuter le microprogramme Espruino.

image


Il s'agit notamment de la carte Espruino originale , Espruino Pico , ainsi que Iskra JS publié par Amperka . Tout est déjà installé en usine sur les cartes listées, elles sont immédiatement prêtes pour le travail.

Vous pouvez appuyer plusieurs fois sur le tambourin et installer indépendamment le noyau Espruino sur le STM32 Discovery, le Nucleo et, tout à coup, sur l'ESP8266.

La documentation


Il n'y a rien de plus triste que quelque chose de très cool et puissant, mais sans documentation.

Espruino a une assez bonne documentation. Sur www.espruino.com/Reference, vous trouverez de nombreux articles de référence et de formation.

Nous voulons faire plus et mieux. Par conséquent, nous avons créé une section distincte: js.amperka.ru , tournage de didacticiels vidéo. Les travaux sont en cours, mais beaucoup a déjà été couvert.

Et traditionnellement pour ceux qui aiment les solutions en boîte, nous avons créé un ensemble de " Iodo ". Il contient Iskra JS, des modules et un livre de couleurs.

Voici un persil. Le seul mystère est de savoir si au moins un bon ingénieur en électronique pourrait lire jusqu'à cette ligne?

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


All Articles