• [^] # Re: code code fait la poule

    Posté par (site web personnel) . En réponse au journal HWA : accéder au matériel autrement. Évalué à 2.

    Pourquoi Ducros y se décarcasse ?

    Il y a un README et 4 fichiers de démo à consulter dans l'ordre : demo-01.c, demo-02.c, demo-03.c, demo-04.c.

    demo-01.c n'est clairement pas le plus intéressant : il montre juste qu'il est possible de compiler un source écrit pour AVR-Libc avec HWA moyennant la traduction des symboles utilisés. Il sert aussi à mesurer la taille du code produit et à le comparer au code original. Ici, les codes machines produits sont identiques donc les déclarations de registres de HWA sont valables.

    demo-02.c (65 lignes de commentaires en tête) montre comment on accède aux registres et aux bits de registres à la sauce HWA. Ce n'est pas encore transcendant mais il me semble que cela apporte déjà quelque chose. Par exemple, préférez-vous écrire :

    /* Enable timer 1 overflow interrupt. */
    TIMSK = _BV (TOIE1);
    
    

    qui nécessite de savoir que le bit TOIE1 appartient au registre TIMSK (et si ce bit appartient en fait à un autre registre de même taille, vous n'aurez pas de message d'erreur), ou bien :

    hw_write( TOIE1, 1 );
    
    

    qui garantit que le bit TOIE1 sera mis à 1, et ne requiert pas que vous sachiez à quel registre il appartient (donc vous ne pourrez pas faire d'erreur) ?
    Au passage :

    1. le code machine produit a rétréci car l'utilisation des fonctions asynchrones (hwa_*) a permis à HWA d'optimiser les accès aux registres ;
    2. le commentaire /* Enable timer 1 overflow interrupt. */ est faux car ce qui est écrit ne se contente pas de mettre le bit TOIE1 à 1 mais aussi tous les autres à 0… (là, je me marre !)

    Autre exemple :

    hwa_write( WGM1, 0b0011 );
    
    

    Rien n'empêche de créer un symbole pour expliquer 0b0011 (par exemple HW_WGM1_PWM_10BITS_PHASE_CORRECT) mais vu ce que propose encore HWA (voir ci-dessous), il n'est peut-être pas nécessaire de s'attarder là-dessus.
    Aussi, ce qu'on ne voit pas avec cette dernière instruction, c'est que les bits 3 et 2 de WGM1 sont aux positions 4 et 3 d'un registre, et les bits 1 et 0 aux positions 1 et 0 d'un autre registre…

    demo-03.c pousse le concept un cran au dessus : on ne s'occupe plus des valeurs des registres mais on décrit comment on veut faire fonctionner les contrôleurs et HWA se débrouille pour écrire les bonnes valeurs dans les bons registres (en optimisant). Par exemple, je veux que le timer 1 compte et décompte en boucle :

    hwa_timer_set_countmode( hw_timer1, loop_updown );
    
    

    Franchement, vous ajouteriez un commentaire ?

    demo-04.c va au bout du concept : finalement, pourquoi ne pas juste décrire ce qu'on veut faire avec le circuit ? pourquoi exprimer tous les paramètres de fonctionnement du timer alors qu'il serait plus simple (et plus lisible, et plus portable) de dire ce que je veux en faire ? Je veux utiliser le PWM virtuel pwm0a (qui correspond au canal compare-match 'a' du timer-counter 0), sans respect de la phase (compte juqu'à TOP puis repart de 0) et cadencé par l'horloge système divisée par PWM_PSC :

    hwa_config( hw_pwm0a, fast, TOP, PWM_PSC );
    
    

    Si plus tard je veux que mon PWM respecte la phase, je n'ai qu'à changer 'fast' en 'phase_correct' :

    hwa_config( hw_pwm0a, phase_correct, TOP, PWM_PSC );
    
    

    Perso, je n'en vois pas l'intérêt d'un commentaire ici. Mais avec ce type de code, je peux décider de changer de sortie PWM ou même de microcontrôleur sans avoir à rechercher des valeurs pour des bits de registres. Il me semble que c'est intéressant. Et si HWA ne trouve pas le moyen d'obtenir le fonctionnement désiré, il émettra un message d'erreur.

    Alors ? Il n'a pas quelques qualités mon HWA ?

    « J'ai pas Word, j'ai pas Windows, et j'ai pas la télé ! »