gettimeofday seconds rollover problem?
Joel Sherrill
joel.sherrill at oarcorp.com
Wed Feb 22 12:23:15 UTC 2006
Andrew Sinclair wrote:
>Hello,
>
>Has anyone experienced issues with ticks rollover in a gettimeofday
>call? I have two calls to gettimeofday inside a task, and I am noting
>the difference in time. I have noticed infrequently that when the last
>timestamp occurs, the microseconds have rolled over to zero and the
>seconds remain at their previous value.
>
>So for example I am seeing...
>Timestamp 1 : 1 second 998000usec
>Timestamp 2 : 1 second 0usec !!!
>
>Instead of
>Timestamp 1 : 1 second 998000usec
>Timestamp 2 : 2 seconds 0usec
>
>Interestingly, another call very shortly after the incorrect time stamp
>returns the correct result. Ie.
>
>Timestamp 1 : 1 second 998000usec
>Timestamp 2 : 1 seconds 0usec !!!
>Timestamp 3 : 2 seconds 0usec
>
>I don't understand how this could happen, as rtems_clock_tick() is
>called within a timer interrupt, and the critical section in
>gettimeofday() is protected.
>Could it be caused by _TOD_Seconds_since_epoch not being volatile???
>
>
>
The seconds and nanoseconds values are grabbed/computed with interrupts
disabled so I don't think that would be the problem. The asm volatile
statements
should provide sync points for the compiler if a partial read of memory
were
an issue.
I was looking for a math mistake but don't see it either. It looks like
ticks since
seconds boundary was zeroed and ticks since epoch wasn't incremented.
I just don't have a clue what you are seeing. :(
Why are you getting 1 and 2 seconds? Have you set the TOD? Maybe there is
some weirdness in the behavior before time of day is set. I don't think
clock_gettime()
allows for the time never having been set as an error condition and it
could be
a weird side-effect of time of day not really being set.
>My timebase is set for 1msec granularity, my target is coldfire, and I
>am using RTEMS 4.6.2, which has some fixes for problems discussed in the
>mailing list. These files seem unrelated to the issue at hand, however
>FYI they are timerfireafter.c, timerserverfireafter.c, and
>watchdoginsert.c.
>
>
>
I don't think this is it either.
>Any pointers?
>
>Kind Regards
>
>Andrew Sinclair
>
>
More information about the users
mailing list