Van-e konstans az Arduino fordítóban a Maximum unsigned Long értékre?

Olyan időzítő függvényt írok, amely a micros () függvényt használja, amely elő nem írt hosszú értéket generál. Az átfordulás feltételének kompenzálásához az adott változótípus maximális értékét szeretném használni. Van egy számom, 4 294 967 295, de arra számítottam, hogy ez valahol állandó lesz.

Van-e MAX_UNSIGNED_LONG konstans az Arduino fordítófájljaiban valahol?

Kipróbáltam ezt a nevet, és tudom, hogy valószínűleg nem ez. Még mindig piszkálok.

Válasz

Különböző limits.h fájlok a avr-gcc hierarchiában meghatározzák a ULONG_MAX fájlokat, amelyek értéke lehet Például a rendszeremen az ilyen fájlok elérési útjai hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h vagy hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h végződésekkel végződnek, és az alábbiakhoz hasonló definíciókat tartalmaznak.

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

Megjegyzés: LONG_MAX is meg van határozva a limits.h.

Megjegyzés: a

timeDelta = micros() - prevTime; 

formátumban végzett számtan helyes lesz (függetlenül attól, hogy micros() túlcsordult) az eltelt időkig, legfeljebb 2³² mikroszekundumig, vagyis kb. 4295 másodpercig.

Válasz

Nem szükséges kompenzálja az átfordulás feltételét “.

Lásd a válaszomat: https://arduino.stackexchange.com/a/33577/10794


egy Arduino fordítóban?

Az “Arduino” fordító egy C ++ fordító. Ez a legtöbb kérdés kiindulópontja. Ha Google-t keres:

maximum unsigned long in c++ 

Megtalálja az első linket:

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

Abban, hogy ezt írja:

ULONG_MAX Maximum value for an object of type unsigned long int 

Válasz

Megpróbálta ezt megtenni ?:

unsigned long maxUnsignedLong = 0UL - 1UL; 

vagy:

const unsigned long ULONG_MAX = 0UL - 1UL; 

Válasz

A hálózatról úgy tűnik, hogy nem olyan könnyű megtalálja a mikroszkópok () megfelelő válaszát a saját arduino tábláimnak is.
Az én esetemben , úgy tűnik, hogy a micros () körülbelül 17 másodpercenként gördül át. Végül megírtam magamnak a Setup () alkalmazást, hogy elkapjam a 0x1111111 -t a mikroszámok () maximális értékeként az alábbiak szerint.

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

Megjegyzések

  • finomítsák a " int megjegyzését n, nMin = 0, nMax = 0; "
  • Nem, ez teljesen téves . Lásd arduino.cc/en/Reference/Micros , ahol körülbelül 70 perces átfutási idő van megadva, amely megegyezik az aláíratlan hosszúság maximálisának mikroszekundumban átszámítva perc (valójában 71 és fél perc)
  • Nos, én ' láttam körülbelül 70 perces átfutási időt. De valójában nem tudom, hogy ' miért tudom, hogy a wifi boy esp32 táblámon a micros () hívás körülbelül 17 másodpercenként átgurul. El tudná képzelni?
  • Ez a fajta " elkapja az act " kísérletben kezdetben hibás , de aztán tovább keveredik az AVR és az ESP különbségek között – például ez a kód nem lenne ' még érvényes egy AVR-n, ahol% d rosszul értelmezne egy aláíratlan hosszúságot – lehet, hogy " majdnem " működik egy ESP32-n, de mégis összekeverné a jelbitet. Olvassa el a dokumentációt vagy a mag forráskódját.
  • Megállapítottam, hogy valójában a wifiboy esp32 240 Mhz-en fut. Tehát a () 0xffffffff / 240 makrók maximális előjel nélküli hosszú értéke 0x1111111. Pontosan ezt kaptam. Nagyon köszönöm!

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük