> I need precise timing and a busy loop on gettimeofday()
> is unacceptable because I have to be fair for other
> CPU hungry processes. I tried usleep() and nanosleep()
> but they are pretty inaccurate. E.g. usleep(7500)
> gives 10000-50000 microsecond sleep (19995 on average)
> and usleep(20000) gives an average of ~30000 microsecond
> sleep. nanosleep() accuracy is the same which is not
> surprising because they use the same implementation.
> Ingo Molnar's lowlatency patch (2.4.0-C4) did not help.
> I tested this on 2.4.0-test6pre1 and a dual 400MHz Celeron
> with 192 MB memory.
> Can it be solved somehow?
No. If you need RTOS you need RTOS (RTLinux or RTAI).
-- man nanosleep --
[skipped]
BUGS
The current implementation of nanosleep is based on the
normal kernel timer mechanism, which has a resolution of
1/HZ s (i.e, 10 ms on Linux/i386 and 1 ms on Linux/Alpha).
Therefore, nanosleep pauses always for at least the speci-
fied time, however it can take up to 10 ms longer than
specified until the process becomes runnable again. For
the same reason, the value returned in case of a delivered
signal in *rem is usually rounded to the next larger mul-
tiple of 1/HZ s.
As some applications require much more precise pauses
(e.g., in order to control some time-critical hardware),
nanosleep is also capable of short high-precision pauses.
If the process is scheduled under a real-time policy like
SCHED_FIFO or SCHED_RR, then pauses of up to 2 ms will be
performed as busy waits with microsecond precision.
[skipped]
-- cut --
You can play some tricks but basically if you need RTOS you need RTOS.
Linux is not an RTOS.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/