Dans un article précédent, je vous parlais de l’efficacité du développement en Javascript (et Typescript évidement) sur microcontrôleur.
Aujourd’hui nous allons voir à quelle vitesse va ce truc. Tout d’abord, pour les vieux comme moi qui ont connu les débuts du basic interprété sur pc, le javascript ou ce genre de langage fait partie des gadgets, on ne peut pas développer quelque chose de pérenne en javascript sur un microcontrôleur.
** Détrompez vous. **
D’une part, QuickJS ( cf. article précédent pour ce choix ) est précompilé. D’autre part, un ESP32 ou un Raspberry pico tournent a des vitesses assez remarquables - double cœur, 133MHz pour le Pico et 240MHz pour un Esp32-s3. N’espérez pas faire du supercalcul sur ce genre de machine mais pour ce que l’on demande en général à un dispositif IOT de ce genre (gestion IO / connexion réseau / interface machine) ça suffit plus que largement .
Allez, on met les mains dans le cambouis…
Le code suivant tourne sur mon petit ESP32:
// init pin 0 -> output
gpio.init( gpio.PIN_0, gpio.OUTPUT );
// on toggle la pin toutes les 1ms
setInterval( function ( ) {
gpio.toggle( gpio.PIN_0 );
}, 1 );
Avouez quand même que pour faire ça en C ça vous prendrait quand même plus de lignes 😥
Voyons voir ce qui se passe à l’oscilloscope:
Pour faire un test un peu plus compliqué, je passe par un expander gpio, le SX1509, dont j’ai écrit une petite implémentation en JS. Pour info, le SX est un expander qui fonctionne en I2C. Donc à chaque montée ou descente sur l’écran, il y a eu un appel i2c.
// init I2C ( port, pin_sda, pin_scl)
const i2c = new I2C( 0, 8, 18 );
i2c.open( { clk_speed: 400000 } );
const sx = new SX1509( i2c );
sx.setPinMode( PIN_A1, gpio.OUTPUT );
setInterval( ( ) => {
sx.togglePin( PIN_A1 );
}, 1 );
Voici les timings:
Pas mal non ?
Pour les impatients, lorsque l’on utilise un setInterval( …, 0 ); les timings tombent à 18uS:
Et enfin pour les brutes qui voudraient faire juste une boucle (non non monsieur cela ne se fait pas) nous descendons a 7.3uS