Pages: [1]   Go Down
Author Topic: Plusieurs fonctions Void  (Read 2196 times)
0 Members and 1 Guest are viewing this topic.
Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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()
Logged


Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok merci beaucoup pour ta réponse  smiley
Logged

Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1395
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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".
Logged

Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il est préférable de faire des fonctions que tu appelleras dans la boucle Loop(), ce sera plus facile à lire et à maintenir.
Logged

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

Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Orleans
Offline Offline
Jr. Member
**
Karma: 1
Posts: 88
Macbidouilleur
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

++
Logged


France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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é.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1]   Go Up
Jump to: