Re: C++, template et pointeur

Page principale

Répondre à ce message
Auteur: Frédéric
Date:  
À: Guilde
Sujet: Re: C++, template et pointeur
Le 23/04/2024, Edgar a écrit :

> Oui. Il est en général déconseillé d'appeler des fonctions du core
> Arduino dans des constructeurs globaux. La raison est que ces
> constructeurs sont appelés avant main(), et donc avant que le core ait
> fait son initialisation. Certaines fonctions du core fonctionnent avant
> cette initialisation, d'autres non, mais, ceci n'étant pas documenté, il
> est plus sage d'éviter.


Yep, je suis tombé sur le problème avec la classe Servo, qui utilise un
timer. Le attach() était fait dans le constructeur d'un objet (le Arm du
diagramme UML), avant tout appel à main(), et du coup, la lib Arduino
initialisait le timer pour autre chose, et ça ne marchait pas. On a donc
ajouté une méthode begin().

> > Dire que j'ai poussé les étudiants à faire une architecture objet,
> > pour rendre le code plus lisible :o/
>
> Maintenant il faut leur expliquer que, parfois, les variables globales
> c'est bien aussi. :o)


Misère, ils vont me pourrir !

> [...] Je pense qu'ils ont évité ça pour faire une API la plus simple
> possible pour les débutants.


Ouais, mais du coup, on reste sur le mode bricolage ; je trouve ça très
dommage.

> Puisqu'il faut des variables globales, autant les définir au niveau le
> plus bas, dans le seul objet qui les utilise. Je te suggère ça :
> [...]


Ok, vu. Par contre, qu'entends-tu par "_explicitement_ instancier le
template deux fois" ?

> Remarque que les routines encoderISR<0> et encoderISR<1> sont
> instanciées explicitement dans le switch/case. Si jamais la fonction
> encoderISR() est un peu longue (ce qui est normalement à éviter) et que
> tu veux limiter la duplication de code, tu peux la remplacer par une
> méthode normale et ajouter un template « wrapper » autour:
>
>     template<int interrupt> static void isr_wrapper() {
>         instances[interrupt]->encoderISR();
>     }

>
>     void encoderISR() {
>         // do something with this...
>     }


Non, il n'y a effectivement pas grand chose dans la routine
d'interruption, juste un test pour savoir dans quel sens tourne le codeur,
et une incrémentation/décrémentation du compteur.

Merci !

PS : est-ton obligé de définir les méthodes statiques dans la déclaration
de la classe, ou peut-on le faire dans le .cpp ?

-- 
    Frédéric