Go Down

Topic: Fonction millis() ,boucle "for" (Read 989 times) previous topic - next topic

bidouilleelec


kamill

Quelle que soit la valeur que tu mets dans la boucle ? C'est la durée du delay...
C'est peut-être que ça pédale trop vite pour changer quoi que ce soit ?
Le compilateur peut optimiser en supprimant des instruction, mais dans mon essai, avec ma version, on voit bien dans le désassemblage que la boucle est effectivement exécutée.

bidouilleelec

#17
Mar 18, 2019, 11:49 pm Last Edit: Mar 18, 2019, 11:56 pm by bidouilleelec
Le compilateur peut optimiser en supprimant des instruction, mais dans mon essai, avec ma version, on voit bien dans le désassemblage que la boucle est effectivement exécutée.

avec ma version,
1.8.3

kamill



ATOS_VQ

Bonjour à tous

Le mystère persiste avec un  autre problème ou piège plus exactement.
J'ai tenté le nbr de boucle max soit 2^32-1 , et la aucun résultat !

En fait on pourrait penser que la boucle s'effectue jusqu'au débordement, mais non aucune boucle ne s'effectue
La toute dernière boucle serait pour i=2^32-1, mais i++ est incrémente et déborde ! On ne peut donc faire que 2^32-2 boucles

Mais le plus surprenant est que ces quelques 4 milliards d'opérations sont faites en un temps record, invisible !!!!

Je n'ai pas vérifier la fréquence d'horloge de l'Atmega ni le nbr d'opérations par cycle d'horloge, mais même à 1 opération élémentaire par cycle à 40Mhz , la sortie de boucle devrait se faire en gros après 100 secondes .
Ils sont forts ces chinois ils ont réussi à faire tourner l'Arduino Nano à plus de 1Ghz !!! ????
Trèfle de plaisanterie je suis preneur d'explications ....


Code: [Select]

unsigned long Temp;
unsigned long Data;
unsigned long MaxLong =pow(2,32)-1;
void setup() {
Serial.begin(9600);
 Serial.println("Debut");
}

void loop() {
 
  Temp=millis(); 
  Data=0;
      for(unsigned long i=1 ; i <= MaxLong-1; i++){    // j'ai mis le paquet de CHEZ PAQUET
        Data= Data+1;
       
       }

Serial.println(Data);

delay(500);
}

ATOS_VQ

.....suite ma version IDE Arduino = 1.8.8
Arduino Nano aux yeux bridés
Windows 10
Super PC ASUS bête de course

bidouilleelec

Bonjour ATOS__VQ
Bonjour à tous

Le mystère persiste avec un  autre problème ou piège plus exactement.


Il n'y a aucun mystère.
Voir le post #2.

Remplacez  "Data= Data+1;"  par des instructions no-op.

Cordialement,
bidouilleelec

ATOS_VQ

Merci bidouillelec

Je n'ai pas trouve cette instruction no-op qui est refusée par le compilateur et je ne l'ai pas trouvée dans les références Arduino, peux tu me donner la bonne syntaxe , merci beaucoup

dbrion06

Comme Data ne sert nulle part, l'optimiseur, s'il fait bien son travail, va retirer la ligne (si j'ose dire) Data++;
La boucle ne servant plus à rien, l'optimiseur zélé va la retirer aussi, (et le stockage et le temps de calcul seront améliorés).
Deux solutions sont possibles:
a) Déclarer Data comme "volatile", pour ... éviter que l'optimiseur ne la volatilise.
b) forcer des instructions assembleurs (NOP ne fait rien) dans cette boucle cf https://www.nongnu.org/avr-libc/user-manual/inline_asm.html et ... les déclarer comme volatiles.

bidouilleelec

#25
Mar 19, 2019, 02:20 pm Last Edit: Mar 19, 2019, 05:52 pm by bidouilleelec
Merci bidouillelec

Je n'ai pas trouve cette instruction no-op qui est refusée par le compilateur et je ne l'ai pas trouvée dans les références Arduino, peux tu me donner la bonne syntaxe , merci beaucoup
Je parlais de votre 1er code.

Dans le cas de votre second code :
"Serial.println(Data);" rend la donnée Data fonctionnelle.
Elle est utile à une sortie.
Et donc la boucle for devient effective et prise en compte..

A vous de voir la structure de votre second programme.
(au passage : la compilation comporte un warning, au moins sur IDE 1.8.8  ) .

no-op : ( instruction no operation)
https://whatis.techtarget.com/definition/no-op-no-operation
https://whatis.techtarget.com/definition/no-op-no-operation

Cordialement,
bidouilleelec

bidouilleelec

Deux solutions sont possibles:
a) Déclarer Data comme "volatile", pour ... éviter que l'optimiseur ne la volatilise.

Bah! non

bidouilleelec

Bonjour dbrion06

Bah! non
J'ai écris une bêtise :
""  Déclarer Data comme "volatile"  ""
règle effectivement le problème.

Cordialement,
bidouilleelec

dbrion06

Ce n'était pas une bêtise, mais une demi bêtise, à mettre en regard de l'idée brillante de mettre des NOP -prennent 1/16 us chacun sur Arduino-  pour tester le temps d'éxécution d'une boucle vide (à soustraire du temps d'éxécution d'une boucle faisant des calculs répétitifs).
Et qu'est une seule -dans le pire des cas-  bêtise face au désordre ambient?
Te av baxtalo.

ATOS_VQ

Bonjour
Je reviens à la charge pour ce pb de durée instruction,je n'y suis jamais arrivé alors le recours à l'oscilloscope a été salutaire et très décevant,l'extrait du super programme ci dessous génère un signal en crenaux d'une période de 8.5 us !!!(micro seconde) sur Arduino Nano Atmega 328, soit environ 4us par instruction je suis loin des 33ns du dsPic4013
(Je suis débutant en Arduino)



void loop() {
digitalWrite(PD_SCK,HIGH);
digitalWrite(PD_SCK,LOW);
   
}


Go Up