Is er een constante voor de Maximum Unsigned Long-waarde in een Arduino-compiler?

Ik schrijf een timerfunctie die de functie micros () gebruikt die een lange waarde zonder teken genereert. Om een roll-over-conditie te compenseren, zou ik de maximale waarde voor dat type variabele willen gebruiken. Ik heb een nummer, 4.294.967.295, maar verwachtte dat dat ergens een constante zou zijn.

Is er ergens een MAX_UNSIGNED_LONG-constante in de Arduino-compileerbestanden?

Ik heb die naam geprobeerd en weet dat het dat waarschijnlijk niet is. Nog steeds aan het rondneuzen.

Antwoord

Verschillende limits.h bestanden in de avr-gcc hiërarchie definiëren ULONG_MAX, wat de waarde kan zijn je wilt. Op mijn systeem hebben dergelijke bestanden bijvoorbeeld paden die eindigen op hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h of op hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h en bevatten ze definities als de volgende.

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

Opmerking, LONG_MAX wordt ook gedefinieerd in limits.h.

Let op, rekenkunde gedaan in een vorm als

timeDelta = micros() - prevTime; 

zal correct zijn (ongeacht of micros() overflowed) voor verstreken tijden tot 2³² microseconden, of ongeveer 4295 seconden.

Antwoord

Je hoeft “niet” om compenseren voor een roll-over conditie “.

Zie mijn antwoord: https://arduino.stackexchange.com/a/33577/10794


in een Arduino-compiler?

De “Arduino” -compiler is een C ++ -compiler. Dat is het uitgangspunt voor de meeste vragen. Als u googelt voor:

maximum unsigned long in c++ 

U vindt de eerste link die leidt naar:

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

Daarin staat:

ULONG_MAX Maximum value for an object of type unsigned long int 

Answer

Heb je dit geprobeerd ?:

unsigned long maxUnsignedLong = 0UL - 1UL; 

of:

const unsigned long ULONG_MAX = 0UL - 1UL; 

Antwoord

Van het netwerk, lijkt mij, is het niet zo eenvoudig om vind ook het juiste antwoord van de maximale waarde van micros () van mijn eigen Arduino-boards.
In mijn geval , lijkt het erop dat micros () ongeveer elke 17 seconden overgaat. Ten slotte heb ik de Setup () voor mezelf geschreven om 0x1111111 als de maximale waarde van micros () als volgt te vangen.

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

Reacties

  • verfijn de opmerking van " int n, nMin = 0, nMax = 0; "
  • Nee, dit is helemaal verkeerd . Zie arduino.cc/en/Reference/Micros daar wordt een rollover-tijd gegeven van ongeveer 70 minuten, wat overeenkomt met het maximum van een niet-ondertekende long in microseconden, geconverteerd naar minuten (eigenlijk 71 en een halve minuut)
  • Nou, ik ' heb de rollover-tijd van ongeveer 70 minuten gezien. Maar ik weet echt niet ' waarom, op mijn wifi boy esp32-bord, het bellen met micros () ongeveer elke 17 seconden overgaat. Kunt u het zich voorstellen?
  • Dit soort " betrapt het op heterdaad " experiment is om te beginnen gebrekkig , maar raakt dan verder verward in AVR versus ESP-verschillen – deze code zou bijvoorbeeld niet ' zelfs niet geldig zijn op een AVR, waar% d een niet-ondertekende lange fout zou interpreteren – " bijna " werken op een ESP32, maar zouden nog steeds de tekenbit verwisselen. Je zou echt de documentatie of de broncode van de kern moeten lezen.
  • Ik ontdekte dat mijn wifiboy esp32 eigenlijk op 240 Mhz draait. Dus de max niet-ondertekende lange waarde van macros () 0xffffffff / 240 is 0x1111111. Dit is precies wat ik heb. Heel erg bedankt!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *