Er der en konstant for den maksimale usignerede lange værdi i en Arduino-kompilator?

Jeg skriver en timerfunktion, der bruger funktionen micros (), der genererer en usigneret lang værdi. For at kompensere for en roll-over-tilstand vil jeg gerne bruge den maksimale værdi for den variable type. Jeg har et nummer, 4.294.967.295, men forventede, at det skulle være et konstant et eller andet sted.

Er der en MAX_UNSIGNED_LONG konstant i Arduino-compiler-filerne et eller andet sted?

Jeg har prøvet det navn og ved, at det sandsynligvis ikke er det. Stadig stikker rundt.

Svar

Forskellige limits.h filer i avr-gcc hierarkiet definerer ULONG_MAX, hvilket kan være værdien for eksempel. På mit system har sådanne filer stier, der slutter med hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h eller med hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h og indeholder definitioner som følgende.

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

Bemærk, LONG_MAX er også defineret i limits.h.

Bemærk, aritmetik udført i en form som

timeDelta = micros() - prevTime; 

vil være korrekt (uanset om micros() overløb) i forløbne tider op til 2³² mikrosekunder eller ca. 4295 sekunder.

Svar

Du behøver ikke “at kompensere for en roll-over-tilstand “.

Se mit svar: https://arduino.stackexchange.com/a/33577/10794


i en Arduino-kompilator?

“Arduino” -kompilatoren er en C ++ -kompilator. Det er udgangspunktet for de fleste spørgsmål. Hvis du googler til:

maximum unsigned long in c++ 

Du finder det første link fører til:

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

I den siger det:

ULONG_MAX Maximum value for an object of type unsigned long int 

Svar

Forsøgte du at gøre dette ?:

unsigned long maxUnsignedLong = 0UL - 1UL; 

eller:

const unsigned long ULONG_MAX = 0UL - 1UL; 

Svar

Fra netværk synes jeg, det er ikke så let at find det rigtige svar på den maksimale værdi af micros () på mine egne arduino-kort også.
I mit tilfælde , ser ud til, at micros () ruller omkring hvert 17. sekund. Endelig skrev jeg Setup () for mig selv for at fange 0x1111111 som den maksimale værdi af mikro () som følger.

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

Kommentarer

  • forfine kommentaren fra " int n, nMin = 0, nMax = 0; "
  • Nej, dette er helt forkert . Se arduino.cc/da/Reference/Micros der gives en rollover-tid på ca. 70 minutter, der svarer til maksimumet af en usigneret lang i mikrosekunder, konverteret til minutter (faktisk 71 og et halvt minut)
  • Nå, jeg ' har set rollover-tiden på ca. 70 minutter. Men jeg ved virkelig ikke ' hvorfor min micros () -opkald på mit wifi-dreng esp32-kort vælter omkring hvert 17. sekund. Kunne du forestille dig det?
  • Denne form for " fanger det under handlingen " eksperimentet er mangelfuldt til at begynde med , men blandes derefter yderligere sammen i AVR vs ESP-forskelle – for eksempel ville denne kode ikke ' ikke engang være gyldig på en AVR, hvor% d ville fortolke en usigneret lang – det kan " næsten " arbejder på en ESP32, men vil stadig blande tegnbit. Du burde virkelig læse dokumentationen eller kildekoden til kernen.
  • Jeg fandt ud af, at min wifiboy esp32 faktisk kører på 240 MHz. Så den maksimale usignerede lange værdi af makroer () 0xffffffff / 240 er 0x1111111. Dette er præcis, hvad jeg fik. Mange tak!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *