Dans un croquis Arduino, existe-t-il un moyen de faire des appels de fonction asynchrones dans la boucle? Comme écouter les requêtes via le serveur http et les traiter de manière non bloquante .
Dans un croquis Arduino, existe-t-il un moyen de faire des appels de fonction asynchrones dans la boucle? Comme écouter les requêtes via le serveur http et les traiter de manière non bloquante .
Réponses:
Oui et non. Vous êtes un peu vague sur ce que vous voulez faire. J'ai fait cela en quelques sections différentes (principalement axées sur la lecture des données des capteurs ... cela s'applique à tout, mais c'est le contexte que j'utilise):
AFAIK tous les Arduinos n'ont qu'un seul cœur (ils peuvent faire une chose à la fois). Pour la plupart des cartes Arduino, le multithreading matériel n'est pas pris en charge. Cependant, il existe des moyens d'implémenter le multithreading logiciel . L'approche d'AsheeshR ne fonctionnerait pas bien pour les fonctions qui prennent beaucoup de temps à se terminer (c'est-à-dire quelque chose dans une bibliothèque qui prend un certain temps ou un délai) car cela serait coincé par ces instructions, mais cela fonctionnerait bien pour le court fonctions comme pinMode()
. La bibliothèque Protothreads répertoriée ici pourrait être meilleure, mais je ne sais pas vraiment.
Il serait difficile d'orchestrer cela avec HTTP, d'autant plus que vous devez faire
Une manière courante pour un croquis de caler est l'utilisation d'un délai. Cela peut être résolu en utilisant, dans la boucle principale, une instruction if et la millis()
fonction qui renvoie une heure (pas une heure d'horloge, mais plutôt l'heure depuis le début de l'Arduino). Vous pouvez également effectuer une boucle dans la boucle pour interroger les données du capteur.
L' millis()
approche ne fonctionnerait pas bien avec des choses qui provoquent le blocage de tout le programme (c.-à-d. Plus de retards ou de boucles qui durent un temps notable). Notez que 100 ms IIRC est le temps maximum général pour que l'interface utilisateur ne semble pas décalée.
Les interruptions sont un excellent moyen de garder les choses presque asynchrones. Ils exécutent un court morceau de code (que vous spécifiez) chaque fois qu'un état de broche change. Il rompt avec le loop()
, et revient là où il s'était arrêté une fois le " ISR " exécuté. Je n'ai pas beaucoup de temps pour expliquer comment procéder, mais une recherche rapide sur Google donnera beaucoup de résultats.
En ce qui concerne votre exemple, la section de filetage serait la plus applicable. Ce sujet est assez vague, vous devrez donc expérimenter quelques éléments et trouver quelque chose qui fonctionne.
Je viens de publier du code pour un planificateur de tâches sur le terrain de jeu l'autre jour, vous voudrez peut-être jeter un coup d'œil, peut-être pouvez-vous l'adapter à vos besoins.
Le processeur de l'Arduino est intrinsèquement monothread et ne peut pas effectuer plusieurs tâches. Comme cela a été mentionné, il existe cependant des moyens de créer l'illusion du multitâche. Annonomus Penguin les a assez bien touchés.
Consultez également TimerOne (c'est probablement mieux;)