> On 30/03/2022 15:19, gabriel.moy...@dlr.de wrote:
> >>> Ok, it seems the pps_event() could be called by interrupt service
> >>> routines. In this case, you cannot use a mutex and condition variables.
> >>> You have to use a thread queue directly. Use the thread queue ISR
> >>> lock for mutual exclusion. Use _Thread_queue_Enqueue() to emulate
> >>> sleep() and
> >>> _Thread_queue_Flush_critical() to emulate wakeup(). Check all
> >>> critical sections that they can be protected by an ISR lock (no blocking 
> >>> calls and short).
> >> Is this even so if pps_event() calls signal or broadcast? Because 
> >> pps_fetch() is the only function that is waiting (and locking a
> mutex).
> > Do you mean something like this?
> >
> [...]
> >
> > Unfortunately something should be missing because it doesn't work.
> 
> In cpukit/score/src/futex.c you have a working example.
> 
> You would have to replace the mutex with the thread queue lock. I had a look 
> at some FreeBSD drivers which use this stuff and it
> would not be possible to support them with this approach. You could move the
> 
>                       if (abi_aware(pps, 1) && pps->driver_mtx != NULL) {
>                               if (pps->flags & PPSFLAG_MTX_SPIN) {
>                                       err = msleep_spin(pps, pps->driver_mtx,
>                                           "ppsfch", timo);
>                               } else {
>                                       err = msleep(pps, pps->driver_mtx, 
> PCATCH,
>                                           "ppsfch", timo);
>                               }
>                       } else {
>                               err = tsleep(pps, PCATCH, "ppsfch", timo);
>                       }
> 
> and
> 
>       /* Wakeup anyone sleeping in pps_fetch().  */
>       wakeup(pps);
> 
> blocks into RTEMS-specific sleep/wakeup callouts in struct pps_state.
>

Just reading this email a second time, do you mean stop trying the thread queue 
approach and use another RTEMS-specific solution for waking up tasks which wait 
in pps_fetch()? For example use RTEMS signals or events?
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to