On Mon, 2005-02-14 at 18:11, [EMAIL PROTECTED] wrote:
> On Mon, 14 Feb 2005, Michael Neuhauser wrote:
> 
> > static void rtai_irq_trampoline(unsigned irq)
> > {
> >     if (rtai_realtime_irq[irq].handler)
> >         rtai_realtime_irq[irq].handler(irq, rtai_realtime_irq[irq].cookie);
> >     else
> >         adeos_propagate_irq(irq);
> > }
> >
> > Only active real-time irqs are handled by RTAI, the rest is deferred to
> > Adeos. But Adeos is responsible for interrupt queuing and dispatching
> > the whole time!
> 
> Aha, so, it is like
> 
> Hardware -> RTAI -> ADEOS -> Linux

Sorry, I was not clear, the key in my statement is:
        Adeos is responsible for interrupt queuing and dispatching the
        whole time!

> Rather than
>                  RTAI   Linux
>                  ^  |    ^  |
> Hardware -> ADEOS _|  |____|  |__ ...
> 
> which I thought was the case.

This is more correct than the one above.

I think the piece missing in your puzzle is __adeos_handle_irq(). This
function is a called by the irq-decoding assembler code instead of
asm_do_IRQ() and enters the irq into the interrupt pipeline(s) (and
delivers the irq if the pipeline is not stalled):

Hardware -> Adeos
             irq --> pipeline_RTAI -*-> pipeline_Linux
                         |                    |
                         v                    v
                       RTAI                 Linux

The adeos_propagate_irq() call in rtai_irq_trampoline() only allows the
irq to cross the "*" marker into the Linux pipeline.


Mike
-- 
Dr. Michael Neuhauser                phone: +43 1 789 08 49 - 30
Firmix Software GmbH                   fax: +43 1 789 08 49 - 55
Vienna/Austria/Europe                      email: [EMAIL PROTECTED]
Embedded Linux Development and Services    http://www.firmix.at/


Reply via email to