Go Down

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

ATOS_VQ

Bonjour à tous

Ci dessous un tout petit programme qui devait me servir à définir des temps d'exécution...
La boucle "for" n'introduit aucune différence dans l'affichage qui s'incrémente de 500ms à chaque boucle
Quelque soit le nombre de boucle for le résultat est toujours le même !!!
il faut croire que mon Arduino Nano est un processeur quantique !!
Quelqu'un aurait il une explication ?

Code: [Select]

unsigned long Temp;
unsigned long Data;

void setup() {
Serial.begin(9600);
 Serial.println("debut");
}

void loop() {
 
  Temp=millis(); 

      for(unsigned long i=0 ; i <= 3000000000 ; i++){    // j'ai mis le paquet
        Data= Data+1;
       }

Serial.println(Temp);

delay(500);
}

Zlika

Bonsoir,

Avec 3000000000ul, ça donne quoi ?
Si ça coince, forcez. Si ça casse, ça devait probablement être réparé, de toute façon.

bidouilleelec

#2
Mar 18, 2019, 10:00 pm Last Edit: Mar 18, 2019, 10:22 pm by bidouilleelec
Bonsoir Atos
Bonjour à tous


La boucle "for" n'introduit aucune différence dans l'affichage qui s'incrémente de 500ms à chaque boucle


Code: [Select]

unsigned long Temp;
unsigned long Data;

void setup() {
Serial.begin(9600);
 Serial.println("debut");
}

void loop() {
 


      for(unsigned long i=0 ; i <= 3000000000 ; i++){    // j'ai mis le paquet
        Data= Data+1;
       }


}

L'optimiseur voit que la variable Data ne sert à rien.  [n'a aucun rôle fonctionnel]
ET il supprime complétement la boucle for.
Essayez de désassembler le code.
Ou mettez des instructions no-op dans la boucle.

Cordialement,
bidouilleelec

kamill

Bonjour,

Chez moi ça fonctionne et dépend du nombre de boucles. Ça dépend peut être de la version.
Essaies de déclarer Data comme volatile pour éviter l'optimisation.

bidouilleelec

#4
Mar 18, 2019, 10:27 pm Last Edit: Mar 18, 2019, 10:38 pm by bidouilleelec
Bonsoir kamill
Bonjour,

Chez moi ça fonctionne et dépend du nombre de boucles. Ça dépend peut être de la version.
Essaies de déclarer Data comme volatile pour éviter l'optimisation.
"Chez moi ça fonctionne"

Ahhhh?

Unix ou windows ?
Quelle version  ( non trafiquée) de l'IDE ?

Cordialement,
bidouilleelec

kamill

Version 1.8.3 Windows 7
Carte UNO

bidouilleelec

#6
Mar 18, 2019, 10:57 pm Last Edit: Mar 18, 2019, 11:06 pm by bidouilleelec
Version 1.8.3 Windows 7
Carte UNO
Envoyez le code et le code désassemblé.

Je n'ai pas la 1.8.3

Je n'essaierais pas  "" déclarer Data comme volatile pour éviter l'optimisation "".

Mais on dérive.

Cordialement,
Bidouilleelec

ATOS_VQ

Bonsoir
Merci pour toutes vos réponses
J'ai tente un nbr de boucles dépassant la capacité d'un "unsigned long" dans ce cas la la boucle ne se fait pas
Je suis sous Windoqs10 avec un ARDUINO Nano chinois.....

Je souhaite connaitre les temps d'exécution car en regardant les programme pour le HX711 je me suis rendu compte que ces programmes ne tenaient pas compte du datasheet du Hx711 du point de vu chronologie.....à moins que je me sois trompé

Donc en résume le mystère demeure

bidouilleelec

Bonsoir
Merci pour toutes vos réponses


Donc en résume le mystère demeure

Non : aucun mystère.

kamill

