Fonction millis() ,boucle "for"

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 ?

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);
}

Bonsoir,

Avec 3000000000ul, ça donne quoi ?

Bonsoir Atos

ATOS_VQ:
Bonjour à tous

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

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

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.

Bonsoir kamill

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

Version 1.8.3 Windows 7
Carte UNO

kamill:
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

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

ATOS_VQ:
Bonsoir
Merci pour toutes vos réponses

Donc en résume le mystère demeure

Non : aucun mystère.

bidouilleelec:
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

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

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>

""Le code est le code de ATOS_VQ
"" !!!
Sous 1.8.3 ???

Version du compilateur?
De l'optimiseur?

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

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

500ms

bidouilleelec:
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.

Pour 30000000

debut
0
13704
27409
41114

Pour 3000000

debut
0
1819
3641
5462
7282

i <= 30000000/00/

lesept:
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.

kamill:
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

Quelle est ta version?

bidouilleelec:
i <= 30000000/00/

bidouilleelec:
*avec ma version,*1.8.3

????