부호없는 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_MAX
는 limits.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입니다. 이것이 바로 제가 얻은 것입니다. 감사합니다!