Je cherche à rendre la loop de mon sketch le plus rapide possible
Lorsqu'elle s'execute, je voudrais à tout moment pouvoir, sur ordre d'un bouton poussoir, executer une série de tâches auxilliaures permettant de determiner une valeur B et la réintroduire ensuite dans la boucle ... je précise que pendant cette exécution la boucle principale peut éventuellement s'interrompre mais lorsqu'elle reprendra elle doit retrouver sa rapidité
Je pense à un void mais il necessiterait dans la loop un if de test du bouton-poussoir et je me demande s'il ne ralentira pas ma boucle?
Je pense aussi à une interruption mais comment savoir si mon seeeduino XIAO a des entrées pour cela?
All pins on Seeed Studio XIAO SAMD21 support interrupts, but two pins cannot be used at the same time: 5 pin and 7 pin. For more detail about Interrupt please check here.
Soit c'est assez rapide tu fais ton traitement dans la fonction d'interruption.
Soit c'est quand même assez long et tu met juste à jours une variable qui sera utilisée dans ta fonction loop.
Après que fait tu dans ta boucle de si rapide pour penser être ralenti par un if, qui doit prendre quelques cycles d'horloge tout au plus ?
le plus difficile pour les "débutants" en programmation c'est de voir le code à exécuter comme non séquentiel et bloquant. On peut pour cela utiliser des interruptions, une structure de code adaptée (par exemple avec une machine à états) ou sur les processeurs qui le permettent en utilisant du multi-threading et plusieurs tâches en laissant au système sous jacent le soin de donner du temps à tout le monde.
Pour la plupart des codes rencontrés ici sur le forum, une simple machine à état permet généralement de régler le souci. L'important étant de ne jamais bloquer la loop trop longtemps et de la laisser tourner.
le code pourrait ressembler à cela
et la fonction faireUneEtape() serait là où vous conduisez vos tâches à accomplir, mais pas de manière linéaire, juste un petit bout qui ne prend pas trop de temps.
L'appui humain sur un bouton et la réaction du code doit se faire en moins de 10ms si on veut que le code soit perçu comme étant "temps réel" et le signal d'appui sur un bouton physique généralement dure plusieurs centaines de millisecondes donc si faireUneEtape() prends moins de 10ms, votre code sera vu comme étant réactif
à noter que votre seeeduino XIAO tourne sur RTOS donc vous pourriez utiliser aussi des tâches
Pour être plus clair j'ajouterai que la tache auxilliaire consistera à lire la valeur correspondante à l'appui d'un des 4 boutons prévus et de la ramener dans la boucle
Donc la durée de la tache auxiliaire dépendra de celui qui appuyera sur les boutons
Si la solution par interruption n'apportera pas réellement un plus par rapport à 4 if en cascade, inutile de l'utiliser alors ?.... qu'en pensez-vous?
J'en profite pour vous demander à quoi sert les else dans une cascade de 4 ifs ? ... je n'en ai pas placé du tout et cela marche quand même
la solution par interruption apporte toujours un peu de complexité surtout avec un processeur multicore. il faut utiliser un semaphore pour synchroniser la variable qui représentera l'état des 4 boutons (ou 4 variables) avec le code principal mais c'est tout à fait faisable surtout si vous cachez cela dans une fonction pour faire le boulot qu'une seule fois
les if en cascade ne suffisent pas à gérer des boutons. Il faut faire un debounce généralement à moins que ce ne soit fait avec un condensateur externe. Donc c'est le temps global de suivi de l'état des boutons qui est à considérer mais le temps "humain" d'appui sur un bouton est super lent vu du processeur surtout sur un Seeeduino XIAO avec son SAMD21 à 48MHz, donc ce n'est pas un souci en pratique, on parle de quelques microsecondes.... (un if est un branchement dans le code qui s'effectue en 20 nano-secondes... faut rajouter le test etc..)
Comme je l'ai dit plus haut tout va dépendre de la façon dont vous coder. Si découper vos tâches en petits bouts durant moins de 10ms est trop difficile alors l'approche par tâche ou interruption va en partie simplifier la gestion des boutons.
on met un else quand les tests de conditions sont exclusifs
si vous écrivez
if (condition1) fonction1();
if (condition2) fonction2();
alors votre arduino va tester condition1 et éventuellement exécuter fonction1, puis ensuite va tester condition2 et éventuellement exécuter fonction2
si vous écrivez
if (condition1) fonction1();
else if (condition2) fonction2();
alors votre arduino va tester condition1 et si elle est vraie, exécuter fonction1 et dans ce cas il ne testera pas condition2. Si condition1 est fausse alors (et seulement dans ce cas) condition2 sera testée et éventuellement fonction2 sera exécutée.
Donc si les tests sont exclusifs, on gagne du temps statistiquement en mettant le else puisque quand la première condition est remplie, ce n'est pas la peine d'aller voir l'autre ou les autres.
si ça fait du sens et qu'ils doivent bien être exclusif
Et parfois c'est important: par exemple
if (x > 1000) sup1000();
else
if (x > 100) sup100();
else
if (x > 10) sup10();
else
sup1();
ferait quelque chose de complètement différent que
if (x > 1000) sup1000();
if (x > 100) sup100();
if (x > 10) sup10();
sup1();
si vous avez ce code et que x vaut 2000, dans le premier cas vous n'appelez que sup1000() alors que dans le second cas vous appelez toutes les fonctions !
Pour savoir si l'utilisation d'une interruption, amènera un plus, il faut que tu regarde le temps que tu passe dans ta fonction loop, avant de revenir sur le test de l'état du bouton.
Si le temps est important, l'interruption peut être intéressant.
Mais bien souvent il suffit de repenser le traitement pour pouvoir tester le bouton plus souvent.
C'est pour ça qu'il faut bien comprendre ce que fait le programme et ce que tu veux qu'il fasse.