Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Aug 1997 01:46:33 -0700 (PDT)
From:      "Jamil J. Weatherbee" <jamil@counterintelligence.ml.org>
To:        freebsd-hackers@freebsd.org
Cc:        freebsd-realtime@freebsd.org
Subject:   ?? The right way to do a microsecond resolution wait
Message-ID:  <Pine.BSF.3.96.970805013644.501A-100000@counterintelligence.ml.org>

next in thread | raw e-mail | index | archive | help

Is this the best way to do a microsecond resolution wait under freebsd 
(usleep only appears good to 10,000 microseconds). Doing small waits is an
important part of realtime software -- something that it would be
interesting to see addressed, particularily making a usleep that actually
sleeps microseconds.


With the following (unless i am off my rocker) i can get a 4 microsecond
wait on a ppro 180, a 25 microsecond wait on a pentium 100, and a 12
microsecond wait on a nexgen-100.

What I want to know is this the best way to get a highly accurate wait in
a thread of execution, is this even doing what I think it is, and why
doesnt usleep do something like this? I guess I could use it to output a
square wave on a paralell pin and look at that with an oscilliscope. For
the application I use it for the usleeps for the significant portion of
the time bring the cpu% down from 99% to about 1.5% pretty significant.



#define USLEEP_RESOLUTION 10000

/* Don't use for times > 2000 seconds */
void rsleep (long usecs)
{
  struct timeval begin_time, cur_time;
  long elapsed, utm;
  
  gettimeofday (&begin_time, NULL);   /* record the starting time */

  if (utm = (usecs / USLEEP_RESOLUTION)*USLEEP_RESOLUTION) usleep (utm);
  
   do gettimeofday (&cur_time, NULL);  /* get the current time */
   while (((cur_time.tv_sec - begin_time.tv_sec) * 1000000 +
              (cur_time.tv_usec - begin_time.tv_usec)) < usecs);
     }





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.96.970805013644.501A-100000>