Pages: [1]   Go Down
Author Topic: Précision boucle for vide  (Read 765 times)
0 Members and 1 Guest are viewing this topic.
France - Morbihan
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

je fais en ce moments quelques petits tests à l'oscilloscope pour voir ce que ma carte Arduino Duelmilanove "a dans le ventre"... et ce faisant, je me suis rendu compte qu'une boucle for vide ne semble pas être exécutée.

Habitué au C, j'utilise une ligne du type suivant pour faire une pause :

for (int i=0; i<10000; i++); // pause

Apparemment, la même chose avec Arduino ne fait rien (je mets une broche à 1 avant, je fais la boucle, je mets la broche à 0 après...) , en tout cas, pas de pause à l'exécution ( mon oscillo détecte jusqu'à 0.1µs/div...)

Vous confirmez ? C'est pas grave du tout en soi, mais c'est juste pour savoir si j'ai bon .

Merci
Logged

Massongex, Suisse
Offline Offline
Full Member
***
Karma: 3
Posts: 169
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

C'est certainement le compilateur C qui optimise le code. Une boucle qui ne fait rien 10000 fois peut très bien être remplacée par une boucle qui ne fait rien du tout... Essaye de rajouter une instruction qui ne fait rien d'autre que de consommer du temps dans ta boucle, genre :
Code:
__asm__("nop\n\t");
(je ne suis pas sur de la syntaxe)
Churchill
Logged

France - Morbihan
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci pour ta réponse.

Oui, j'ai aussi pensé que çà pouvait être le compilateur C qui optimisait le code.

J'avais testé ce que tu proposes : mettre une instruction dans la boucle. En fait comme je voulais un niveau haut pendant la boucle, j'ai mis un PORTD=B000000100 pour avoir la pin 2 de l'Arduino  à 1, et là c'est bon, çà prend en compte la boucle...

C'est tout bête, mais ce genre de détail peut prendre la tête tant qu'on n'a pas détecté qu'une boucle vide n'est pas prise en compte...

Côté performance, la carte Arduino "en a sous le capot" : l'ATMega 328 à 16Mhz met environ 100 nanosecondes (0,1µs !) pour mettre un niveau 1 sur une broche... (3,5µs avec un digitalWrite)... calcule un sinus (float) en 120 µs... Bref, je suis plus que satisfait de mes petits tests...
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Comme dit précédemment c'est lié à l'optimisation du code. Un moyen simple de déterminer si une code est pris en compte par le compilateur, c'est de comparer la taille du résultat compilé en commentant certaines parties du code.
Si la taille ne change pas  (sans effectuer d'autres modifs dans le code) c'est que l'optimisation est intervenue.
Utilisant différents compilateurs depuis de longues années, je dois dire que celui de l'arduino est de bonne facture.
A+ Didier
Logged

France - Morbihan
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

tout à fait d'accord avec tes remarques :
- la taille du fichier compilé donne une idée de ce que fait le compilateur
- les messages d'erreur à la compilation sont aussi souvent très utiles et bien orientés pour trouver d'où vient le problème.

Personnellement, j'ai une bonne habitude de SDCC, compilateur opensource pour les PIC... (ma vie avant Arduino, of course... ) et je retrouve le niveau de qualité auquel j'étais habitué avec Arduino..
Logged

Pages: [1]   Go Up
Jump to: