Go Down

Topic: Plusieurs fonctions Void (Read 2644 times) previous topic - next topic

Mike74

Bonjour à tous, voilà je me pose une petite question, imaginons que j'ai une fonction void loop () principale et plusieurs sous fontions void x (), ma question est la suivante, si la sous fonction void x() est appelée, la fonction principale void loop () continue t elle de tourner ou est ce la sous fonction qui prend le relais ?

Merci pour votre aide. :)

SesechXP

Salut,

Un AVR est incapable d'exécuter plusieurs tâches à la fois. La fonction loop() va appeler la fonction x(). La fonction x() s'exécute et une fois terminée, on revient dans la fonction loop() :
loop() ---> x() ---> loop()
Julien - www.idreammicro.com

Mike74

ok merci beaucoup pour ta réponse  :)

Super_Cinci

Exact. dans l'AVR, il faut imaginer que chaque ligne de ton programme est numérotée de 0 à ... N par exemple, avec la ligne "void setup(){" numérotée 0. le numéro de ligne est appelé "adresse". le µP possède un compteur programme qui démarre à 0 après le reset. L'AVR exécute les lignes une par une, donc ligne 0, ligne 1 etc etc. exemple :

Code: [Select]

0 void setup(){
1   pinMode (13, OUTPUT);
2   digitalWrite (13, LOW);
3 }

4 void Loop(){
5   allumeLed();
6   eteindLed();
7 }

8 void allumeLed(){
9   digitalWrite(13, HIGH);
10 }

11 void eteindLed(){
12   digitalWrite(13, LOW);
13 }

Le compteur démarre à n=0, donc exécute la ligne 0, puis la ligne 1, jusqu'à la ligne 5, où l'appel de la fonction allumeLed() est interprétée en n = 8, alors n passe de 5 à 8 en sauvegardant dans un coin de sa tête la valeur avant le saut : 5, et le µP continue sur sa lancée, n = 8, 9... à 10, l'accolade veut dire "retourne d'où tu viens", donc n revient à 5 et continue d'être incrémenté : 6. ben la ligne 6 lui dit de sauter à 11, même principe, n = 11, 12, à 13, il retourne à 7 où il interprète un saut à 4 et ainsi de suite.

si on suit les valeurs de n, ça donne n = 0, 1, 2, 3, 4, 5, 8, 9, 10, 6, 11, 12, 13, 7, 4, 5, 8, 9, 10, 6, 11, 12, 13, 7, 4, 5, 8... L'AVR exécute les fonctions, mais les lignes de code une par une.

En réalité, ce simple code génère un millier de lignes d'assembleur (codage compréhensible par le coeur de l'AVR), mais le principe reste le même, un code l'un après l'autre avec des "sauts".

Mike74

super explication merci.

donc petite question, je réalise actuellement un programme assez lourd avec pas mal de mesures (tachymetre, température, etc) dans la fonction loop (), est il préférable de tout mettre dans la boucle loop ou bien de séparer ce qui est possible de séparer en sous-fonction, par exemple des commandes (ordre de démarrage, arrêt, de moteur, pompe, etc..  ?) , tout en laissant bien entendu les conditions du lancement de ces sous-fonctions dans la boucle principale.

Jean-François

Il est préférable de faire des fonctions que tu appelleras dans la boucle Loop(), ce sera plus facile à lire et à maintenir.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Mike74

donc deuxième solution, ok merci.

Cela a t il un impact sur la vitesse d'exécution et de traitement, je pense que oui ?

MiGaNuTs

Chaque fois que tu rentre et que tu sort d'une fonction le µC utilise quelques cycles machine pour faire sa petite cuisine, mais c'est minime.

SesechXP

Salut,

Pareil que Jean-François, je suis partisan des fonctions. Une fonction réalisant une action précise. Le code est plus lisible, plus simple à maintenir. Et puis ça évite de dupliquer du code à chaque fois que tu veux faire la même chose.

Concernant l'impact, il est très variable. ça dépend des paramètres passés à la fonction, des optimisations que va faire le compilateur, etc... Si la fonction n'est appelée qu'à un seul endroit, tu peux utiliser le mot clé inline. Dans la mesure du possible, le compilateur optimisera la fonction pour en réduire ou annuler l'impact.

++
Julien - www.idreammicro.com

skywodd

Bonjour,

Toujours faire des fonctions séparé pour chaque traitements, cela permet de ne pas se perdre dans un méli mélo de code.

En ajoutant "static inline" devant une fonction le compilateur l'intégrera dans la fonction "mére" sans ajouter la moindre instructions en plus = même performances.
(Par contre si tu l'utilise plusieurs fois le code va prendre du poids)
De même si tu as des variables globales dans ton code ajoute un "static" devant et le compilateur saura qu'il peut les optimiser si besoin.

Attention: les variables globales utilisaient dans une interruption doivent être déclaré "volatile" et non "static", dans le cas contraire tu auras des bug et/ou un fonctionnement incohérent.

Tu peut aussi faire plusieurs fichiers .ino dans le même dossier que ton fichier .ino principal.
Il seront ouvert (à la réouverture du fichier principal) dans des onglets séparé et aggloméré bout à bout avant d'être compilé.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up