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