Go Down

Topic: [résolu] lire puis reproduire un code série (Read 6960 times) previous topic - next topic

skywodd


J'ai remarqué qu'un while(qqchose); n'était pas compilé, du coup, mes boucles d'attentes ne marchaient pas... c'est pourquoi j'incrémente dumy, histoire de compiler quelque chose... peut-être qu'une paire d'accolades auraient suffit...

Comment as tu prouvé que les boucles n'était pas compilées ? En passant l'assembleur à la mano ?
Ça me semble bizarre comme histoire ces boucles qui boucle pas.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Super_Cinci

simplement parce que :

Code: [Select]

  T1_start(2500, 9375);      // prend en compte les impulsions entre 160 et 600 ms, normalement, l'impulsion fait 300ms.
  while (T1_count < 10);     // attendre 10 clignotements

n'attendait rien du tout. ou dans T1_start(), T1_count est mis à 0 et n'est modifié que dans les interruptions ICP1 ou TOVF, Comme T1 est configuré pour tourner au plus lent, un TOVF met 4,192 secondes pour arriver. ma séquence ne durait qu'une petite seconde (car il y a des delays). Quand j'ai rajouté mon dumy++, j'ai tout de suite retrouvé mes 4 secondes!

il faudrait que j'essaie   while (T1_count < 10){} pour voir.

skywodd

Bizarre, surement l'optimisation de code qui dégage la boucle.
Si tu ajoutes un volatile asm("nop"); dans le boucle ça fait quoi ?
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Super_Cinci

Alors j'ai testé 4 cas différents, sans rien sur ICP1, donc le timer tourne jusqu'au TOVF, la boucle while doit normalement durer 4 secondes environ. :

Code: [Select]

  T1_start(2500, 9375);      // prend en compte les impulsions entre 160 et 600 ms, normalement, l'impulsion fait 300ms.
  while (T1_count < 10){}     // attendre 10 clignottements
  T1_stop;

Taille code : 702, fonctionnement : OK.

Code: [Select]

  T1_start(2500, 9375);      // prend en compte les impulsions entre 160 et 600 ms, normalement, l'impulsion fait 300ms.
  while (T1_count < 10){
    asm("nop");
  };     // attendre 10 clignottements
  T1_stop;

Taille code : 706, fonctionnement : OK. un NOP = 2 octets. alors pourquoi 4 de plus... mystère!

Code: [Select]

  T1_start(2500, 9375);      // prend en compte les impulsions entre 160 et 600 ms, normalement, l'impulsion fait 300ms.
//  while (T1_count < 10);     // attendre 10 clignottements
  T1_stop;

Taille code : 688, fonctionnement : pas OK.

Code: [Select]

  T1_start(2500, 9375);      // prend en compte les impulsions entre 160 et 600 ms, normalement, l'impulsion fait 300ms.
  while (T1_count < 10);     // attendre 10 clignottements
  T1_stop;

Taille code : 702, fonctionnement : OK. et là, c'est passé... étonnant, non?

Bon, de toutes façon, ça marche dans la voiture, c'est le principal. et vu le peu que je demande au 328, je n'ai vraiment pas besoin d'optimisation, des digitalWrite() auraient même pu trouver leurs places, mais bon, j'ai un minimum d'amour propre à préserver... XD

skywodd

Bizarre bizarre, mais si ça marche au final tant mieux :smiley-mr-green:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Super_Cinci


Code: [Select]

  T1_start(2500, 9375);      // prend en compte les impulsions entre 160 et 600 ms, normalement, l'impulsion fait 300ms.
  while (T1_count < 10){
    asm("nop");
  };     // attendre 10 clignottements
  T1_stop;

Taille code : 706, fonctionnement : OK. un NOP = 2 octets. alors pourquoi 4 de plus... mystère!

Le point-virgule après l'accolade est passé, mais ce genre de fantaisie ne serait-elle pas comprise comme un nop, ce qui expliquerait les 2 octets supplémentaires que je n'explique pas?

skywodd


Le point-virgule après l'accolade est passé, mais ce genre de fantaisie ne serait-elle pas comprise comme un nop, ce qui expliquerait les 2 octets supplémentaires que je n'explique pas?

Non c'est plus compliqué.
Le point virgule ponctue la fin d'une instruction ou signifie "pas d'instruction" si utilisait seul.

En gros :
Code: [Select]
while(i < 10) ;
et équivalent à :
Code: [Select]
while(i < 10) { }

La nuance est subtile, le compilateur n'est pas obligé de mettre un NOP.
De plus si la variable que tu tests n'est pas volatile (= "tu optimises pas !") le compilateur peut très bien ce dire "c'est toujours vrai/faux, je dégage la boucle ça sert à rien de toute façon".
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Super_Cinci

je pense tout pareil que toi.

Dans la mesure où quand on fait un while(i<10);, c'est qu'il y a une interruption qui va changer i mais on ne sait pas quand ça va se produire, donc on n'est pas à quelques instructions près. A l'avenir, je mettrai un nop dedans pis c'est tout.

Faut pas cracher dans le nop!

dans tous mes codes utilisant serial, je faisais un while(!Serial.available()); et c'est toujours passé bien, mais peut-être que dans la condition il y a un appel à fonction...

Go Up