Re: Sleep for about microsecond in a user space program in 2.6 or 2.4 kernel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 8/18/05, John Que <qwejohn@xxxxxxxxx> wrote:
> Hello,
> Thanks.
> I did tried nanosleep and it gave really more than 1 micorsecond.
> 
> also:
> from "man nanosleep":
> .....
> .....
> 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).
> .......
> .......
> 
> I assume that from the same reasons, also setitimer() will not do the job.
> 
> As I understand from you I am not permitted to use "outb" from
> userspace, and this trick with 0x80 is not good for user space.
> (In my case it does not stall the machine, but not much runs on it).
> 
> So is there a  way to achieve 1 microsec delay from user space ?

I hope I am not missing anything, but If you can afford to make the
process run with real time priority, then the same man page has the
answer -

"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."

Also one more thing is that if all you want is some code to execute
after 1 microsecond, then you might be able to use the BogoMIPS value
(not directly though) and loop appropriately.
 
> Regads,
> John

Bhanu

> On 8/18/05, Erik Mouw <J.A.K.Mouw@xxxxxxxxxxxxxx> wrote:
> > On Thu, Aug 18, 2005 at 09:22:55AM -0400, John Que wrote:
> > > I want to use delays of 1 microsend on linux 2.4 or linux 2.6 kernel
> > > on x386 platform.
> > >
> > > As we know, usleep depends on the HZ of the system.
> >
> > It is?
> >
> > > So both in  2.4 and in 2.6 we cannot achieve 1 microsec delay calling
> > > udelay (the man page of usleep says itslef that
> > > "Probably  not accurate on many machines down to the microsecond.").
> >
> > You certainly can. RTFM, usleep(2) says in the NOTES section:
> >
> >        This function is obsolete. Use nanosleep(2) or setitimer(2) instead.
> >
> > > According to "Linux I/O port programming mini-HOWTO"
> > > (http://www.tldp.org/HOWTO/IO-P ort-Programming-2.html)
> > > you can use outb on 0x80 to create a dealy.
> >
> > The outb() trick can't be used in userland, you're stalling the
> > complete machine by doing so!
> >
> > > So I added this snippest of code
> > > and trird to use outb('a',0x80) for creating a sleep time in
> > >         resolution of microseconds thus:
> > > ............
> > >
> > >        ioperm(0x80, 1, 1);
> > >
> > >        for (i=0;i<10000;i++)
> > >                 outb('a',0x80);
> > > ............
> > >
> > > On 3 machines (each of them had a different strength, one of the with
> > > 2.6
> > > kernel and the other two with 2.6 kernek) it gave a result of
> > > about 1.4 microsec for every such call, while on a differnet macine it
> > > gave a much
> > > higher average of 2.16 microsec.
> >
> > That doesn't surprise me, the kernel is allowed to reschedule your
> > process during the for() loop, so depending on the system load, the
> > actual delay varies a lot.
> >
> >
> > Erik
> >
> > --
> > Erik Mouw
> > J.A.K.Mouw@xxxxxxxxxxxxxx  mouw@xxxxxxxxxxxx
> >
> >
> > -----BEGIN PGP SIGNATURE-----
> > Version: GnuPG v1.4.1 (GNU/Linux)
> >
> > iD8DBQFDBJh6/PlVHJtIto0RAiYfAJ9NuG1M8qwu4U34I2Iv12eS7eur5gCggojz
> > /R9JT5rqug1QhV1ZFBI0Yds=
> > =y6Xk
> > -----END PGP SIGNATURE-----
> >
> >
> >
> 
> --
> Kernelnewbies: Help each other learn about the Linux kernel.
> Archive:       http://mail.nl.linux.org/kernelnewbies/
> FAQ:           http://kernelnewbies.org/faq/
> 
> 


-- 
The difference between Theory and Practice is more so in Practice than
in Theory.

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux