Gibt es eine Konstante für den Wert „Maximum Unsigned Long“ in einem Arduino-Compiler?

Ich schreibe eine Timer-Funktion, die die micros () -Funktion verwendet, die einen vorzeichenlosen langen Wert generiert. Um eine Rollover-Bedingung zu kompensieren, möchte ich den Maximalwert für diesen Variablentyp verwenden. Ich habe eine Zahl, 4.294.967.295, aber ich hatte erwartet, dass dies irgendwo eine Konstante ist.

Gibt es irgendwo eine MAX_UNSIGNED_LONG-Konstante in den Arduino-Compiler-Dateien?

Ich habe diesen Namen ausprobiert und weiß, dass es wahrscheinlich nicht so ist. Ich stöbere immer noch herum.

Antwort

Verschiedene limits.h -Dateien in der avr-gcc -Hierarchie definieren ULONG_MAX, was der Wert sein kann Auf meinem System haben solche Dateien beispielsweise Pfade, die mit hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h oder hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h enden, und enthalten Definitionen wie die folgenden.

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

Hinweis: LONG_MAX ist auch in limits.h definiert.

Beachten Sie, dass Arithmetik in einer Form wie

timeDelta = micros() - prevTime; 

korrekt ist (unabhängig davon, ob micros() übergelaufen) für verstrichene Zeiten bis zu 2³² Mikrosekunden oder etwa 4295 Sekunden.

Antwort

Das brauchen Sie nicht eine Überrollbedingung kompensieren „.

Siehe meine Antwort: https://arduino.stackexchange.com/a/33577/10794


in einem Arduino-Compiler?

Der „Arduino“ -Compiler ist ein C ++ – Compiler. Das ist der Ausgangspunkt für die meisten Fragen. Wenn Sie nach Google suchen:

maximum unsigned long in c++ 

Der erste Link führt zu:

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

Darin heißt es:

ULONG_MAX Maximum value for an object of type unsigned long int 

Antwort

Haben Sie dies versucht?:

unsigned long maxUnsignedLong = 0UL - 1UL; 

oder:

const unsigned long ULONG_MAX = 0UL - 1UL; 

Antwort

Aus dem Netzwerk scheint es mir nicht so einfach zu sein finde die richtige Antwort von dem Maximalwert von micros () auch meiner eigenen Arduino-Boards.
In meinem Fall scheint, dass micros () etwa alle 17 Sekunden überrollt. Schließlich habe ich das Setup () für mich geschrieben, um 0x1111111 als Maximalwert von micros () wie folgt abzufangen.

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

Kommentare

  • Verfeinern Sie den Kommentar von " int n, nMin = 0, nMax = 0; "
  • Nein, das ist völlig falsch . Siehe arduino.cc/en/Reference/Micros . Dort wird eine Rollover-Zeit von ca. 70 Minuten angegeben, die dem Maximum eines vorzeichenlosen Longs in Mikrosekunden entspricht, konvertiert in Minuten (tatsächlich 71 und halbe Minuten)
  • Nun, ich ' habe die Rollover-Zeit von ungefähr 70 Minuten gesehen. Aber ich weiß wirklich nicht ', warum auf meinem WLAN-Jungen esp32-Board der Aufruf von micros () etwa alle 17 Sekunden wechselt. Könnten Sie sich das vorstellen?
  • Diese Art von " fängt es im Akt " ist zunächst fehlerhaft , wird dann aber in AVR- und ESP-Unterschieden weiter verwechselt – zum Beispiel würde dieser Code ' nicht einmal auf einem AVR gültig sein, wo% d einen vorzeichenlosen Long falsch interpretieren würde – es könnte sein " fast " funktioniert auf einem ESP32, würde aber das Vorzeichenbit immer noch verwechseln. Sie sollten unbedingt die Dokumentation oder den Quellcode des Kerns lesen.
  • Ich habe festgestellt, dass mein wifiboy esp32 tatsächlich mit 240 MHz läuft. Der maximale vorzeichenlose Long-Wert von macros () 0xffffffff / 240 ist also 0x1111111. Genau das habe ich bekommen. Vielen Dank!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.