Ulrich Schwab wrote: > why not checking for irq origin like this: > int my_isr_handler (xnintr_t *irq) > { > if ( ! test_my_card_for_irq_origin ) > return XN_ISR_NONE | XN_ISR_PROPAGATE; > ... /* handling */ > return XN_ISR_HANDLED; > } > > this way XN_ISR_PROPAGATE is never returned in the not-shared case.
I think this idea needs an answer; the answer is no: it will not work. Because the IRQ will remain masked until Linux handles it, which basically means that the RT irq will wait for non-RT activity, you loose real-time response. The only approach that works is, detailing a bit more what Jan suggested, assuming that driver1 is RT and driver2 is non RT: int driver2_nrt_irq_pending; int driver2_rt_isr_handler(xnintr_t *irq) { if (!test_driver2_hard_irq_pending()) return XN_ISR_NONE; clear_driver2_hard_irq(); driver2_nrt_irq_pending = 1; return XN_ISR_HANDLED | XN_ISR_PROPAGATE; } int driver1_rt_isr_handler(xnintr_t *irq) { if (!test_driver1_irq_pending()) return XN_ISR_NONE; /* driver1 handling */ return XN_ISR_HANDLED; } int driver2_nrt_isr_handler(int irq, void *dev_id) { #if 0 /* The old code checking and clearing hardware irqs. */ if (!test_drive2_hard_irq_pending()) return IRQ_NONE; clear_drive2_hard_irq(); #else /* Replaced by this code. */ if (!driver2_nrt_irq_pending) return IRQ_NONE; driver2_nrt_irq_pending = 0; #endif /* driver2 irq handling. */ return IRQ_HANDLED; } -- Gilles. _______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core