[En-Nut-Discussion] NutGetMillis overflow documentation

Ulrich Prinz uprinz2 at netscape.net
Sun Feb 7 16:17:27 CET 2010


Hi José,

anyone should be able to add a bugreport in sourceforge.
But it may be, that you need to create an account there and assign to 
the project.

However, you're right with your calculation. The question is, what do 
you like to do with NutGetMillis()?
Normally you do timespan calculations that look like this:

if( now-past < span) { wait a bit }

These type of call will result in a jitter with every overflow.

A second unusual usecase might be to determine the action to do now from 
the exact time:

now = NutGetMilis();
if (now == time1) { action1() }
else if (now == time2) { action }

The example is simplified as you need to add some derivation to the 
times. It will be very unlikely to hit a ms precisely. However both 
examples are not a good way to use system timers in no system.

If you need an exact point of time to execute a function call, create 
your own timer. Nut/OS allows to do this as well in the higher timer 
functions as it allows it in the system timer too. For example one, you 
can decide, if the function should sleep and give CPU to other pending 
tasks (NutSleep(n)) or if it must stay in the actual thread and delay ( 
NutDelay(n)).

For the second example it is a matter of how precise your calls need to 
be. Add a call to the seconds counter update or add some small code to 
the system timer. Your decision. Create your own counter, counting 
exactly and only as high as needed, reset it in a controlled way or use 
a state machine.

If a small ammount of jitter is acceptable, write a state machine thread 
and use NutSleep or NutDelay as needed.

It is never, never, never a good idea to use a running counter with a 
possible overflow for timing related calls. If this sounds a bit like a 
teacher and if you know all that, forgive me, but the next guy stumbling 
across that, this might help.

For now I add a tracker report for the wrong documentation.

Best regards, Ulrich

José Vallet schrieb:
> Hello all.
> 
> NutGetMillis returns an uint32_t, and (2^32)/1000/3600/24 is about 49.71 
> (days). So the overflow of the amount of milliseconds since start time 
> is maximum about 49.71 days, and not 7.9 _years_ as is suggested in the 
> documentation.
> 
> I bring this to notice as I found this info not only in the comments of 
> the function, but also now in the NutOS Software Manual (page 37)
> http://www.ethernut.de/pdf/enswm28e.pdf
> 
> The issue with the comments of the function has been discussed several times
> (Nov 2005) 
> http://groups.google.com/group/osdeve_mirror_rtos_en-nut-discussion/browse_frm/thread/a54f5e0257aa4a25/fccf4fa9ed9534d6?hl=en&lnk=gst&q=+NutGetMillis+overflow+#fccf4fa9ed9534d6
> (Nov 2007)
> http://groups.google.com/group/osdeve_mirror_rtos_en-nut-discussion/browse_frm/thread/e874525531b847f5/afc67a3e8fb55b7a?hl=en&lnk=gst&q=+NutGetMillis+overflow+#afc67a3e8fb55b7a
> (Feb 2008)
> http://groups.google.com/group/osdeve_mirror_rtos_en-nut-discussion/browse_frm/thread/3a6af336fd0a481b/47209d582e46ad5e?hl=en&lnk=gst&q=+NutGetMillis+overflow+#47209d582e46ad5e
> 
> In one of these threads Harald suggested to add a bug report. I cannot 
> add it myself.
> 
> Regards
> José
> _______________________________________________
> http://lists.egnite.de/mailman/listinfo/en-nut-discussion



More information about the En-Nut-Discussion mailing list