¿Existe una constante para el valor máximo largo sin firmar en un compilador Arduino?

Estoy escribiendo una función de temporizador que usa la función micros () que genera un valor largo sin firmar. Para compensar una condición de vuelco, me gustaría usar el valor máximo para ese tipo de variable. Tengo un número, 4.294.967.295, pero esperaba que fuera una constante en alguna parte.

¿Hay una constante MAX_UNSIGNED_LONG en los archivos del compilador de Arduino en algún lugar?

Probé ese nombre y sé que probablemente no sea así. Todavía estoy buscando.

Respuesta

Varios archivos limits.h en la avr-gcc definen ULONG_MAX, que puede ser el valor que desee. Por ejemplo, en mi sistema, dichos archivos tienen rutas que terminan con hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h o hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h y contienen definiciones como las siguientes.

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

Nota, LONG_MAX también se define en limits.h.

Tenga en cuenta que la aritmética realizada en una forma como

timeDelta = micros() - prevTime; 

será correcta (independientemente de si micros() desbordado) durante tiempos transcurridos de hasta 2³² microsegundos, o aproximadamente 4295 segundos.

Respuesta

No es necesario » compensar una condición de rollover «.

Vea mi respuesta: https://arduino.stackexchange.com/a/33577/10794


en un compilador Arduino?

El compilador «Arduino» es un compilador C ++. Ese es el punto de partida para la mayoría de preguntas. Si buscas en Google:

maximum unsigned long in c++ 

Encontrarás que el primer enlace conduce a:

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

En eso dice:

ULONG_MAX Maximum value for an object of type unsigned long int 

Respuesta

¿Intentaste hacer esto ?:

unsigned long maxUnsignedLong = 0UL - 1UL; 

o:

const unsigned long ULONG_MAX = 0UL - 1UL; 

Responder

Desde la red, me parece que no es tan fácil encuentre la respuesta correcta de el valor máximo de micros () de mis propias placas arduino, también.
En mi caso , parece que micros () se reinicia cada 17 segundos. Finalmente, escribí el Setup () para mí mismo para capturar 0x1111111 como el valor máximo de micros () de la siguiente manera.

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

Comentarios

  • refina el comentario de " int n, nMin = 0, nMax = 0; "
  • No, esto es completamente incorrecto . Consulte arduino.cc/en/Reference/Micros allí se da un tiempo de rollover de aproximadamente 70 minutos, que coincide con el máximo de un largo sin firmar en microsegundos, convertido a minutos (en realidad 71 minutos y medio)
  • Bueno, ' he visto el tiempo de transferencia de aproximadamente 70 minutos. Pero, realmente no ' no sé por qué, en mi placa wifi boy esp32, la llamada micros () se transfiere cada 17 segundos. ¿Puedes imaginarlo?
  • Este tipo de " atraparlo en el acto " experimento es defectuoso para empezar , pero luego se confunde aún más en las diferencias entre AVR y ESP; por ejemplo, este código no ' ni siquiera sería válido en un AVR, donde% d malinterpretaría un largo sin firmar; podría " casi " funcionan en un ESP32, pero aún así mezclarían el bit de signo. Realmente debería leer la documentación, o el código fuente del núcleo.
  • Descubrí que en realidad mi wifiboy esp32 se está ejecutando a 240 Mhz. Entonces, el valor largo máximo sin firmar de macros () 0xffffffff / 240 es 0x1111111. Esto es exactamente lo que obtuve. ¡Muchas gracias!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *