Existe-t-il une constante pour la valeur maximale non signée dans un compilateur Arduino?

Jécris une fonction de minuterie qui utilise la fonction micros () qui génère une valeur longue non signée. Pour compenser une condition de retournement, je voudrais utiliser la valeur maximale pour ce type de variable. Jai un nombre, 4 294 967 295, mais je mattendais à ce que ce soit une constante quelque part.

Y a-t-il une constante MAX_UNSIGNED_LONG dans les fichiers du compilateur Arduino quelque part?

Jai essayé ce nom et je sais que ce nest probablement pas ça. Je fouille toujours.

Réponse

Divers fichiers limits.h dans la hiérarchie avr-gcc définissent ULONG_MAX, qui peut être la valeur par exemple, sur mon système, ces fichiers ont des chemins se terminant par hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h ou par hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h et contiennent des définitions comme celle-ci.

/* Maximum value an `unsigned long int" can hold. (Minimum is 0). */ #undef ULONG_MAX #define ULONG_MAX (LONG_MAX * 2UL + 1UL) 

Remarque, LONG_MAX est également défini dans limits.h.

Remarque, larithmétique effectuée sous une forme telle que

timeDelta = micros() - prevTime; 

sera correcte (indépendamment du fait que micros() débordé) pendant des temps écoulés jusquà 2³² microsecondes, soit environ 4 295 secondes.

Réponse

Vous navez pas besoin de compenser une condition de report « .

Voir ma réponse: https://arduino.stackexchange.com/a/33577/10794


dans un compilateur Arduino?

Le compilateur « Arduino » est un compilateur C ++. Cest le point de départ de la plupart des questions. Si vous recherchez sur Google:

maximum unsigned long in c++ 

Vous trouverez le premier lien mène à:

http://www.cplusplus.com/reference/climits/

En cela, il est dit:

ULONG_MAX Maximum value for an object of type unsigned long int 

Réponse

Avez-vous essayé de faire cela?:

unsigned long maxUnsignedLong = 0UL - 1UL; 

ou:

const unsigned long ULONG_MAX = 0UL - 1UL; 

Réponse

Depuis le réseau, il me semble que ce nest pas si simple trouver la bonne réponse de la valeur maximale de micros () de mes propres cartes arduino, aussi.
Dans mon cas , semble que micros () roule environ toutes les 17 secondes. Enfin, jai écrit Setup () pour moi-même afin de saisir 0x1111111 comme valeur maximale de micros () comme suit.

void setup () { Serial.begin( 115200 ); // set the baud rate for writing messages. int go = 1; // set the flag to continue do-while loop; int n, nMin = 0, nMax = 0; // see how many more the numbers of calling micros() to get different value; int d, dMin, dMax; // see the time interval of micros() having different values; unsigned long currT; // the time of current micros() calling unsigned long lastT = micros(); // the time of last micros() calling unsigned long T[200]; // keep tracking 200 different lastT values int it = 0; // use T[it%200] to keep each lastT (circular buffer) do { n = 0; while( (currT=micros()) == lastT ) n++; // get a different value T[ (it++) % 200 ] = currT; // save the value d = currT - lastT; // get the difference if ( d<0 ) { // if micros() rolls over go = 0; // stop this do-while loop Serial.println(); // print new line for ( int i=it-200, j=0; i<it; i++ ) { Serial.printf( "%9x", T[i%200] ); // the last 200 different lastT values if ( ++j%5==0 ) Serial.println(); // } Serial.printf("\nat %d ms lastT 0x%x currT 0x%x n=[%d..%d] d=[%d..%d]\n", millis(), lastT, currT, nMin, nMax, dMin,dMax); } if ( !nMin && !nMax ) nMin = nMax = n, dMin = dMax = d; if ( nMin>n ) { PRINTF( "\nat %d ms nMin %d > n %d ", millis(), nMin, n); nMin = n; } else if ( nMax<n ) { PRINTF( "\nat %d ms nMax %d < n %d", millis(), nMax, n ); nMax = n; } if ( dMin>d ) dMin = d; else if ( dMax<d ) dMax = d; lastT = currT; } while( go ); } 

Commentaires

  • affiner le commentaire de " int n, nMin = 0, nMax = 0; "
  • Non, cest totalement faux . Voir arduino.cc/en/Reference/Micros , un temps de roulement denviron 70 minutes est donné, ce qui correspond au maximum dun long non signé en microsecondes, converti en minutes (en fait 71 minutes et demie)
  • Eh bien, jai ' vu le temps de roulement denviron 70 minutes. Mais, je ne sais vraiment ' pourquoi, sur ma carte esp32 wifi boy, lappel micros () se répète toutes les 17 secondes environ. Pourriez-vous l’imaginer?
  • Ce type d’expérience " attrapez-le en flagrant délit " est défectueux pour commencer , mais est ensuite mélangé dans les différences AVR vs ESP – par exemple, ce code ne serait même pas ' valide sur un AVR, où% d interpréterait mal un long non signé – il pourrait " presque " fonctionne sur un ESP32, mais mélangerait toujours le bit de signe. Vous devriez vraiment lire la documentation, ou le code source du noyau.
  • Jai trouvé quen fait mon wifiboy esp32 fonctionne à 240 Mhz. Ainsi, la valeur longue non signée maximale des macros () 0xffffffff / 240 est 0x1111111. Cest exactement ce que jai. Merci beaucoup!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *