On 2007-11-14, Adam Dunkels <[email protected]> wrote:
> Grant Edwards wrote:
>> On 2007-11-14, Grant Edwards <[email protected]> wrote:
>> 
>>> Is anybody aware of a lightweight coroutine implementation for
>>> mspgcc?  The yield operation would need to be implemented
>>> without disabling interrupts...
>> 
>> Protothreads looks promising:
>> 
>>  http://www.sics.se/~adam/pt/
>
> Yes, protothreads do not require any interrupt-disabling code
> (or any other low-level code for that matter - no assembler,
> no stack manipulation, etc - protothreads are pure C).

I guess I shouldn't be surprised that Adam reads this group
considering the original protothreads paper talked about
low-power wireless sensor nodes. :)

I see that the gcc "pointers to labels" implementation is what
is used by default (which removes the restriction on using
switch() statements in a protothread).

> The memory overhead is very low: only two bytes per
> protothread. Beware, however, that because protothreads are
> stackless, local variables are not stored across a blocking
> wait. Either use static local variables or pass around a state
> struct like event-driven programming.

Yup.  That'll take a little getting used to, but hopefully gcc
will warn me if I forget.  In practice very, very few of the
tasks I write ever need to be re-entrant, so static locals for
persistent stuff are are fine.

> The overhead or protothreads compared to an explicit
> switch()-based state machine is a few cycles so protothreads
> can even be used in time-critical code such as interrupts [1].
> We're using them in Contiki [2] for a bunch of different
> purposes ranging from low-level radio framing protocol parsers
> (inside an interrupt handler) to the high-level process
> structure of Contiki.

I think it's going to fit my application very well.  I've got
I've also got a fairly minimal amount of RAM to play with and
some low-level interrupt-driven stuff that runs in the
background which can't tolerate any extra interrupt latency at
all.  IOW: no disabling interrupts and no multiple stacks. But,
I've got a couple different independent "threads" that need to
run in the foreground using some sort of cooperative
multitasking, and making them all into explicit state-machines
would be messy.  They'll be much easier to write as implicit
state-machines using protthreads.

-- 
Grant Edwards                   grante             Yow! My CODE of ETHICS
                                  at               is vacationing at famed
                               visi.com            SCHROON LAKE in upstate
                                                   New York!!


Reply via email to