I am writing a timer function that uses the micros() function which generates a unsigned long value. To compensate for a roll over condition, I would like to use the maximum value for that variable type. I have a number, 4,294,967,295, but was expecting that to be a constant somewhere.
Is there a MAX_UNSIGNED_LONG constant in the Arduino compiler files somewhere?
I have tried that name and know it probably isn't that. Still poking around.
3 Answers 3
Various limits.h
files in the avr-gcc
hierarchy define ULONG_MAX
, which may be the value you want. For example, on my system such files have paths ending with hardware/tools/avr/lib/gcc/avr/4.8.1/include-fixed/limits.h
or with hardware/tools/avr/lib/gcc/avr/4.8.1/install-tools/include/limits.h
and contain definitions like the following.
/* Maximum value an `unsigned long int' can hold. (Minimum is 0). */
#undef ULONG_MAX
#define ULONG_MAX (LONG_MAX * 2UL + 1UL)
Note, LONG_MAX
also is defined in limits.h
.
Note, arithmetic done in a form like
timeDelta = micros() - prevTime;
will be correct (regardless of whether micros()
overflowed) for elapsed times up to 232 microseconds, or about 4295 seconds.
You don't need "to compensate for a roll over condition".
See my answer: https://arduino.stackexchange.com/a/33577/10794
in an Arduino compiler?
The "Arduino" compiler is a C++ compiler. That is the starting point for most questions. If you Google for:
maximum unsigned long in c++
You will find the first link leads to:
http://www.cplusplus.com/reference/climits/
In that it says:
ULONG_MAX Maximum value for an object of type unsigned long int
Did you try to do this?:
unsigned long maxUnsignedLong = 0UL - 1UL;
or:
const unsigned long ULONG_MAX = 0UL - 1UL;