ArduinoコンパイラのMaximumUnsigned Long値の定数はありますか?

unsigned 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で定義されています。

注:

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分のロールオーバー時間が指定されています。これは、マイクロ秒単位のunsignedlongの最大値に一致します。分(実際には71分半)
  • そうですね、'ロールオーバー時間は約70分です。しかし、私は本当に'なぜ、私のwifi男の子esp32ボードで、micros()呼び出しが約17秒ごとにロールオーバーするのかわかりません。それをイメージできますか?
  • この種の"行為でそれを捕まえます"実験はそもそも欠陥があります、しかしその後、AVRとESPの違いでさらに混乱します-たとえば、このコードは' AVRでも有効ではなく、%dはunsignedlongを誤って解釈する可能性があります- "ほぼ"はESP32で動作しますが、それでも符号ビットを混同します。ドキュメントまたはコアのソースコードを実際に読む必要があります。
  • 実際に私のwifiboyesp32は240MHzで実行されていることがわかりました。したがって、macros()0xffffffff / 240の最大unsignedlong値は0x1111111です。これはまさに私が得たものです。どうもありがとうございました!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です