ROSSIER Daniel wrote:
 > >-----Original Message-----
 > >From: [EMAIL PROTECTED]
 > [mailto:[EMAIL PROTECTED]
 > >On Behalf Of MEYLAN Jean-philippe
 > >Sent: mercredi 31 octobre 2007 11:46
 > >To: [email protected]
 > >Subject: [Xenomai-help] task rate control with alarm and semaphore
 > >
 > >Hello,
 > >
 > >I'm working on the creation of a Xenomai target for Mathwork's
 > >Real Time Workshop. In order to achieve this, I would like to
 > >control the execution rate of a task with a semaphore periodically
 > >released by an alarm handler. The tasks does nothing else but waiting
 > >(in a loop) on the semaphore. If the task can immediately take
 > >the sempahore, it means that the rate is too fast for it because
 > >the semaphore has been released before the end of its current
 > iteration.
 > >
 > >My problem is that I cannot decrease the alarm period under 40us
 > >without facing this situation. I cannot figure what is the cause of
 > >all that overhead (maybe it comes from the rt_alarm_wait call ?). I
 > >have tried to use event flags instead of semaphores but I get the
 > >same results.
 > >
 > >Do you have any idea ?
 > >
 > >Here is the code of the main task and the alarm handler:
 > >
 > >void tBaseRate(void * cookie)
 > >{
 > >  while (1) {
 > >    if (rt_sem_p(&rtClockSem, TM_NONBLOCK) == 0) {
 > >      printf("Rate for BaseRate task too fast.\n");
 > >    } else {
 > >      rt_sem_p(&rtClockSem, TM_INFINITE);
 > >    }
 > >}
 > >
 > >void clockHandler(void * cookie)
 > >{
 > >  int status;
 > >  while (1) {
 > >    status = rt_alarm_wait(&clockDesc);
 > >    if (!status) {
 > >      status = rt_sem_v(&rtClockSem);
 > >      if (status)
 > >        printf ("Semaphore error : %d\n", status);
 > >    } else
 > >      printf ("Alarm error: %d\n", status);
 > >  }
 > >}
 > 
 > This example is very interesting. To make sense, the semaphore must be
 > initialized to 0 so that
 > the first invokation to rt_sem_p() in tBaseRate will suspend the task.
 > But if the message
 > "Rate for BaseRate task too fast" is displayed the next loop, it means
 > that the time elapsed between
 > the alarm and the next rt_sem_p() is more than 40us. Weird. Having a IRQ
 > latency of about 5us, it means
 > that the nucleus spend 35us to handle the switch between the alarm and
 > the task itself.

The interrupt latency is one thing, here you have two context switches
after the interrupt, which basically means that the latency is at least
twice the _scheduling_ latency.

-- 


                                            Gilles Chanteperdrix.

_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to