Existuje v kompilátoru Arduino konstanta pro hodnotu Maximum Unsigned Long?

Píšu funkci časovače, která používá funkci micros (), která generuje dlouhou hodnotu bez znaménka. Chcete-li kompenzovat podmínku převrácení, chtěl bych použít maximální hodnotu pro tento typ proměnné. Mám číslo 4 294 967 295, ale očekával jsem, že to někde bude konstanta.

Existuje někde v souborech kompilátoru Arduino konstanta MAX_UNSIGNED_LONG?

Zkoušel jsem to jméno a vím, že to asi není. Stále se hýbám kolem.

Odpovědět

Různé limits.h soubory v hierarchii avr-gcc definují ULONG_MAX, což může být hodnota chcete. Například v mém systému mají takové soubory cesty končící hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h nebo hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h a obsahují definice jako následující.

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

Poznámka: LONG_MAX je také definován v limits.h.

Všimněte si, že aritmetika provedená ve formě

timeDelta = micros() - prevTime; 

bude správná (bez ohledu na to, zda micros() přetéká) po uplynulý čas až 2³² mikrosekundy nebo přibližně 4295 sekund.

Odpověď

Nepotřebujete kompenzovat podmínku převrácení „.

Viz moje odpověď: https://arduino.stackexchange.com/a/33577/10794


v kompilátoru Arduino?

Kompilátor „Arduino“ je kompilátor C ++. To je výchozí bod pro většinu otázek. Pokud používáte Google pro:

maximum unsigned long in c++ 

Zjistíte, že první odkaz vede na:

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

V tom je uvedeno:

ULONG_MAX Maximum value for an object of type unsigned long int 

Odpověď

Zkusili jste to ?:

unsigned long maxUnsignedLong = 0UL - 1UL; 

nebo:

const unsigned long ULONG_MAX = 0UL - 1UL; 

Odpověď

Ze sítě se mi zdá, že to není tak snadné najděte správnou odpověď na maximální hodnotu mikro () mých vlastních desek arduino.
V mém případě Zdá se, že mikro () se převaluje přibližně každých 17 sekund. Nakonec jsem pro sebe napsal Setup (), abych chytil 0x1111111 jako maximální hodnotu micros () takto.

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

Komentáře

  • upřesnit komentář " int n, nMin = 0, nMax = 0; "
  • Ne, toto je úplně špatně . Viz arduino.cc/en/Reference/Micros , kde je uveden čas přechodu asi 70 minut, což odpovídá maximální délce bez znaménka v mikrosekundách převedené na minut (ve skutečnosti 71 a půl minuty)
  • No, viděl jsem ' dobu přechodu asi 70 minut. Ale opravdu ' nevím, proč se na mé desce wifi boy esp32 volá volání micro () asi každých 17 sekund. Dokážete si to představit?
  • Tento druh " chytit to při aktu " experiment je na začátku chybný , ale pak se dále promíchá v rozdílech mezi AVR a ESP – například tento kód by nebyl ' platný ani pro AVR, kde by% d nesprávně interpretoval nepodepsaný dlouhý – mohl by " téměř " funguje na ESP32, ale stále by míchal znakový bit. Opravdu byste si měli přečíst dokumentaci nebo zdrojový kód jádra.
  • Zjistil jsem, že ve skutečnosti můj wifiboy esp32 běží na 240 Mhz. Takže maximální nepodepsaná dlouhá hodnota maker () 0xffffffff / 240 je 0x1111111. To je přesně to, co jsem dostal. Díky moc!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *