Hi,
I faced the following problem while I was playing with QRTP: when I
call
nanosleep (or select) function with an argument of n ms, I figured out
that indeed it takes (n+2) msec…
If I tell a process to sleep 1ms and if it sleeps for 3ms, I would NOT
call this behaviour realtime… Can somebody tell me where this 2ms
delay
is coming from?
Baris
Here is the piece of code I wrote to test this:
/* test.c */
#include <time.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
main()
{
int i1, i2, i3, retval;
struct timespec n;
struct timeval tv1, tv2, tv3, st;
n.tv_sec = 0;
n.tv_nsec = 110001000; /* 1 msec */
st.tv_sec = 0;
st.tv_usec = 11000; / 1 msec */
for (;
{
i1 = gettimeofday(&tv1, 0);
nanosleep(&n, 0);
i2 = gettimeofday(&tv2, 0);
retval = select(1, NULL, NULL, NULL, &st);
i3 = gettimeofday(&tv3, 0);
printf("-> nanosleep: dt = %d usec.\n",
(tv2.tv_sec-tv1.tv_sec)*1000000 + (tv2.tv_usec -
tv1.tv_usec));
printf("-> select: dt = %d usec\n",
(tv3.tv_sec-tv2.tv_sec)*1000000 + (tv3.tv_usec -
tv2.tv_usec));
sleep(1);
}
}
/* end test.c */
output:
./test
→ nanosleep: dt = 3000 usec
→ select: dt = 2999 usec
→ nanosleep: dt = 2999 usec
→ select: dt = 3000 usec
→ nanosleep: dt = 2999 usec
→ select: dt = 3000 usec
→ nanosleep: dt = 3000 usec
→ select: dt = 2999 usec
→ nanosleep: dt = 3000 usec
→ select: dt = 2999 usec
→ nanosleep: dt = 3000 usec
→ select: dt = 2999 usec
…