RTEMS - rtems_clock_get_uptime() fails during timer tick

Rolf Schroedter rolf.schroedter at dlr.de
Wed Feb 23 16:05:55 UTC 2011


Hi all,

I'm running RTEMS on a LEON3 (sparc) platform.
It's downloaded from Gaisler and claims to be
     rtems-4.9.99.0(SPARC/w/FPU/leon3)

It seems to me that the function rtems_clock_get_uptime() fails when it
is called during a timer tick. In this case a single time value is
wrong, the time is skipping backwards by 1 millisecond (TICK). The next
call returns a correct time.

I'm cross-posting this problem to the rtems-users and leon-sparc groups,
because I don't know who is to blame: generally RTEMS or the Leon-BSP.

Details below.

Thanks & regards,
Rolf Schroedter.


Details:
The following code snippet reads the current time since boot as fast as
possible.
It stores the original return of rtems_clock_get_uptime() in an array
and calculates a  microsecond value from that return.
At the end all time values are printed showing the problem:

Code:
RTEMS running with 1 millisecond TICK.
{
    #define LOOPS 1000

    int          i;
    uint32_t     uptime_usec[LOOPS], t0=0;
    struct timespec    uptime[LOOPS];

    for ( i=0; i<LOOPS; i++ )
    {
    rtems_clock_get_uptime( &uptime[i] );
    uptime_usec[i] = ((uint32_t)uptime[i].tv_sec * 1000000) +
((uint32_t)uptime[i].tv_nsec / 1000);
    }
    for ( i=0; i<LOOPS; i++ )
    {
    unsigned t1, usec, msec, sec;

    t1 = uptime_usec[i];
    usec = t1 % 1000;
    msec = (t1 / 1000) % 1000;
    sec  = t1 / 1000000;

    printf("TEST:rtems=%u.%09u   t=%u.%03u.%03u   dt=%u\n",
uptime[i].tv_sec, uptime[i].tv_nsec, sec, msec, usec, (t1-t0));
    t0 = t1;
    }
}


Output:
- Lines #616 and #686 show the time skipping backwards.
- The nanoseconds uptime shows that rtems_clock_get_uptime() has
probably been called during a clock TICK.

000: uptime=0.445817000   sec=0.445.817   dt=445817
001: uptime=0.445835000   sec=0.445.835   dt=18
002: uptime=0.445849000   sec=0.445.849   dt=14
003: uptime=0.445863000   sec=0.445.863   dt=14
004: uptime=0.445877000   sec=0.445.877   dt=14
...
417: uptime=0.451967000   sec=0.451.967   dt=15
418: uptime=0.451981000   sec=0.451.981   dt=14
419: uptime=0.451996000   sec=0.451.996   dt=15
420: uptime=0.452102000   sec=0.452.102   dt=106
421: uptime=0.452116000   sec=0.452.116   dt=14
422: uptime=0.452130000   sec=0.452.130   dt=14
...
549: uptime=0.453985000   sec=0.453.985   dt=15
550: uptime=0.453999000   sec=0.453.999   dt=14
551: uptime=0.454042000   sec=0.454.042   dt=43
552: uptime=0.454056000   sec=0.454.056   dt=14
553: uptime=0.454071000   sec=0.454.071   dt=15
...
615: uptime=0.454959000   sec=0.454.959   dt=14
616: uptime=0.454973000   sec=0.454.973   dt=14
617: uptime=0.454988000   sec=0.454.988   dt=15
618: uptime=0.454002000   sec=0.454.002   dt=4294966310
619: uptime=0.455042000   sec=0.455.042   dt=1040
620: uptime=0.455056000   sec=0.455.056   dt=14
621: uptime=0.455070000   sec=0.455.070   dt=14
622: uptime=0.455084000   sec=0.455.084   dt=14
...
682: uptime=0.455944000   sec=0.455.944   dt=14
683: uptime=0.455958000   sec=0.455.958   dt=14
684: uptime=0.455972000   sec=0.455.972   dt=14
685: uptime=0.455987000   sec=0.455.987   dt=15
686: uptime=0.455001000   sec=0.455.001   dt=4294966310
687: uptime=0.456042000   sec=0.456.042   dt=1041
688: uptime=0.456056000   sec=0.456.056   dt=14
689: uptime=0.456071000   sec=0.456.071   dt=15
...
997: uptime=0.460600000   sec=0.460.600   dt=15
998: uptime=0.460615000   sec=0.460.615   dt=15
999: uptime=0.460631000   sec=0.460.631   dt=16




-- 

------------------------------------
Rolf Schroedter
German Aerospace Center
Institute of Planetary Research
D-12489 Berlin, Rutherfordstrasse 2
Tel/Fax:  (+49) (30) 67055-416/384
Email:    Rolf.Schroedter at dlr.de




More information about the users mailing list