Onko Arduino-kääntäjässä vakio Suurimmalle allekirjoittamattomalle -arvolle?

Kirjoitan ajastintoimintoa, joka käyttää micros () -funktiota, joka tuottaa allekirjoittamattoman pitkän arvon. Kaatumisen ehdon kompensoimiseksi haluaisin käyttää kyseisen muuttujatyypin enimmäisarvoa. Minulla on numero, 4 294 967 295, mutta odotin, että se olisi vakio jossain.

Onko Arduino-kääntäjätiedostoissa jossakin MAX_UNSIGNED_LONG-vakio?

Olen kokeillut tuota nimeä ja tiedän, ettei se todennäköisesti ole sitä. Pistelen edelleen.

Vastaa

Erilaiset limits.h -tiedostot hierarkiassa avr-gcc määrittelevät ULONG_MAX, mikä voi olla arvo Esimerkiksi järjestelmässäni tällaisilla tiedostoilla on polut, jotka päättyvät hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h tai hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h ja sisältävät seuraavan kaltaisia määritelmiä.

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

Huomaa, että LONG_MAX määritetään myös kohdassa limits.h.

Huomaa, että aritmeettinen muoto muodossa

timeDelta = micros() - prevTime; 

on oikea (riippumatta siitä, onko micros() ylivuoto) kuluneiden aikojen ajan jopa 233 mikrosekuntia eli noin 4295 sekuntia.

Vastaa

Sinun ei tarvitse kompensoi kaatumisen edellytys ”.

Katso vastaukseni: https://arduino.stackexchange.com/a/33577/10794


Arduino-kääntäjässä?

Arduino-kääntäjä on C ++ -kääntäjä. Se on lähtökohta useimmille kysymyksille. Jos Google on Google:

maximum unsigned long in c++ 

Löydät ensimmäisen linkin, joka johtaa:

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

Siinä sanotaan:

ULONG_MAX Maximum value for an object of type unsigned long int 

Vastaa

Yrititkö tehdä tämän ?:

unsigned long maxUnsignedLong = 0UL - 1UL; 

tai:

const unsigned long ULONG_MAX = 0UL - 1UL; 

vastaus

Verkostosta ei mielestäni ole niin helppoa löytää oikea vastaus myös omien arduino-levyjen mikrosirujen () enimmäisarvoon.
Minun tapauksessani , näyttää siltä, että mikros () rullaa noin 17 sekunnin välein. Lopuksi kirjoitin Setup () -ominaisuuden itselleni saadaksesi 0x1111111 mikrosirujen maksimiarvoksi () seuraavasti.

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

Kommentit

  • tarkenna " int kommenttia n, nMin = 0, nMax = 0; "
  • Ei, tämä on täysin väärin . Katso arduino.cc/en/Reference/Micros siellä noin 70 minuutin siirtymäaika, joka vastaa allekirjoittamattoman pitkän mikrosekunteina enimmäismäärää muunnettuna minuuttia (itse asiassa 71 ja puoli minuuttia)
  • No, olen ' nähnyt noin 70 minuutin kaatumisajan. Mutta en todellakaan tiedä ' en tiedä miksi wifi poikani esp32 -taulullani mikroskutsut () pyörivät noin 17 sekunnin välein. Voisitko kuvata sen?
  • Tällainen " kiinni se teossa " oleva kokeilu on aluksi virheellinen , mutta sekoittuu sitten edelleen AVR: n ja ESP: n eroihin – esimerkiksi tämä koodi ei ' ei edes kelpaa AVR: ssä, jossa% d tulkitsisi väärin allekirjoittamattoman pitkän – se saattaa " melkein " toimii ESP32: lla, mutta sekoittaisi silti merkkibitin. Sinun pitäisi todella lukea dokumentaatio tai ytimen lähdekoodi.
  • Huomasin, että wifiboy esp32 -tietokoneeni on todella 240 Mhz. Joten makrojen () 0xffffffff / 240 suurin allekirjoittamaton pitkä arvo on 0x1111111. Juuri tämän sain. Paljon kiitoksia!

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *