Existe uma constante para o valor máximo sem sinal em um compilador Arduino?

Estou escrevendo uma função de cronômetro que usa a função micros () que gera um valor longo sem sinal. Para compensar uma condição de rollover, gostaria de usar o valor máximo para esse tipo de variável. Tenho um número, 4.294.967.295, mas esperava que fosse uma constante em algum lugar.

Existe uma constante MAX_UNSIGNED_LONG nos arquivos do compilador do Arduino em algum lugar?

Eu tentei esse nome e sei que provavelmente não é. Ainda estou procurando.

Resposta

Vários limits.h arquivos na avr-gcc hierarquia definem ULONG_MAX, que pode ser o valor que você deseja. Por exemplo, em meu sistema esses arquivos têm caminhos que terminam com hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h ou com hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h e contêm definições como as seguintes.

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

Observação, LONG_MAX também é definido em limits.h.

Observe que a aritmética feita em uma forma como

timeDelta = micros() - prevTime; 

estará correta (independentemente de micros() transbordou) para tempos decorridos de até 2³² microssegundos ou cerca de 4295 segundos.

Resposta

Você não “não precisa” compensar por uma condição de capotamento “.

Veja minha resposta: https://arduino.stackexchange.com/a/33577/10794


em um compilador Arduino?

O compilador “Arduino” é um compilador C ++. Esse é o ponto de partida para a maioria das perguntas. Se você pesquisar por:

maximum unsigned long in c++ 

Você verá que o primeiro link leva a:

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

Nisso diz:

ULONG_MAX Maximum value for an object of type unsigned long int 

Resposta

Você tentou fazer isso ?:

unsigned long maxUnsignedLong = 0UL - 1UL; 

ou:

const unsigned long ULONG_MAX = 0UL - 1UL; 

Resposta

Da rede, parece-me, não é tão fácil encontrar a resposta certa de o valor máximo de micros () de minhas próprias placas arduino também.
No meu caso , parece que micros () rola a cada 17 segundos. Por fim, escrevi Setup () para mim mesmo para capturar 0x1111111 como o valor máximo de micros () da seguinte maneira.

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

Comentários

  • refinar o comentário de " int n, nMin = 0, nMax = 0; "
  • Não, isso está totalmente errado . Veja arduino.cc/en/Reference/Micros , onde um tempo de rollover de cerca de 70 minutos é fornecido, o que corresponde ao máximo de um não sinalizado em microssegundos, convertido para minutos (na verdade, 71 minutos e meio)
  • Bem, eu ' vi o tempo de rollover de cerca de 70 minutos. Mas, eu realmente não ' não sei por que, na minha placa wi-fi boy esp32, a chamada de micros () ocorre a cada 17 segundos. Você consegue imaginar?
  • Este tipo de " capturá-lo no ato " experimento é defeituoso para começar , mas depois fica ainda mais confuso nas diferenças de AVR vs ESP – por exemplo, este código não ' nem seria válido em um AVR, onde% d interpretaria erroneamente um longo sem sinal – ele pode " quase " funciona em um ESP32, mas ainda confundiria o bit de sinal. Você realmente deve ler a documentação ou o código-fonte do núcleo.
  • Descobri que na verdade meu wifiboy esp32 está rodando a 240 Mhz. Portanto, o valor máximo longo sem sinal de macros () 0xffffffff / 240 é 0x1111111. Isso é exatamente o que eu tenho. Muito obrigado!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *