Arduino 컴파일러에 Maximum Unsigned Long 값에 대한 상수가 있습니까?

부호없는 long 값을 생성하는 micros () 함수를 사용하는 타이머 함수를 작성하고 있습니다. 롤오버 조건을 보완하기 위해 해당 변수 유형에 대해 최대 값을 사용하고 싶습니다. 4,294,967,295라는 숫자가 있지만 어딘가에서 상수가 될 것으로 예상했습니다.

어딘가에 Arduino 컴파일러 파일에 MAX_UNSIGNED_LONG 상수가 있습니까?

저는 그 이름을 시도해 보았지만 그 이름이 아닐 수도 있다는 것을 알고 있습니다. 여전히 주변을 살펴 봅니다.

답변

avr-gcc 계층 구조의 다양한 limits.h 파일은 값일 수있는 ULONG_MAX를 정의합니다. 예를 들어, 내 시스템에서 이러한 파일은 hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h 또는 hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h로 끝나는 경로를 가지며 다음과 같은 정의를 포함합니다.

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

참고, LONG_MAXlimits.h에서도 정의됩니다.

p>

참고,

timeDelta = micros() - prevTime; 

와 같은 형식으로 수행 된 산술은 정확합니다 (micros() 넘침) 최대 2³² 마이크로 초 또는 약 4295 초의 경과 시간 동안.

답변

이월 조건에 대한 보상 “.

내 답변보기 : https://arduino.stackexchange.com/a/33577/10794

<시간>

Arduino 컴파일러에서?

“Arduino”컴파일러는 C ++ 컴파일러입니다. 이것이 대부분의 질문에 대한 출발점입니다. Google의 경우 :

maximum unsigned long in c++ 

첫 번째 링크는 다음으로 연결됩니다.

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

내용 :

ULONG_MAX Maximum value for an object of type unsigned long int 

답변

이것을 시도하셨습니까? :

unsigned long maxUnsignedLong = 0UL - 1UL; 

또는 :

const unsigned long ULONG_MAX = 0UL - 1UL; 

답변

네트워크에서, 나에게는 그렇게 쉬운 일이 아닙니다. 내 arduino 보드의 최대 micros () 의 정답도 찾아보세요.
제 경우에는 , micros ()가 약 17 초마다 롤오버되는 것 같습니다. 마지막으로 다음과 같이 micros ()의 최대 값으로 0x1111111 를 잡도록 Setup ()을 작성했습니다.

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

댓글

  • " int의 댓글 수정 n, nMin = 0, nMax = 0; "
  • 아니요, 완전히 잘못되었습니다 . arduino.cc/en/Reference/Micros 를 참조하십시오. 여기에서 약 70 분의 롤오버 시간이 제공되며, 이는 서명되지 않은 long (마이크로 초)의 최대 값과 일치하며 다음으로 변환됩니다. 분 (실제로 71 분 30 초)
  • 글쎄요. ' 약 70 분의 롤오버 시간을 확인했습니다. 하지만 ' Wi-Fi 소년 esp32 보드에서 micros () 호출이 약 17 초마다 롤오버되는 이유를 알 수 없습니다. 이미지를 만들 수 있습니까?
  • 이러한 종류의 " 현장에서 포착 " 실험은 처음부터 결함이 있습니다. ,하지만 AVR과 ESP의 차이가 더 혼동됩니다. 예를 들어,이 코드는 AVR에서도 유효하지 않습니다. ' % d는 서명되지 않은 long을 잘못 해석합니다. " 거의 "는 ESP32에서 작동하지만 여전히 부호 비트를 혼합합니다. 문서 나 코어의 소스 코드를 읽어야합니다.
  • 실제로 wifiboy esp32가 240Mhz에서 실행되고 있음을 발견했습니다. 따라서 macros () 0xffffffff / 240의 최대 부호없는 long 값은 0x1111111입니다. 이것이 바로 제가 얻은 것입니다. 감사합니다!

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다