Envoyez le code et le code désassemblé.
Le code est le code de ATOS_VQ, mais j'ai supprimé deux zéros car je ne voulais pas attendre jusqu'à demain
Code: [Select]
unsigned long Temp;
unsigned long Data;

void setup() {
  Serial.begin(115200);
  Serial.println("debut");
}

void loop() {

  Temp = millis();

  for (unsigned long i = 0 ; i <= 30000000/*00*/ ; i++) { // j'ai mis le paquet
    Data = Data + 1;
  }

  Serial.println(Temp);

  delay(500);
}


Début désassemblage de la loop
Code: [Select]
void loop() {

 Temp = millis();
5bc: 20 93 29 01 sts 0x0129, r18 ; 0x800129 <Temp>
5c0: 30 93 2a 01 sts 0x012A, r19 ; 0x80012a <Temp+0x1>
5c4: 40 93 2b 01 sts 0x012B, r20 ; 0x80012b <Temp+0x2>
5c8: 50 93 2c 01 sts 0x012C, r21 ; 0x80012c <Temp+0x3>
5cc: 80 91 25 01 lds r24, 0x0125 ; 0x800125 <Data>
5d0: 90 91 26 01 lds r25, 0x0126 ; 0x800126 <Data+0x1>
5d4: a0 91 27 01 lds r26, 0x0127 ; 0x800127 <Data+0x2>
5d8: b0 91 28 01 lds r27, 0x0128 ; 0x800128 <Data+0x3>
5dc: 61 e8       ldi r22, 0x81 ; 129
5de: c6 2e       mov r12, r22
5e0: 63 ec       ldi r22, 0xC3 ; 195
5e2: d6 2e       mov r13, r22
5e4: 69 ec       ldi r22, 0xC9 ; 201
5e6: e6 2e       mov r14, r22
5e8: ff 24       eor r15, r15
5ea: f3 94       inc r15
5ec: 61 e0       ldi r22, 0x01 ; 1
5ee: c6 1a       sub r12, r22
5f0: d1 08       sbc r13, r1
5f2: e1 08       sbc r14, r1
5f4: f1 08       sbc r15, r1

 for (unsigned long i = 0 ; i <= 30000000/*00*/ ; i++) { // j'ai mis le paquet
5f6: d1 f7       brne .-12     ; 0x5ec <main+0x164>
5f8: 8f 57       subi r24, 0x7F ; 127
5fa: 9c 43       sbci r25, 0x3C ; 60
5fc: a6 43       sbci r26, 0x36 ; 54
5fe: be 4f       sbci r27, 0xFE ; 254
600: 80 93 25 01 sts 0x0125, r24 ; 0x800125 <Data>
604: 90 93 26 01 sts 0x0126, r25 ; 0x800126 <Data+0x1>
608: a0 93 27 01 sts 0x0127, r26 ; 0x800127 <Data+0x2>
60c: b0 93 28 01 sts 0x0128, r27 ; 0x800128 <Data+0x3>

bidouilleelec

#10
Mar 18, 2019, 11:28 pm Last Edit: Mar 18, 2019, 11:59 pm by bidouilleelec
""Le code est le code de ATOS_VQ
"" !!!
Sous 1.8.3 ???

Version du compilateur?
De l'optimiseur?

lesept

@kamill @bidouillelec
Pouvez vous juste fournir les sorties console avec diverses valeurs de boucles ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

bidouilleelec

@kamill @bidouillelec
Pouvez vous juste fournir les sorties console avec diverses valeurs de boucles ?
500ms

lesept

500ms
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 ?

Ceci dit, j'avais déjà remarqué un truc comme ça avec un ESP32, mais je pensais qu'il était trop rapide pour que mes boucles soient efficaces. Et pourtant j'avais mis le paquet ; trois boucles imbriquées pour multiplier les durées... Pas vu de différence.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

kamill

Pour 30000000
debut
0
13704
27409
41114
Pour 3000000
debut
0
1819
3641
5462
7282

Go Up