[squeak-dev] Re: Delay time question
Andreas Raab
andreas.raab at gmx.de
Thu Feb 28 08:18:40 UTC 2008
Robert F. Scheer wrote:
> Picture 5 serial lines. Each has a packet of a few to a few dozen bytes
> arriving every 20ms although they are not synchronous. The data arrives
> on time within a few microseconds every cycle and it must be captured.
>
> I was trying to use delays of around 15ms to prevent the Squeak i/o
> processes from continuously tying up compute cycles trying to read the
> serial lines when no data was expected. Read a packet, delay 15ms, then
> go into a tighter loop trying every 1ms until the packet was read.
>
> Now, I know this is a bad scheme. Even a 1ms programmed delay could
> become longer than 20ms sometimes. So let's get rid of all programmed
> delays inside the serial i/o loops.
Ah. Now we are talking. What you want is the ability for a serial port
to issue an interrupt / signal a semaphore so that your waiting process
gets woken up when something happens. The way to do this is by fixing
the (very, very naive) serial port primitives to add something that
allows you to signal a semaphore upon data availability. There are
examples for this kind of thing in other plugins (like the socket or
async file plugin).
Also, I vaguely remember that John had built a better serial port plugin
(don't remember where I saw this but I'm sure he'll chime in) which may
very well support this out of the box.
> I probably don't understand the primitive serial methods well enough.
> They seem not to block while awaiting input so that requires
> continuously looping to read. Is there a blocking method?
There isn't. Since Squeak doesn't use native threads internally (instead
it uses so-called "green threads") a blocking read would block the
entire VM and completely defeat the purpose of a blocking read. That's
why all such primitives are designed to simply signal a semaphore so
that the process in squeak just sits there doing something like:
dataArrived := Semaphore new.
self registerSemaphoreForSignallingData: dataArrived.
[true] whileTrue:[
dataArrived wait.
self processData.
].
etc.
Cheers,
- Andreas
More information about the Squeak-dev
mailing list
|