Time going backwards with clock_gettime(CLOCK_MONOTONIC, ...)
nick.withers at anu.edu.au
Thu Nov 13 05:46:38 UTC 2014
On Wed, 2014-11-12 at 18:57 -0600, Joel Sherrill wrote:
> On November 12, 2014 6:54:31 PM CST, Nick Withers <nick.withers at anu.edu.au> wrote:
> >On Wed, 2014-11-12 at 07:19 +0100, Sebastian Huber wrote:
> >> On 12/11/14 02:41, Nick Withers wrote:
> >> > On Tue, 2014-11-11 at 07:53 +0100, Sebastian Huber wrote:
> >> >> >Hello Nick,
> >> >> >
> >> >> >what is the output of the spnsext01 test for this BSP/board?
> >> > Hrmm, doesn't look good:
> >> > ____
> >> >
> >> > *** BEGIN OF TEST SPNSEXT 1 ***
> >> >
> >66 !_Timespec_Less_than(&new_uptime, &uptime)
> >> > ____
> >> >
> >> > ...followed by a reset.
> >> This shows that the nanoseconds extensions of the clock driver is
> >broken. This
> >> explains also your time going backwards problem.
> >So I should look at the routine installed by
> >rtems_clock_set_nanoseconds_extension() for my BSP?
> >In the case of the MVME3100, that seems to be
> >Clock_driver_nanoseconds_since_last_tick() in
> >(I'm not totally sure if it's meant to be, since the BSP's Makefile.am
> >seems to refer to e500/clock.rel rather than e.g., the MVME5500's
> >mpc6xx/clock.rel, but I know nothing 'bout autotools!).
> That sounds like the file I tracked it down to when looking for the source.
Ta. I think that's correct, too, as the e500 clock code pulls in the
mpc6xx c_clock.c ("e500_clock_rel_SOURCES = mpc6xx/clock/c_clock.c
I believe I know what's going on now:
- The e500 hardware decrementer used for the nanosecond extension is
set to auto-reload, so it cycles freely
- The wrap could happen while querying the decrementer value in (e.g.)
_TOD_Get_with_nanoseconds() with _TOD locked, before the tick's
incremented, thus giving us an earlier time than it should by a tick
period (10 ms here).
Does this sound reasonable? I've tested by breaking with a debugger in
_TOD_Get_with_nanoseconds() and observing that I can read a lesser value
(e.g, 0) from (*tod->nanoseconds_since_last_tick)() after a larger value
If so I suppose I should run it past Till and perhaps go about removing
the auto-cycling, resetting it in the tick handler.
> Yes. Those are hard references to track down. There needs to be a better way.
> >Thanks for your help, any suggestions appreciated as I'm really going
> >want to fix this...
Embedded Systems Programmer
Department of Nuclear Physics, Research School of Physics and Engineering
The Australian National University (CRICOS: 00120C)
More information about the users