R

R-LIBRE ingénierie

développons vos idées
  • image illustrant le titre du blog
    Etienne Cochard 2023/10/15

    Javascript sur microcontrôleur, partie 2

    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:

    copie d'écran 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:

    copie d'écran d'oscilloscope

    Pas mal non ?

    Pour les impatients, lorsque l’on utilise un setInterval( …, 0 ); les timings tombent à 18uS:

    copie d'écran d'oscilloscope

    Et enfin pour les brutes qui voudraient faire juste une boucle (non non monsieur cela ne se fait pas) nous descendons a 7.3uS

    copie d'écran d'oscilloscope