On Fri, 2004-12-10 at 11:05, Andre Tousch wrote:
> Hi,
>
> I'm currently using an RTOS with Linux/Adeos on ARM. The original
> behaviour of the RTOS interrupt handler is:
>
> - Lock interrupts
> - Call high-level interrupt handler
> - Unlock interrupts
> - Schedule()
>
> Adeos behaviour on sync_stage is:
> - Stall domain
> - Call interrupt handler
> - Unstall Domain
>
> If I want to imitate the original RTOS behaviour, I have to schedule
> (RTOS scheduler) at end of interrupt.
> I cannot do that in this domain's interrupt handler, since it would
> Schedule() with domain stalled, and thus the domain would not receive
> the interrupts until it gives control back to Adeos by suspending itself.
> So the only way I've found to do that was to had a hook in Adeos which
> would be called at sync_stage, just after interrupt handler call.
> Thus the modified Adeos behaviour on sync_stage is:
>
> - Stall domain
> - Call interrupt handler
> - Unstall Domain
> - Call EndOfInterrupt Handler.
>
> Now I have exactly the behaviour expected from my RTOS.
>
> My question is, was there already a way to obtain this behaviour in Adeos?
>
In short, the answer is: you don't need to put any hooks.
Your rtos_schedule() routine is expected to reinstate the interrupt mask
of the resumed thread, after having saved it on entry as it was
scheduled out, thus overriding the current setting inherited by your
interrupt handler. Unless your thread called rtos_schedule() with
interrupts off, the resumption will thus unstall your domain's stage as
a side-effect. Even in the former case (i.e. called with interrupts
off), the resuming thread is expected to unstall the pipeline at some
point in time, or at the very least schedule out asap if it happens to
always run interrupts off.
i.e.
void rtos_schedule (void)
{
unsigned long flags;
/* Entering with interrupts on */
flags = adeos_test_and_stall_pipeline_from(&your_rt_domain);
/* Now running interrupt-free for performing critical stuff involved
by switching contexts */
... pick next thread and switch context...
adeos_restore_pipeline_from(&your_rt_domain,flags);
/* Exiting with interrupts on */
}
If rtos_schedule() leads to a no-op because no thread switch has taken
place, then your IRQ handler will return to __adeos_sync_stage() which
will in turn unlock the stage.
You can find a complete illustration of this in the RTAI implementation
btw.
> Best regards,
> André
>
> _______________________________________________
> Adeos-main mailing list
> [email protected]
> https://mail.gna.org/listinfo/adeos-main
--
Philippe.