I know that I can handle a single rollover with subtraction:
if (micros() - lastTime > period) {
lastTime = micros();
...
}
But how it can be handled if this is not true
or it is not checked for more than 70 minutes (without using uint64_t)?
1 Answer 1
If you want to measure times longer than 70 minutes with
micros()
, you will have to use uint64_t
, and there is nothing
wrong with that.
The code needs to run with as little interruptions as possible [...]
You don't need to do the 64-bit arithmetic within the ISR. You could very well implement an interrupt-driven 32-bit version, and then extend it to 64 bits in non-interrupt context. Example:
// Your ISR-based implementation.
uint32_t micros32();
// Extend to 64 bits.
uint64_t micros64() {
static uint64_t time64;
time64 += micros() - (uint32_t) time64;
return time64;
}
This should work as long as you call micros64()
often enough.
Presumably, you will have something like
if (micros64() - lastTime > period) { ... }
within your loop, so this should be no issue as long as you never block
your loop.
Actually, you can push this idea even further. If you can guarantee that
micros64()
will be called at least once every 65.5 ms, then you
could have your ISR increment only a 16-bit counter.
-
Thank you, this will solve the issue. The last part will be a nice further optimization for my case.Vasil Kalchev– Vasil Kalchev2018年04月03日 11:26:24 +00:00Commented Apr 3, 2018 at 11:26
millis()
if you are timing rather long periods?ISR(TIMER0_OVF_vect)
there is a single variable increment. The code needs to run with as little interruptions as possible and I want to be able to run something with irregular long intervals.