2000-11-27 02:10:00

by Mastoras

[permalink] [raw]
Subject: RTlinux & Linux Question

Hello,

I'm trying to use RTlinux to make a unix process wakeup
periodicaly, in terms of "real time".

1) the unix process uses 2 system calls, one to make it self periodic, and
one to suspend its self until the next period.

2) The system call that makes the unix process periodic, creates a Rtlinux
thread, which is periodic with the same period.

3) The periodic RT linux thread, sets a flag & sends fakes IRQ0 to linux,
in order to force its scheduling as soon as possible and then suspends it
self. (i know that this advances time, but this is not the question right
now).

4) The unix process wakeups perfectely when there is no disk activity, but
when there is some disk activity ("find /" and/or "updatedb") or the
period is too small (300us) i noticed that sometimes it loses one or two
periods. This is very rare, i mean 14 loses in 5000 executions at 5ms
period.

5) The unix process isn't scheduled the appropriate time although that
every IRQ is received by linux correctly, the myprocess->counter is
initialized to a very high value (in each period) and
current->need_resched is set to 1.

6) I don't want to use PSC.


I believe that there is somekind of race conditions during the
bottom halves or something else that i haven't though. Your help would be
very valuable, though this might not be a strictly RT linux question.

TIA
[email protected]



2000-11-27 18:31:47

by Roger Larsson

[permalink] [raw]
Subject: Re: RTlinux & Linux Question

On Monday 27 November 2000 02:36, Mastoras wrote:
> Hello,
>
> I'm trying to use RTlinux to make a unix process wakeup
> periodicaly, in terms of "real time".

Have I understood correctly - you try to use a RTLinux process to get a
finer grained periodical wakeup than linux standard 10 ms?

>
> 1) the unix process uses 2 system calls, one to make it self periodic, and
> one to suspend its self until the next period.
>
> 2) The system call that makes the unix process periodic, creates a Rtlinux
> thread, which is periodic with the same period.
>
> 3) The periodic RT linux thread, sets a flag & sends fakes IRQ0 to linux,
> in order to force its scheduling as soon as possible and then suspends it
> self. (i know that this advances time, but this is not the question right
> now).
>
> 4) The unix process wakeups perfectely when there is no disk activity, but
> when there is some disk activity ("find /" and/or "updatedb") or the
> period is too small (300us) i noticed that sometimes it loses one or two
> periods. This is very rare, i mean 14 loses in 5000 executions at 5ms
> period.
>
> 5) The unix process isn't scheduled the appropriate time although that
> every IRQ is received by linux correctly, the myprocess->counter is
> initialized to a very high value (in each period) and
> current->need_resched is set to 1.
>

You have been hit by the kernel latency, see
http://www.gardena.net/benno/linux/audio

(There are patches)

> 6) I don't want to use PSC.

All attempts to guarantee wake up of a linux process within any
time frame will fail.
Applying a low latency kernel patch will help - good enough for many
applications, but no guarantees...

To get guarantees you need to do your stuff in a RTLinux thread.
(and why not, you are already using it?)


/RogerL

--
Home page:
http://www.norran.net/nra02596/