Fonction millis() ,boucle "for"

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 
5c0: 30 93 2a 01 sts 0x012A, r19 ; 0x80012a 
5c4: 40 93 2b 01 sts 0x012B, r20 ; 0x80012b 
5c8: 50 93 2c 01 sts 0x012C, r21 ; 0x80012c 
5cc: 80 91 25 01 lds r24, 0x0125 ; 0x800125 
5d0: 90 91 26 01 lds r25, 0x0126 ; 0x800126 
5d4: a0 91 27 01 lds r26, 0x0127 ; 0x800127 
5d8: b0 91 28 01 lds r27, 0x0128 ; 0x800128 
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 
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 
604: 90 93 26 01 sts 0x0126, r25 ; 0x800126 
608: a0 93 27 01 sts 0x0127, r26 ; 0x800127 
60c: b0 93 28 01 sts 0x0128, r27 ; 0x800128 

""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

????

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 …

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

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

Bonjour ATOS__VQ

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

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

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.

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

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

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

Bah! non

Bonjour dbrion06

bidouilleelec: Bah! non

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

Cordialement, bidouilleelec