[En-Nut-Discussion] systime limit reduces valid uptime to 49 days
Harald Kipp
harald.kipp at egnite.de
Wed Nov 7 12:03:04 CET 2007
Michael Müller schrieb:
> Hi,
>
> I was quite shocked when looking at the code parts calculating the
> system time.
Me too, at least a bit. But, as other people here already pointed out,
this is not a general problem. Timeout calculations should still work
during overflows.
> The comment at the head of NutGetMillis(void)
> function tells about a maximum systime of 8 years. It seems to refer to
> the old systick of 62ms instead of the current default value of 1ms.
>
Indeed, this info is outdated. Thanks for bringing this to our
attention. (Anyone out there to add a bug report at SourceForge or fix
it immediately?)
> Are there any suggestions how to handle this?
> - Change the systick to 62ms again (was the reason just more precision
> for the "user application" or was it useful / necessary for the OS, too?) ?
> - Increase the tick variable of NutOS to a 64bit type
> (unsigned long long)?
>
Initially Nut/OS runs on 3.68 MHz systems and the timer interrupt
handled a lot of things, so it was set to 62.5ms. AVRs became faster and
the change to 1ms had been mainly done to provide finer granularity for
time out values.
My preference would be a solution, which
1. avoids the 64 bit type long long, because it is not supported by all
compilers and may result in a porting nightmare.
2. avoids any additional code running in interrupt context. Such
additional code will increase interrupt latency. See also Bernard's posting.
Actually the problem is with the calendar functions on boards w/o RTC
chip. Thus, the ideal solution I can think of, would be an additional
time_t variable, which holds the number of seconds since the epoch. This
variable may be updated when calling NutGetSeconds() or similar
functions, or in the idle thread. The latter has the disadvantage, that
it may run the update too often. Doing the update in a timer query
routine seems to be the most economical solution, but requires, that the
application calls NutGetSeconds(), time() or similar at least once
within 24 days.
Btw. I do not think, that it is a good idea to reset nut_ticks, because
it will interfere with running time outs.
Harald
More information about the En-Nut-Discussion
mailing list